嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- L( N3 F4 N6 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ Z6 r6 V7 I& z/ z0 i# M" n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ z6 L# y8 l( a3 d

% Y# N5 ~8 T# V, P6 ^! v是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! W/ ?( ^; N% P/ e8 Z

/ F# x' ?3 G# Y; ?9 s8 r0 g. |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 P7 O4 V" H, d5 S9 E" n/*4 d% M( D; J% _4 E; O5 U
* Check memory range for valid RAM. A simple memory test determines
2 j' c/ m; Q! ?$ D0 O* the actually available RAM size between addresses `base' and5 ^* w4 h) K4 @! ~7 |
* `base + maxsize'.* B5 J& _2 _7 p" q7 d) ?
*/
; K0 R" {- u- v+ U1 I) }$ Dlong get_ram_size(long *base, long maxsize)
  S  q! a! |- ?% G3 Q! R{
4 X2 f' T+ M& L" A        volatile long *addr;
' V( }' k9 f% e9 @, w7 V        long           save[32];
/ u6 F8 N& F6 ~, r        long           cnt;
7 c; K0 _# }- U        long           val;. S7 o# n8 m4 z3 a# S' u
        long           size;
3 j8 L) S  C# P" _$ k5 }        int            i = 0;. X& Y1 d" N+ B; z: ?

" _4 Q" I8 y  D9 k* N: h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; U4 S  v  s& n* o                addr = base + cnt;        /* pointer arith! */5 m  X% t! x7 U
                sync ();
6 A+ `9 Z7 w, g8 f                save[i++] = *addr;/ v* m/ ~1 i. o) X2 b( f
                sync ();
! a; e9 u3 |- v* a: X9 j                *addr = ~cnt;0 b6 a4 j% F( b6 O
        }) H& A1 y( @1 q& U- y9 N6 K0 c
0 l7 _: X, ^# d$ z
        addr = base;
3 r8 K  q$ ^& q4 O! e" s) B- i  G        sync ();
' N' _- u7 ?, @2 V2 C/ x        save = *addr;
/ L, k' {- u- e+ }% {        sync ();
! g- V- ?0 N* Z2 E% x& J. U( g3 ~2 x        *addr = 0;
& a& {) Z! \- K* \9 H
; C( P8 S) g7 k5 v! [+ R0 |        sync ();1 x5 r9 W, H$ ~1 V
        if ((val = *addr) != 0) {
. z# ~) @# T7 b                /* Restore the original data before leaving the function.1 {1 c+ R5 H1 [- i% M$ a
                 */
  b: I" Y, s0 T! j9 q/ Q                sync ();
- {5 q- v  G" v) I# o7 u                *addr = save;% R* h7 K9 `. U( r1 \% a2 N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* D5 Y/ |+ s0 Z  A7 b, ~6 A                        addr  = base + cnt;
+ X0 f1 {( W/ G5 }' n  @: f                        sync ();
$ j# S% L( X( v4 O" g0 h                        *addr = save[--i];
9 ^6 R/ x6 M4 \5 Q9 w3 ]                }4 P/ D5 {3 K7 j" I
                return (0);
; ^+ L. d$ t0 e% U4 q- V2 [/ {        }
" Q! Q) N6 m  |+ k$ j
, z4 e) T5 V8 w" p# n+ y9 Y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) C( X0 b# k2 `% r7 U                addr = base + cnt;        /* pointer arith! *// L- {, S4 e' t, m: Y
                val = *addr;0 {# y" Z$ w# _' P3 y- ^
                *addr = save[--i];% j8 `# d0 E( ?4 ^
                if (val != ~cnt) {
) d" m1 [# U  |7 l0 M" Z, F+ l                        size = cnt * sizeof (long);! n/ J. `; A7 ~. b% h7 @
                        /* Restore the original data before leaving the function.
4 N, }0 ]( m6 {, T1 p! U                         */2 `" s; T& J2 [% `
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 {; k0 F: u- T8 S. b7 n
                                addr  = base + cnt;! t0 i( `$ f1 a: Z: }% _8 y& Z$ v
                                *addr = save[--i];2 L1 k3 B" V& H+ ]$ `
                        }6 W: z4 {5 Y- r2 D: `
                        return (size);) y* z5 p% h2 `, {6 |# q
                }* _5 |* H! t4 p
        }
( O) J% K6 C, D; K( k( \' ?$ G) U3 S" b; f$ T
        return (maxsize);
  {" r7 g$ E0 t' N}
" u% L( z3 N  ~: P4 [int dram_init(void)
9 F9 _* O4 f- Y7 c7 r{! S- \; Q3 n5 r+ y. I
        /* dram_init must store complete ramsize in gd->ram_size */" y8 L* U9 g9 V) u7 z
        gd->ram_size = get_ram_size(% C' j- ]" j. q/ Q1 Z, N& D
                        (void *)CONFIG_SYS_SDRAM_BASE,7 _  Z6 D* u9 u) E: z) v+ |0 d6 h
                        CONFIG_MAX_RAM_BANK_SIZE);% d/ S+ R9 T( U% S
        return 0;4 F& m, H, e& Q0 ]2 W3 ^
}) X7 C1 l8 @( ]4 A8 ?( L

8 n) y! n8 ~: y5 R1 v6 b! L; E8 E& N3 T! \( M4 @. ~* \

& n% }; e& n: C# A: y1 A+ P, u8 g
) O) O" s$ b$ Z# C  _+ wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' P) R1 v$ p7 t, c3 Z9 L
3 z8 c6 ^$ x% S+ |6 \& Z  I' r+ s
" |& {( J" L+ y9 k& r; ~, u% X, U
* C6 H* O& `* m. D6 h





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