嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ ?1 f) ^0 c5 R! D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 t/ N9 f5 L$ M6 S0 n# X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' {% c0 b+ N5 @" Y
% Y. U$ ~& B$ p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* M0 \: q9 G# d) p

$ _8 a! l6 [, J
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% [2 i* B' W9 G" i8 D' H' x  Z
/*  a6 h- j8 m, Y1 \. P* _) A
* Check memory range for valid RAM. A simple memory test determines
5 u, `9 e- T5 `9 n# ]. n* the actually available RAM size between addresses `base' and
5 d6 m; q6 O) ^$ k* `base + maxsize'.
, y+ U4 i; Z4 F& g) O*/- z: v: q* o5 |& L9 l# j" B. x1 J% D
long get_ram_size(long *base, long maxsize). Y6 t! W: C7 {
{# h  w! x. L: K8 Z
        volatile long *addr;5 X0 y! V. r- f4 J/ ]5 J' S0 c: C
        long           save[32];- ~' p1 s- N9 ?8 }; v
        long           cnt;
6 b& ~% B6 S! U0 L5 j" U        long           val;
* i% z, K# o- r( m3 h; Q0 F        long           size;% t4 K; ^% c! A' D
        int            i = 0;
  z. v6 Y, p/ |5 L8 \0 o$ [
: O% G: r  |! [6 D8 ^% @+ O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! @& J" q0 @5 B% r' i
                addr = base + cnt;        /* pointer arith! */+ v9 P7 P6 G3 v7 p
                sync ();
5 T% r9 a- V: m' o2 p                save[i++] = *addr;
7 ]4 u9 n8 q+ m                sync ();6 \% ^* T  j5 z8 `  N
                *addr = ~cnt;
+ J5 ?( M6 f0 c# _        }
$ n( A+ e( Y- j
9 R% H3 F; v4 w. L' O9 L+ N" T        addr = base;. t! d3 D$ c3 O4 R4 ]0 ]
        sync ();
6 _$ n- P2 C# }        save = *addr;
1 v: U* _9 s4 K6 |/ W        sync ();
% n8 ?( v/ @+ {# B" n$ [        *addr = 0;
; g7 y6 a+ x2 J; F# l) |
3 A- @+ x# B3 X% ^% @9 D        sync ();9 m* k: @+ W" F& G3 P/ H% d9 N
        if ((val = *addr) != 0) {! s- f' j6 s) l- c  I4 D( P
                /* Restore the original data before leaving the function./ V3 R; x$ a0 X, U0 J  x, Y" ~
                 */. s+ Y% P3 G" d
                sync ();
* U: N% Q! c7 V. m/ V, a6 h5 C                *addr = save;) k: t7 n9 }" r* ?& {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) |5 W1 R$ O$ s, J' b
                        addr  = base + cnt;
8 ]( M) g! g4 w4 v                        sync ();
0 Y  m0 r* G: v1 {- H                        *addr = save[--i];
1 e6 g; q) q6 Y% m% I, F; D                }  g+ B2 y9 e: {  l
                return (0);) s4 ^5 d  R! X7 E2 l  p
        }) v/ _* c) ]! Q
4 ]2 \7 J/ ?5 @1 i  R7 p, Y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! K1 q( e" \8 P) j$ o  M8 f' n                addr = base + cnt;        /* pointer arith! */
" S; n) c6 J4 e( b& y/ A                val = *addr;
# J4 W1 S; C/ c9 N  s                *addr = save[--i];: Z: M$ s4 ?; H6 d) ]. x; a3 _2 {! Y
                if (val != ~cnt) {2 b+ i8 ^- V5 z6 K$ L
                        size = cnt * sizeof (long);
% R2 ?$ {9 ?+ f4 f3 g$ n                        /* Restore the original data before leaving the function.
9 G/ K6 d% b8 N+ [/ V9 P                         */
- Q, B+ e/ L1 b: p& c, y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 `  `; n1 e  O
                                addr  = base + cnt;
1 x  B) m- x) d) L  O# F+ L                                *addr = save[--i];
( P/ G/ i( u% M- ?                        }
# i3 R; v; Z( ^% Z6 }1 f                        return (size);
5 W1 c, S$ [7 |/ X8 h# X; s                }2 G1 L, R$ B2 _1 O8 C9 j7 I
        }1 |1 v7 w% d) l

3 z/ s+ {  F) q5 L        return (maxsize);% j) ^: C, D4 ?4 G
}3 ?# H: n/ `3 M/ u/ Z9 A
int dram_init(void)6 c/ I  K0 T3 T# |
{
6 b  t; V: l# ]        /* dram_init must store complete ramsize in gd->ram_size */& q+ A6 ^: o' y. I  H  |0 p7 C
        gd->ram_size = get_ram_size(2 O1 G' I2 f+ j: {! ^  h" q
                        (void *)CONFIG_SYS_SDRAM_BASE,; `9 W  v( ]/ a2 Y+ y- I9 j
                        CONFIG_MAX_RAM_BANK_SIZE);
/ Q, a/ [  h6 N* v7 [* W. b, o1 A        return 0;4 b! W2 }2 A0 y$ t8 v  `3 K4 U
}
6 s9 j# ^# d7 J; U& [$ k
+ Q6 A; S7 B4 O0 @. l
3 T* a" q2 r: E9 g# x
: a% w7 U% X9 E$ _8 M* h: h9 V- ~/ {8 Y2 L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 `# |! |' G  I; u) w( ?
; d0 A" b6 K. z0 l0 k  r
! a: s+ T0 B5 h" o
5 g: N( y( h; q2 R4 e





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