嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 k8 G4 j; d' D. F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 u% Y1 w+ s; s, Z- v这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  {2 g0 l3 i9 T" f7 q  u" T1 I% U
1 |' F# c$ F2 t7 S5 U" x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. {5 \) T% d# a, Z/ B* x; \
5 v+ W/ _/ k9 Y: z+ y9 [; V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- s7 z/ x* Q2 m; N
/*
4 [* p! o, q: v" j5 F7 W* Check memory range for valid RAM. A simple memory test determines
$ y6 C: X4 @  x  Q% u; ]/ `. T6 ]/ Q* the actually available RAM size between addresses `base' and
/ F! H4 k! z7 d1 _# Q: c' O* `base + maxsize'.
/ r( n, n; D0 g2 G: [5 i*/
" ~; Q) z8 U! \. _* Tlong get_ram_size(long *base, long maxsize)
2 E, K" a& p4 e* Y4 ]{) G# E+ |+ @+ z8 X2 ?
        volatile long *addr;. g/ V6 a3 X! A1 L
        long           save[32];
4 @+ L% ?2 h0 z        long           cnt;! ^+ h- f& {0 i
        long           val;
6 @5 g; W4 \* D. F5 t- M* Y        long           size;* K  i' f6 q% T& {. S; o* E# q
        int            i = 0;
8 v4 t' E0 }! O8 [: |! ]
# ?% w6 W7 A6 E. ^9 h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  _$ r1 P1 ?" h- W' F, N                addr = base + cnt;        /* pointer arith! */1 a: k. |, X) H' f
                sync ();! h6 o) m6 C% K8 T) B6 h, f4 ~
                save[i++] = *addr;2 Q' s! x/ ^% ~) b
                sync ();
" i! w+ ~  _0 R" X5 N9 F" ^                *addr = ~cnt;
, W9 K7 R" L, W7 B. k0 G) O* l        }  \, I/ O% D, l; ?1 _5 s% ^, u# j; h
" |5 {8 E2 A, z2 ]; ~
        addr = base;, _' B4 e/ [) y4 a1 z! q0 x( f5 @
        sync ();
4 K+ {6 r& L0 E2 ?        save = *addr;+ W- B  _7 m  p2 q/ W1 H. ~
        sync ();6 r4 v& q$ j) d( s" M  v
        *addr = 0;
9 Y: b5 D9 Q1 F7 ~
& ]% A( \0 C% S; X1 J2 J; N        sync ();
5 m" c" u" R' M9 ~+ p2 H( K        if ((val = *addr) != 0) {
& J' t& M' Z6 k8 k( ]                /* Restore the original data before leaving the function.
' V1 a' c: v( t' X5 S% K                 *// N# p7 G2 n: D& j! l+ B
                sync ();
4 m. z3 A& N  i! X5 f: o                *addr = save;( r% }% a6 y; q" X, m% P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, s7 Y4 u3 p, O* o5 {
                        addr  = base + cnt;
. L+ h9 @( ?( x9 x! f                        sync ();
: M& A) B% U7 w/ D4 F                        *addr = save[--i];
4 ^7 ?6 X) t( o# ]& p                }5 k4 |& ?# {: E3 S
                return (0);
1 s( E9 x( B( V8 \% }        }
* i: j7 n2 N! @4 k9 Y! p  X1 C* S! r' {0 m3 }* |3 |
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: \" u# s9 w2 H: P
                addr = base + cnt;        /* pointer arith! */8 P$ |$ k: F4 |" a
                val = *addr;8 k2 s+ S1 O  [1 M" A
                *addr = save[--i];
/ e; ^. G! S1 M: y                if (val != ~cnt) {
# p" j2 P- N9 w: n' i: g2 D                        size = cnt * sizeof (long);
% y% P5 U. B* ~. \6 u) c, i                        /* Restore the original data before leaving the function.
1 e; L! u2 Z2 e# j1 y" j                         */
; U/ O, d) f) d, m! D  \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 T8 B7 g2 X& a; p
                                addr  = base + cnt;
, b, K5 N2 ^! G9 J: t                                *addr = save[--i];; m: d/ s; w% [" _% s8 F
                        }3 z# j  |2 Y2 W( o
                        return (size);6 z8 }& A0 M7 a+ I* W
                }
7 J0 [6 e. s+ R6 {        }1 j5 s& f  D  d, Z3 a

8 C8 s! j/ R; R, s- [2 n- E        return (maxsize);6 L0 v9 X! i: o7 \- x( N( ^. B
}7 L  j# P' v( c; n( a: W
int dram_init(void)( {  C4 W! _8 Z, A
{0 N- w' u% A# [& `; \8 w( t" L7 e* Y
        /* dram_init must store complete ramsize in gd->ram_size */6 {) a8 ]- ~* J, o
        gd->ram_size = get_ram_size(/ M. l- d7 L8 m+ @7 a- t
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 l; d- |- B7 W* x                        CONFIG_MAX_RAM_BANK_SIZE);
' B+ A! q% o) w# E( C        return 0;
" \: c0 o/ N8 P) e}
7 p/ ?; N$ r! b0 k
: {; q# I4 c. H8 T
. Y% D8 F; a. j3 v5 V1 J! @; p
* I7 U7 Y+ G+ D1 |4 I7 Y9 Q' B
, h, V1 ^, u/ C' W0 b6 d# \% cFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 p6 g- T+ I& [8 Z. y7 b8 _1 A
. b8 Z7 {: e7 f4 t  O; n0 |3 p4 `! }( B0 j" F
2 r- M* z' a: R





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