嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; s; h: E" N  j
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! t/ l) C1 z+ p( c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" h$ |5 M) I# ]% g3 d
* X3 @( ?4 S+ a0 _% C  f3 Y! o+ R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; y. V2 E' P( A; Z* d: g
8 i7 T  P9 k2 ?0 g* |& a

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* M: b; i! Y7 y4 r" n; o# n9 [" y- g
/*( G; x% h1 X9 R( V( u1 u
* Check memory range for valid RAM. A simple memory test determines1 C) n) `+ y. Z/ t, g1 ~
* the actually available RAM size between addresses `base' and
5 \* ?. q2 K4 s2 o* `base + maxsize'.
. u7 p2 c2 R% |7 }1 N' B*// d& G, t/ a& b# t3 T
long get_ram_size(long *base, long maxsize)( L+ b4 W! b, Y' O6 Y- v1 w
{4 {$ E6 P, e1 Y2 P, }
        volatile long *addr;( D9 C6 Y. q4 {3 W, D8 @# l% [
        long           save[32];4 y) k/ d# `  ~
        long           cnt;
$ w# \* \/ t1 Y        long           val;
+ t8 ^5 [, K& d0 n        long           size;
* J) b" x+ _& l6 K1 w3 V2 a        int            i = 0;8 q, R, u" W) K
3 K; X7 u5 ?! n6 D' g
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" U1 f7 V1 f5 L5 B
                addr = base + cnt;        /* pointer arith! */' ]+ u% t3 ^! o) F
                sync ();+ z1 l5 ]$ a/ {% Q2 O( K
                save[i++] = *addr;
9 ?8 y6 `3 g! e) t                sync ();
2 d6 `6 h5 c0 s4 n; T& m                *addr = ~cnt;# b' y+ h/ N, z' d
        }
7 M+ s5 g! A' _
1 k5 g4 X0 A, A8 ^: G6 p        addr = base;
# @: H) E1 G! d$ B        sync ();
% o9 g( K; `6 |: N        save = *addr;
* Q+ G* T8 a; D& U        sync ();
) e9 Y4 U' K! D' |" p  z        *addr = 0;# |5 [" v" d4 ?$ C) S: ?. M
  U1 C) g& I0 F6 p# z
        sync ();
' ?8 ?0 g1 n9 d        if ((val = *addr) != 0) {" x1 o0 E. Z, I. e
                /* Restore the original data before leaving the function.1 D  u6 C$ X5 p
                 */0 J& D- a0 M4 \  v" Q7 x* J; C
                sync ();
& S- w- P' h8 f+ `6 L                *addr = save;0 B3 f. G1 L; L$ N  q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- z) L% v1 _5 b5 t4 [! D                        addr  = base + cnt;* O. }  ?  f+ q, `# T
                        sync ();
7 j* o! L* v6 d7 A' F                        *addr = save[--i];
% l' C* r; ^  |7 o                }; e/ p8 U9 z$ @0 o9 N: K* T' e) U( V
                return (0);
! P# j6 x) _7 h! \3 m: Z5 g        }
0 r* U5 d% I2 Y, {# W4 Y
$ Z& Z: D7 x- g: j, ^& K' p/ `        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- I; v$ t4 \/ C: E) R
                addr = base + cnt;        /* pointer arith! */
9 T+ v# K8 m& O' r! }; I: |0 L+ P                val = *addr;+ N/ I# s( L6 k. p# q
                *addr = save[--i];
  Q" o; N9 h7 N( C( Z                if (val != ~cnt) {5 a! X% o8 {& b' v
                        size = cnt * sizeof (long);2 W8 h6 g  Z& c8 Z9 H9 y
                        /* Restore the original data before leaving the function.( T$ h, S/ W0 g$ C4 g
                         */) }9 b" |7 s/ }9 T% V- p, q7 |. }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, A4 M$ c5 z7 P% H2 H: @
                                addr  = base + cnt;8 a, f: @* p2 v( _" O
                                *addr = save[--i];  a! h* d* O# M, G( i
                        }
+ o" F) q* r/ B: T5 G. ?                        return (size);) G3 Y8 p) k$ `7 t, }* {
                }
, _0 T' t# b+ r        }
& k6 w1 h# d( A# ~
" m) V/ K. m( E, ^7 \3 J4 u, l        return (maxsize);( g$ p% B6 }  r) n7 E4 }% P' n4 Z+ D
}- N- ?3 D: F, J1 x& x+ V; C3 P
int dram_init(void)
  T# C' ]+ v" @4 T. D0 M1 @{% T' l  T, o8 R: w0 c/ W
        /* dram_init must store complete ramsize in gd->ram_size */2 I  u) d+ \- i! L0 ?
        gd->ram_size = get_ram_size(
1 g- W- d8 H. Q& @7 g7 r                        (void *)CONFIG_SYS_SDRAM_BASE,
' ]9 w* {7 [" j# W' M                        CONFIG_MAX_RAM_BANK_SIZE);# P" i" P. J  J8 ]" z
        return 0;  x, V, T  D: _( e& n, J7 |1 K
}
- _+ G. e1 r( t# }* E; m: s" }, O' i" w2 C
5 y4 N% O) w$ B9 P6 ?

, r2 H# B5 k( u. o
7 D; H! |, v7 P) ?9 mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% A: t  f7 J* r3 r4 \# r: D+ m1 D, c& P* m0 U% k
# k# g. S  T; g+ m' |! O
& R9 ^7 o3 Z! c/ V* N1 n9 s0 ~





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