嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, S0 ?" E- |  l6 z& R核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 L( {: q2 [5 b. @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& N+ v2 \7 h2 Q3 w
+ ~5 N5 L7 I1 X: N' b7 N* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& E3 r% L4 }# G3 H! f
0 X: v" F& Z( B) A. C5 N
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 ^" j0 J, K7 y( h6 Z
/*$ {# }5 T" T5 Y* _" C! @4 T
* Check memory range for valid RAM. A simple memory test determines
, |, M4 m( @2 M, P1 D% s# n* the actually available RAM size between addresses `base' and
6 C  p& Q2 ^* _& a# m- T* `base + maxsize'.6 O6 T1 `; q, [* p# ~
*/4 e, `, k& a2 P+ ?( X: U
long get_ram_size(long *base, long maxsize)$ N5 B  q1 u4 t5 P: t
{4 |1 R% P9 g4 h1 d
        volatile long *addr;1 c& T' _9 F" y; f( M6 o
        long           save[32];3 |! c6 P7 B. t
        long           cnt;
+ [! H) i' T# X9 ^# w. K+ K        long           val;- n# u1 L; v; q7 t
        long           size;
6 F' B* k  D! N+ f. _        int            i = 0;
- j2 Q7 ]6 b- M; `6 v
4 }2 Y# o8 R3 L, H' h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ W  T; `1 r: v& b  H* Z+ O
                addr = base + cnt;        /* pointer arith! */
, n# B4 Q& l% h' b& P8 Y  P                sync ();
) }, |7 Q2 q5 u6 }4 R                save[i++] = *addr;
* i( y, v& y: N                sync ();$ l/ L5 v: H4 }
                *addr = ~cnt;& P/ Z$ d% D6 N/ A0 K$ E  n
        }
! F  V- d& G8 D& Z
" ]# {( p& ], |; e2 m1 x" ~        addr = base;
" W5 K9 J+ o( }        sync ();% i! a: s' g) w' N. o; f5 J( Z  K/ J
        save = *addr;& Z2 x8 S, S( V0 c* U# n+ c
        sync ();5 P' F* R' S* y, G! S
        *addr = 0;
0 f# P# o  A) H, g6 y# d" p: }7 B! S9 b  {7 B5 ?$ D
        sync ();. F; h. F" `0 }! J
        if ((val = *addr) != 0) {1 [! D3 X% k, V3 F" b2 m+ `+ C
                /* Restore the original data before leaving the function.3 L8 {6 }% ?9 b1 E( }6 [* s3 w, T
                 */
4 ], O+ k- A9 Z8 H: k% y! _                sync ();
% |' _  r2 c/ \$ u+ y! F2 I8 a                *addr = save;
! p( ]) g% D# ~                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. f. j( Q5 K( m: \' [9 f+ g! i+ p% L                        addr  = base + cnt;+ n$ \+ K! x; F* B! r: s, n
                        sync ();( |. ^) U2 [7 \9 k0 Q
                        *addr = save[--i];
: T$ p( a3 p7 }& X0 f# P& R3 \1 A                }
4 S! l1 i$ {2 ^5 J9 D: Q                return (0);& ^9 {; J/ _: T7 Q* a& x3 r% t# m
        }- G* B; w4 e0 T+ Z# ?
& d: }. `+ q5 ~$ a. j. c4 q) A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: j& ]& C7 x1 e* ?: o& a
                addr = base + cnt;        /* pointer arith! */
; g% \: {2 e; o" |' @7 O" h! T                val = *addr;& T% s5 _& ~" o8 P4 Z
                *addr = save[--i];
2 `- q7 }: V' H& D                if (val != ~cnt) {
7 z( O( p! L2 W                        size = cnt * sizeof (long);8 Y$ M6 A2 N1 C
                        /* Restore the original data before leaving the function.% Q& Y. I! I2 a
                         */  ?4 Q) E  A6 k  {, y0 q% Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ H) I. B% S1 Z& W) H6 a                                addr  = base + cnt;
( I" F1 p9 a' J2 n+ K8 i1 |                                *addr = save[--i];5 G$ W* F: q( s  s6 [; j- V
                        }1 a, Z% G# q3 f2 G5 C/ U. x" N  u
                        return (size);
4 e6 h8 I& E4 z% a. h/ U( p                }
  T# p- B, \8 w8 h        }
0 t6 [6 \/ _5 [4 U9 q& u+ z
( u" l) f9 d( U9 y        return (maxsize);
/ R' ~$ _) R+ M3 r, I}
  ?( l4 \. U1 N, O  G8 N7 oint dram_init(void)
9 W( |0 O5 ], [. |{3 j( w' d) v. J) ~; C% B7 }# U
        /* dram_init must store complete ramsize in gd->ram_size */
: h6 n% R- J% p! b' A' u! l        gd->ram_size = get_ram_size(/ A6 \9 L3 ^# |1 d$ P- a
                        (void *)CONFIG_SYS_SDRAM_BASE,
, _, B  K; Z  I! y' Y; X9 x" k                        CONFIG_MAX_RAM_BANK_SIZE);7 B9 _1 i, X, c( n5 U8 Q
        return 0;: `/ S, J* _: \  E4 v( P
}5 n2 X  q$ Q/ C6 e8 ^$ v7 f- h
* ?2 @. t( r  C/ q1 B

* C! v: W/ N2 T. y( V7 E
  z2 t$ c0 E3 e; |' [0 ~$ _
2 i9 Y0 X: o& ^' r2 N. P3 ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 I: _  q# S0 {8 ^  |5 Z$ i5 O4 Y- p/ T- X
" g, s' d" y( ?7 f& w% W& C
( g4 p( m' m3 p$ z8 w





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