嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 m$ x. Q" p) W2 e( n5 ?- L6 \, `核心板2:DDR2 256M Byte   NAND FLASH 8G bit% i  L! m; y# y" b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- w+ g, Z4 ^; }6 L" R+ E! R9 z

0 w6 o- n1 l, C( l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: m& f( }' G5 v: j( X
. w4 V0 m' c5 o/ L* g4 p

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' r; W8 C+ E- S/*
4 N: M! I7 b& l! j4 p; c; B5 m* Check memory range for valid RAM. A simple memory test determines
" g% G& V4 |( A* the actually available RAM size between addresses `base' and& P% R+ F  z( R! c
* `base + maxsize'.
% z7 M; _( K8 A5 h7 X; E, `! b*/
8 E0 D/ L6 w( Hlong get_ram_size(long *base, long maxsize)
; w1 b  w$ r" G) d- H: P{
2 j7 a' ~- u) Y1 e3 p2 `' B        volatile long *addr;9 b5 _# D) B# k+ I+ _, C) l& W8 y
        long           save[32];
$ H% p$ Z' N7 S, z$ ]6 F9 z        long           cnt;" h5 `9 k- R5 o& k8 k6 v; i% ?
        long           val;
# U  u) A% N; P) e        long           size;
+ F# F* h8 p( S8 E  `3 r5 `        int            i = 0;
2 o% k  j1 D- B# W2 v5 d* ]5 _& s! ]( H7 E0 t9 u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 q0 X8 L( K  o2 J                addr = base + cnt;        /* pointer arith! */
: r; a+ b! x! j/ o0 ~# y                sync ();; b$ s# M# _! _6 [
                save[i++] = *addr;0 T3 ^$ a: b% }- ^% [6 ^6 M
                sync ();
/ s0 j4 A, @- {! X8 c& b% G                *addr = ~cnt;6 @: h9 g6 V9 @  v4 W1 }
        }8 E* Q+ q5 S/ A* q; z  C* g
. [8 g( L3 b; l$ ^! A  I4 w1 d
        addr = base;1 \3 D0 {8 Q6 Q* y
        sync ();
( j$ a9 Z6 t3 f/ G# B2 F        save = *addr;- v9 N( v2 W0 j
        sync ();' Y, ^4 i5 ^0 H9 A9 N
        *addr = 0;
! [: k4 S/ {2 A0 X8 B5 ^- D( j5 X. U% G
        sync ();) f7 S! Y' r: P' U
        if ((val = *addr) != 0) {
1 k6 Q' s" i7 V# F7 j- s/ J) M                /* Restore the original data before leaving the function.
* a6 n& r( a3 [6 ~. f                 */
  n- d( R1 R" W                sync ();& d) t4 W' R! V% |9 G6 w% L- I
                *addr = save;4 k# |2 g! d6 f. K& O7 Y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 S  x4 D  X/ g1 z+ `0 v
                        addr  = base + cnt;' E/ N% p6 l" ?, R
                        sync ();
1 r' N0 a0 @/ ~7 a! I' ^0 Y! m                        *addr = save[--i];, R* i" P& d7 T9 w
                }$ H- K  R! B' v3 @2 ]
                return (0);' o9 S& P" D6 V/ D( k2 w# {
        }+ o: T+ [+ p$ w3 b
2 ^: }2 f$ |. E. R% U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! `- C- A6 D% D. _1 L
                addr = base + cnt;        /* pointer arith! */$ ?/ v, N7 E' P6 X6 a3 K9 m
                val = *addr;
  |! ]' o2 t  J; R                *addr = save[--i];
& H" e( @- L& N4 v" \& }/ }; ]                if (val != ~cnt) {
8 j8 G  S5 X; e2 p2 e" \2 h' P                        size = cnt * sizeof (long);
4 X9 f$ p' q3 @: j; @$ ]                        /* Restore the original data before leaving the function.. k# ~* i# S" F5 v9 K" w8 e" K
                         */
$ V4 @/ I) {7 T                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 {* \5 O0 |& ]# d9 v                                addr  = base + cnt;# {# E+ q  a( R# W
                                *addr = save[--i];
; `2 |# Y5 i' r% h- |                        }
% O+ X7 k3 E  `* B* J+ R  U                        return (size);
8 I/ {( w2 F( i* l' |- W7 e                }7 {; L/ g' V: R; W
        }5 F: f% W3 i, j' T3 n

$ t1 J/ D, D. v, e        return (maxsize);
. e& v7 `8 @/ C- y0 ^2 v8 C" u}4 d2 O8 B" L1 ~7 R
int dram_init(void)
+ a, T. `: |! b{
/ b. \6 k* _  s7 Z        /* dram_init must store complete ramsize in gd->ram_size */
, ]# b6 Q8 E* @6 R  D7 h/ `# ~: G        gd->ram_size = get_ram_size(; Z0 l2 ^  h% A  o$ R( c
                        (void *)CONFIG_SYS_SDRAM_BASE,$ Q6 U$ e+ i: b/ A' F
                        CONFIG_MAX_RAM_BANK_SIZE);
1 @" E8 T, A$ b5 ]9 Q+ d) j! }  a        return 0;  R& ~& u* s) ~! {3 c
}
+ ~" P5 o; d( Z; d. y4 i. Q: W! ^% k2 ~5 _0 {: f8 b

' N( [# @' s& |4 m. Z
( d9 c$ _( Z6 ?. C$ @: F. d
# Q5 _* J, E5 w/ ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 f9 e  ^' `8 y& ^: L: k8 B' y( O2 d* x  r  h

% B# G4 O( ]' X! I  \5 ]

7 O9 H5 p5 D0 Z' N/ d




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