嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: i, O9 V4 l0 y, T核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ W: O* j, m' Q1 }+ {1 ^5 _8 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& z7 ^8 R0 @+ \4 u' x4 j& Y9 k& {# j# P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 @  @: D2 b9 @3 i# T7 g# W4 n/ R5 c) ~7 y  D# Z6 d( H. A

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 l4 Q6 I/ P: ^
/*
, K7 y8 j+ c: @0 k  ]5 S# ~* Check memory range for valid RAM. A simple memory test determines" w9 M* _8 K7 Z& Y
* the actually available RAM size between addresses `base' and4 D! |$ E2 V5 J3 y3 u1 k  E2 L; I
* `base + maxsize'.
1 M: ]2 r! ]: d! Q*/
* a; Y/ X' a( Z* b7 V, H- S% Along get_ram_size(long *base, long maxsize)5 P& N+ w( p0 r; n
{
( g1 U6 v* ^% ~# F% p8 s        volatile long *addr;
8 x" a$ ]2 N0 o* }& h        long           save[32];
3 i! u. ]' {, X) p, g* j        long           cnt;. u) y' N( h8 M
        long           val;% i/ a; O0 |- l( [
        long           size;: {! b# L, ~: ~1 e
        int            i = 0;0 w& B% P/ N. U7 |. T
5 w( n1 b" z* F% }& e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ g$ ]! T' U# H! }, h, p" u                addr = base + cnt;        /* pointer arith! */
% j+ H/ Z% X+ g- L8 W7 w8 b                sync ();: W# |3 D2 c* J# G5 E5 w
                save[i++] = *addr;
* E: A8 b5 p/ N                sync ();# L4 i" K, q7 o: l* O
                *addr = ~cnt;: j$ h: @0 W% t4 ~% {: d5 F2 J
        }
& j: \, p9 A8 C" U" h: w# C7 i: w* s' w- T: u' _& k2 i! Z
        addr = base;' `) A4 I7 `0 n( Q/ {5 p
        sync ();
% Y( g& p: u' p; `; ^9 M. e        save = *addr;
) c& q% ~3 y( n* l" m( }, C* m        sync ();, Q% ]! i- n0 }: H2 j: f
        *addr = 0;
" ]! s2 h& f6 D% L/ \. k- L! Z& Z- r
        sync ();
8 \  K& o! t* b7 F3 p2 R        if ((val = *addr) != 0) {
# g0 }: O! D3 R0 t                /* Restore the original data before leaving the function.* P6 a1 U. W5 _, j
                 */
% N8 @8 G. R$ C5 b7 D$ k/ T9 K                sync ();
) G0 d" q7 J% m5 o; R% h. @                *addr = save;
; h; S" L( m8 U* N0 C+ r. Z4 p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 I9 x# x% J! m8 i1 A. ~                        addr  = base + cnt;& ^6 ^, y6 U  o2 v" R4 D6 \! \
                        sync ();
6 x' h8 `. x  H+ K0 p                        *addr = save[--i];( A3 _) e4 F& M- }* Y8 l
                }
2 y0 V0 m  n, Y                return (0);
% [" `; y; B- W1 p( |4 W1 k        }# ?# H; F$ ?1 d
* a. U! d$ Y( x' V# u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 k3 a! ]; l, R; X* a" e9 K: _
                addr = base + cnt;        /* pointer arith! */1 y& a6 V" d3 T8 J' _' N
                val = *addr;2 _( `" Q8 g: I4 Q2 K
                *addr = save[--i];3 o, a9 q, k( I
                if (val != ~cnt) {
6 d2 ?0 a# i& y9 ^9 r: F7 r                        size = cnt * sizeof (long);
1 u2 i1 J  P) W4 E  ]( Q  H                        /* Restore the original data before leaving the function./ g; u6 {6 c8 f. P9 q2 `
                         */
$ s+ |2 w8 H2 `7 d3 @4 V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 e0 z( ]$ U' R                                addr  = base + cnt;
9 e" _7 \( [7 m2 h" E. Q                                *addr = save[--i];3 L5 [9 ]8 q" G* Z9 a* u  i
                        }6 u% u" m# x" n- e  W: j+ i0 Y
                        return (size);
* {( a2 p. Z/ [/ Q2 h7 l; f1 f                }. y5 \& _; y1 m8 J1 v( h) p- g
        }3 K- J" p/ g: K: D( U; l
7 k: S6 s5 r" f
        return (maxsize);
9 p5 A% b1 d& H+ Y1 F}
0 m8 {3 G/ V# H, Nint dram_init(void)
- }. O5 D/ t% }' \{8 ], B& u7 j- {. T5 J
        /* dram_init must store complete ramsize in gd->ram_size */5 K/ c' \; M# Q# b4 T
        gd->ram_size = get_ram_size(" R% ]0 Z( A) H7 V% m2 f9 H
                        (void *)CONFIG_SYS_SDRAM_BASE,9 g# L/ m1 `' B; }  O
                        CONFIG_MAX_RAM_BANK_SIZE);
: R7 h0 h! l/ A! `' m" b5 H        return 0;2 ?, d# b. u5 Q$ D4 I0 X' ^# ~* e
}
. y% U4 g, @' ?9 ?+ D+ \, b
. b' A0 \8 p  t$ Z& W% A1 f2 e) l* o  V9 |% {

( `# f. e$ {0 C, {
$ c) X+ A0 o! m7 }/ V/ y- W# mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 m1 l0 g, @* @  i
3 s; u4 [- P/ j  H4 p/ R: g. k9 {: T4 B( P9 ~
2 ^3 F0 m: G2 R& k9 d





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