嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* m1 d6 x& t) u$ i: D" ^
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 U7 S6 ^: x5 ~: Z3 W这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% Q: ^: T1 f* ^: o3 s; F% i" s  w& J0 `" H" i# u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& c5 c/ x  \: n( _% h0 c3 y3 \0 E, L7 W5 x8 F' N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c; q6 ?- v& T* H0 I/*
* I; p3 F- F! ^" ?* Check memory range for valid RAM. A simple memory test determines& S: B6 D. j( a) _) N/ L
* the actually available RAM size between addresses `base' and
; Y! X6 Y* u/ G, M* `base + maxsize'.4 ~- l. X! \# A" }
*/
3 y. G3 `; q9 p; Plong get_ram_size(long *base, long maxsize)
& }* Y) A2 B, U3 c# Y, ~{5 A5 s( z: M0 u, J1 s* H, ~
        volatile long *addr;4 X; K0 @1 O* z& w" \) P7 V" _
        long           save[32];
/ V6 `- g0 I8 j+ F  H/ x2 Q        long           cnt;" A" u  Z" S0 t3 i8 l# R/ c
        long           val;
( u) ^5 |% |9 b# z+ j; f4 j' L: K        long           size;9 x: M' o6 `3 h' H5 M. I+ Q  i
        int            i = 0;
( k# u+ P1 O! h7 j9 Z; \( _4 n5 n. d* h
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" ]2 ?: @- c+ \( L: u, c" W6 `
                addr = base + cnt;        /* pointer arith! */: `# S6 `9 T% E) O# B
                sync ();  X* y% L+ h; R% M
                save[i++] = *addr;" O5 O' b8 e7 V- A
                sync ();1 n: z. i7 |& Q5 n0 `+ O
                *addr = ~cnt;" ^) L( Z5 \5 b3 f2 X
        }
& R3 s; s: q( J/ p: M2 U" d% `3 z
$ ?/ o4 N$ ?3 c7 j, Y        addr = base;- z2 [* w2 M( R% F$ v
        sync ();
! T' a) d3 G! K  g' C: k        save = *addr;
( q% R5 O6 ]2 ]* D' u0 \        sync ();
# r$ ?1 i$ C' [# Q7 ]9 m- B2 @! y9 l        *addr = 0;  T# D  Z! t4 ~8 C4 G9 f% o, I7 I( K
0 W7 i  C, n6 o' M9 b
        sync ();0 a* ^% Q- k# a) b5 B1 J
        if ((val = *addr) != 0) {7 Q( g% @0 N- x) G+ d
                /* Restore the original data before leaving the function.
9 S. i6 b8 p7 J6 ]                 */
, h$ v; n3 ?. Q2 ]                sync ();
% n# g2 K5 b" \9 b" H, s+ f/ |  Y                *addr = save;, T8 k0 U+ C( }  U
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# x5 e" i! N  b. \& h; S+ [9 r8 y                        addr  = base + cnt;
1 |' I7 [0 I2 a/ {" }: [                        sync ();
) U8 i; F& K7 _9 l- U                        *addr = save[--i];3 J, s9 k0 u; @, P2 I  ]) M' l
                }
% m* e+ t# g5 |$ T                return (0);) A/ i2 u2 C  @" k9 Y* B
        }
, e: x, @- x& X6 W2 Y
) p) A0 k% j0 g6 T, P& W% T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# |! k3 g! U" m: A
                addr = base + cnt;        /* pointer arith! */
1 |7 a- H. c  V$ {+ L- O8 I                val = *addr;
) ^& n! b3 E- W" ~2 q# R4 {9 Q, b                *addr = save[--i];
# J% C2 u* P9 P. t* p5 J                if (val != ~cnt) {
. ^/ R5 u0 P& G                        size = cnt * sizeof (long);# J: t4 f* S( Q- h# Q' {& s6 u
                        /* Restore the original data before leaving the function.
0 A5 a. Q8 R) Q& Z: E                         */
+ h: C" U& q  J9 j0 i9 n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 S- [1 z  g( c                                addr  = base + cnt;7 e; N/ Z- j0 L0 h: _. @  J) I, w* J
                                *addr = save[--i];
. b- A% R( x  A* X% Z                        }6 Y  v1 O" o( D7 o- M; R5 n3 X3 i
                        return (size);
% n, u1 {8 r& |" W2 e8 X1 A                }
, c; g. c& w2 ]+ i. Z- d, B        }+ p5 `, X$ O+ u. w

3 J" O, k- T8 b% B        return (maxsize);
. R1 ~2 Z+ X/ p% V4 n. j}
0 O- {& [7 b: ?int dram_init(void)0 k8 C  m/ F+ l8 \7 k
{
- [0 r4 W+ s- ]+ Z3 Q        /* dram_init must store complete ramsize in gd->ram_size */+ Z# K: s) B! m6 e+ s5 Y0 O. _
        gd->ram_size = get_ram_size(2 D8 c! x/ [7 j$ Y
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 ~$ ^9 [' |9 J6 |4 R+ g4 ^" n* P                        CONFIG_MAX_RAM_BANK_SIZE);8 K2 U7 G" W4 D& r5 d1 A, R& H
        return 0;" _6 p9 L& _4 N7 h! E6 {
}
" q7 z5 N. ?7 ]: N8 r8 Y5 x! h+ d5 _2 I
$ |# x0 p( r' [0 H; I

7 @' [& ]  x0 p
! t& S9 w: o3 p2 `5 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- [! s& g% W; ?& n$ x- {  g: l
0 C9 R- u0 Z( w. A% t. c
* M& ]' R5 ]8 }) [4 L: `, @- [
& P: _9 a( \; Y8 O' C/ @7 b" T





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