嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% p0 V3 @) t5 j$ J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' i9 \* Z, _' L$ \7 \5 Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, I2 n8 [: B0 C# R4 J) x5 U5 ]( A; b5 Z& w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 N. \3 f& E5 c& J6 L1 Y; I7 q0 X$ P. I  W! r: w6 m. f" w( ?

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 I! g* N' K+ d( A0 J& |7 z" p/*
! a8 `# O8 D/ Z3 E$ n& l8 _0 @* _+ M6 o* Check memory range for valid RAM. A simple memory test determines
/ t. K3 [2 g' c1 p0 q* M1 U$ O* the actually available RAM size between addresses `base' and
+ Q' [: A+ ~0 Y; v8 K* `base + maxsize'.
) ]/ W! O; i- B2 G*/
  K, V8 h0 R2 y' d. xlong get_ram_size(long *base, long maxsize)% b/ H. E+ [3 M; ]/ z& i: N& d
{
8 w, l9 a2 j) {6 P9 c1 n: L        volatile long *addr;
5 O" a) N- d( x' T; C0 Q        long           save[32];
1 }% l6 h6 }" Z( @% F$ G        long           cnt;
- k0 m# }3 k, z$ }+ h6 ?4 P% u        long           val;$ }& y! Z7 p/ Z- r+ G% \) x
        long           size;/ k7 s9 ?$ H' K- g
        int            i = 0;
' z3 S3 D5 z( w7 U2 {) S
, U, h( L  |* ^" i5 o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ W" h4 j* b! A* F5 C4 T' t' J                addr = base + cnt;        /* pointer arith! */
" K" Y# Q7 f" i                sync ();
( j+ d  t1 K, d* F" A* D2 Q: G                save[i++] = *addr;2 |% l" \- e/ s& z. W& X- ?
                sync ();
& n) R  d$ P# ^  r4 J                *addr = ~cnt;
( h. G9 z2 y0 I# C) Z        }
8 h2 @3 D: l3 n  Q8 k9 x
% z) L- O3 h' v5 u2 I' W        addr = base;
; M2 N0 I4 H) G5 ?: q6 b        sync ();
3 l( M/ u1 F; @; Z9 R7 T, |: w        save = *addr;% P0 Q  Y, \& ~1 Z  {+ W. N
        sync ();
5 x+ f+ }6 ^0 |; O5 x1 C        *addr = 0;
0 I) C+ o+ k3 x8 Z+ s; h# T4 y* E8 X, E7 G/ u. G
        sync ();1 ^6 m$ X; ?* {5 [* w6 L+ p
        if ((val = *addr) != 0) {6 P" P2 s9 E, A* i7 c) b
                /* Restore the original data before leaving the function.; `7 s. {( U2 }! I5 s3 T
                 */# [4 b9 s+ R3 F- G) O, r
                sync ();$ d  \1 y, E& C6 _$ ^" P3 x
                *addr = save;
6 w: g' ^0 r$ h- Q/ Z% c9 Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ l' d3 s: {) v: Z9 c" d  I2 ^                        addr  = base + cnt;6 U$ |3 X+ H6 c9 i
                        sync ();9 ~  }- n8 C* k6 a& H
                        *addr = save[--i];) L) j+ K7 V, p0 j/ u
                }2 I/ F8 u  T! d5 x  P
                return (0);
( E9 @" O, I. D1 y) d/ ]        }
( {. c5 y5 P( b9 Z2 S' v9 g3 t4 ~; F7 T  y6 c8 z3 C" L. h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 O/ ]* _* X5 L  z* k1 O
                addr = base + cnt;        /* pointer arith! */+ T5 [1 l1 s7 w5 Q
                val = *addr;: d* Y& r! P$ M$ V) Q
                *addr = save[--i];" @% q! v) v" @4 ]
                if (val != ~cnt) {- D7 T2 o) R5 d$ u' [
                        size = cnt * sizeof (long);# @3 w  z( {8 i, A! a
                        /* Restore the original data before leaving the function.
: ~9 Q) ?/ a2 J                         */
3 ?9 U8 n! ~6 h) F4 e% K: J: g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 W; H" u: f2 i8 X& |& N/ c/ ^( \" U
                                addr  = base + cnt;$ J3 ?' f; Y0 }
                                *addr = save[--i];, B) s& j5 v  h( U1 _
                        }; V4 K0 I- f3 x
                        return (size);, B. k5 l/ ]' {! D1 k
                }
6 G* J# e1 j$ \& A        }
  M& @( R; }2 {: _/ Y5 \) l6 p0 `8 j# [
        return (maxsize);& N' H7 u: V; W* Q
}
3 N) s/ E8 F- E% Q+ @0 K- \* e5 Cint dram_init(void)
+ I0 j! k' X6 \9 W+ O9 N9 t  R{  l7 G% x4 X, x$ r1 `
        /* dram_init must store complete ramsize in gd->ram_size */
7 [+ Z; x6 t0 j, \1 m        gd->ram_size = get_ram_size(
4 [/ z2 ~; u5 F2 [/ r: Q! X9 K, s                        (void *)CONFIG_SYS_SDRAM_BASE,
" T) ]# V% I7 X9 x                        CONFIG_MAX_RAM_BANK_SIZE);* l+ }0 \! |( W6 e9 j/ C
        return 0;
! V$ }% V2 _/ H}) I. l1 i. `$ j: v' a
; G+ X8 X! L4 T9 a

  Q9 q; Y. p2 Z  U
5 C7 E0 q- z! i5 l
4 p! S) G+ ?0 o0 g: l6 u7 ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 N. J2 e2 x6 ]" b- L* B7 C$ C

# G; @4 f. `8 G9 I$ [7 x. T, N
9 b$ B0 m/ k$ @
. R% m- ?3 d4 Y9 @2 a/ |) O7 L$ m





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4