嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 G+ W7 Y; P7 [$ B. o, h4 o$ C核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 A$ T& ~! d# g1 a% k, }; K
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 k% C, a+ [* K) ~
1 _  y8 w7 [" [' X# J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 n, [* S9 p" W/ l. E
7 A6 f6 t9 T) W" i, j: j  }
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: g# R& p4 g% c0 u1 a7 |1 F1 Q9 L& H
/*0 n7 n' J0 V! ?
* Check memory range for valid RAM. A simple memory test determines
+ r& a& n1 m& V! ?+ k; L- {* the actually available RAM size between addresses `base' and
% a- y+ R; V7 n* `base + maxsize'.& ]; h/ Q( A1 Z; Z
*/
! Q- S) C: z% S4 }$ R- D+ o4 A* `long get_ram_size(long *base, long maxsize)- a, T" V. v8 m, s7 i7 d; W
{! z& M8 @2 P0 u( k
        volatile long *addr;
0 v" ~, x$ o/ r( j, R9 U        long           save[32];: [* Z, @+ ?8 v" A( x' H2 v
        long           cnt;
0 Z( E0 K- c4 O) I' K3 o' R        long           val;) O0 ~4 F7 D" _; n
        long           size;
" g: [; R& S2 J9 H4 w- F" v+ F        int            i = 0;1 b* Z" r" Z7 k
, ^0 ?& Q( C' s: w2 o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; t! M8 V6 X1 P& n                addr = base + cnt;        /* pointer arith! */
. X0 t7 s0 K  H2 G                sync ();* u) \  Y/ K$ y' ?1 H
                save[i++] = *addr;% N7 h. O$ {; \& _9 w. {
                sync ();
; U# d0 [: d; R& t/ V' F                *addr = ~cnt;
; [* H. I3 T  n% S# W' m7 W        }: V+ N4 j7 H/ @/ T# t; ~0 g5 z

2 F  J$ S2 s# I, F; D        addr = base;# }! C& A# W, F) d0 X* @% n& Q& W
        sync ();
' m, X. b7 C# s! d! _% S, F        save = *addr;$ K. F! t* Z$ l7 b, s
        sync ();
8 K& z: Y% t+ T0 ^, ?- r1 m        *addr = 0;
$ _# y0 {! T* ~5 J
- w6 F" O- Z, H* k: w) E        sync ();: _/ P' B3 }$ p. A7 @' w, x
        if ((val = *addr) != 0) {
- M6 P" u9 r" g+ X! K% R                /* Restore the original data before leaving the function.
6 C2 N4 D" U4 @  u2 j                 */
: n3 G6 D+ N; {) A2 _                sync ();
& c1 q) `: D4 w& _1 Z% v. g# y                *addr = save;+ V8 {2 Y1 z5 y% b
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" }% A# T( F9 ]' h& p6 W. }+ ~
                        addr  = base + cnt;$ n( k/ M" j, N9 Z; B- i1 @4 _
                        sync ();* }6 ~0 y$ k; Z! ?6 M& s+ t
                        *addr = save[--i];
2 X& |+ o# X/ w; I                }
7 k2 v0 d' f/ e, S7 g4 L; m+ e2 N                return (0);
/ a8 Y6 e, _2 }. v* J        }4 A8 |6 {7 ^5 o5 ?6 V' `- }
1 \+ D  M4 T4 C% `
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ k+ {9 y; V' f: }+ q+ Z, G5 \                addr = base + cnt;        /* pointer arith! */5 D4 H' c3 R$ w8 S; c, f
                val = *addr;
1 s& o& N7 l9 ]                *addr = save[--i];
% R9 t; F6 Z. e' x                if (val != ~cnt) {: [, o! v3 v* G1 i) n
                        size = cnt * sizeof (long);- S2 i% }8 R, c6 x
                        /* Restore the original data before leaving the function.& P6 ]; X6 y" J6 c  k% f/ G
                         */
2 P( M5 J: z& a6 L                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( n9 Z& I# E( T0 k: v: G                                addr  = base + cnt;' U: ^3 z3 k9 p7 g" ~) G# c
                                *addr = save[--i];
! N. i" e" E5 U7 h% ?; [6 v                        }+ C$ E& [9 }( J6 [0 V
                        return (size);
1 s5 p! H! h% X. I9 S                }
) n! H" j1 I. z4 r2 K5 P5 J8 m        }
+ `3 B8 h2 M' |3 f' ^) Y' ], J0 k+ s" M" h/ B& X% H' w5 x
        return (maxsize);
. F1 Q2 O( ~" _$ r% G4 `}9 L1 v% S* U/ E0 m( Y8 @7 Q
int dram_init(void)
  x% H/ @5 W* E  A{
8 Y8 |" h8 s, x* R1 Z! r8 c        /* dram_init must store complete ramsize in gd->ram_size */) d! Y' {$ C+ i* ~) _  S
        gd->ram_size = get_ram_size(& r) y5 ]. i, x6 n# q  D0 ^; S
                        (void *)CONFIG_SYS_SDRAM_BASE,& R, O% K; S+ k9 v2 |- Z- V
                        CONFIG_MAX_RAM_BANK_SIZE);
- I8 f" y% `/ g        return 0;, m* {3 L/ P& k. L! r, `+ Z( K
}3 C" K% \9 Y" d, F- U
2 U8 x+ x. @& h! k

& e2 h- z+ q! D/ V6 x- d, Q" t& |
4 u4 b6 y' F1 l6 ]  a9 B) g! Z* n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% ]' `8 U; a) f2 R0 I

! b: V# {9 J4 ]3 o5 D" H* n/ U" X5 r' y9 @' s" i) R) {. X9 P" Z2 }

5 i) F. }$ M& f& c5 ?8 F




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