嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ l. y8 ^8 Q. ^! t4 `核心板2:DDR2 256M Byte   NAND FLASH 8G bit: E- \& A2 A" E1 e3 D3 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 Z  L% X/ Y9 o' n, v
* t/ w/ X- \9 C9 l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! u3 S" I% ^; P7 _  a1 q+ [5 i6 m

' c: Y7 L3 D: j5 O' r2 x. u
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:$ X  E# a$ o9 i- Q, C' X
/*4 G! Z; ?$ x5 ^5 ^4 C) }
* Check memory range for valid RAM. A simple memory test determines
" H( ]5 @1 z* s" ~/ X5 i/ P* the actually available RAM size between addresses `base' and
) b( C+ f4 ~* l3 Y* `base + maxsize'.
. r6 ~, O5 p) e" h" w5 n*/
& w9 r) c, R' ?9 B; U. G- Dlong get_ram_size(long *base, long maxsize)
8 ^2 ~  V" D& @: R$ C" _6 C{
1 R) e6 ]" {; k* ]        volatile long *addr;" q1 E* K4 U& V
        long           save[32];: Z2 m* h& {0 a
        long           cnt;, p0 e! a6 F8 n  ?  h0 k2 X
        long           val;% Q# {/ v4 k7 |* J6 |/ I
        long           size;
" u. M) A& _7 g+ _8 j, q        int            i = 0;
; z9 U3 I0 h% ^- O/ |" P* y& S( Y3 o1 g+ v6 F  m2 ~: h/ a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: U4 @+ `; ]9 U# w1 `                addr = base + cnt;        /* pointer arith! */# ~, b8 n7 d. q. P
                sync ();
* D% ]1 q& u: q5 p                save[i++] = *addr;* n& ?# U" B3 i% ~* v" I
                sync ();
6 w2 K; I* T8 j7 J1 {  I                *addr = ~cnt;/ }) F7 I* W  j
        }
2 [9 X- [  D0 x; W2 b9 J% w  ~% E: q' ~" R$ E
        addr = base;
7 j. y, I) J0 S- w7 |. }) B, N        sync ();* X- q% \* p9 x8 {4 I2 t
        save = *addr;9 T! E3 ~. j9 p
        sync ();0 K" [+ ?- i' Z$ n) A6 H: p
        *addr = 0;6 I) w' `/ ?' p' ~0 h1 \. `

1 X- l! {' Z/ ~" s) Y        sync ();; C5 b  Y$ t" j$ b; U: [1 _
        if ((val = *addr) != 0) {6 R) E% Z6 u. J5 o9 F- e' G
                /* Restore the original data before leaving the function.
& P( X( I7 H8 H) V0 |( ^                 */
! @' H' V# L9 a' \4 Z5 C8 g" {                sync ();
" X9 O5 T1 s' z7 _$ e/ n! B& h" {                *addr = save;
* b: {+ o- u  y. S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! [+ [; U) I" D+ L                        addr  = base + cnt;
7 Z6 o$ j9 G3 v2 v5 X2 ^3 |                        sync ();
7 L3 j/ N8 H- R" r1 d$ k9 T: S                        *addr = save[--i];8 E* J; S. I. \7 c, r- p
                }' w4 h8 ]& E, a& }. X
                return (0);
, p1 F! Z& U& j, {        }
- K+ p0 V# h/ L" ^0 W; @
; w/ y* S' q. I3 X' f- s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 h) i' I& t$ z9 V8 U# e! U# H                addr = base + cnt;        /* pointer arith! */
0 J- G! G9 l! b/ P. Z                val = *addr;; }( v  W: z" |: v6 {3 B3 A8 W
                *addr = save[--i];
) L. o) X7 P' Y& {                if (val != ~cnt) {
  F+ J1 F+ T6 g8 q$ @( c9 D9 i& M                        size = cnt * sizeof (long);
: |/ Y. Z* U$ S/ G* K# a' L" r                        /* Restore the original data before leaving the function.* I2 o4 _% o5 K1 v: |; K+ y
                         */
: v7 H3 c7 F; P! A4 ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. W5 m; S* Q; h- p: m# B7 E
                                addr  = base + cnt;
( s. w! K# q8 `0 |' \                                *addr = save[--i];
, C" {% F! G/ h# e% f- L                        }
4 x4 B9 k7 r* x4 c& O: j2 \1 v                        return (size);! i6 ~( K/ s( A8 D! ]0 n
                }3 a% D) z; p/ C2 q- h
        }
! a0 ]* z$ q  _2 l% Z3 u
$ D+ a, T2 \6 J" ~+ f' J0 I. x        return (maxsize);
3 q5 P/ z- `" I, v* J}
$ h. E! X" Z# \0 M- Zint dram_init(void)
. \9 [! K% s; ]1 k# N{, a! N: m) g: x
        /* dram_init must store complete ramsize in gd->ram_size */, S3 U$ [2 {6 D, ^) `
        gd->ram_size = get_ram_size(
6 L, \, x1 w, H+ T& ?                        (void *)CONFIG_SYS_SDRAM_BASE,3 ?. F- B5 F2 ~' \1 z4 ~$ p1 {
                        CONFIG_MAX_RAM_BANK_SIZE);6 a% f, N8 z; r; J/ M
        return 0;
: R" X8 u) p# H+ T  y; [}/ m( a7 D1 j& E2 K
: U$ d1 y. ~+ f& D! K& T
' ]9 Q6 Y5 x9 f% c( n

0 A4 v8 \! f2 c5 o
) p( r0 L. O. j9 X0 j  y4 [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' }* ^: a: @. v: Q; N1 i# ~

6 R, f' e6 v: f3 f' K! P5 f. W
* q9 Z6 F5 X" e+ K+ u: @

- a+ H9 i7 @4 `% d




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