嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 w( K* h$ Z6 M8 E+ _& c核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ T. w5 `- e% ^6 g) ?& Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. t9 Y+ ~- v% Y" t) u
; S4 Q% R- h2 j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: z- [/ j5 B7 H% u5 t8 P
" @! }9 l" m) P; `2 ^0 q: ?

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* S$ t; @1 P, a8 I
/*! m  T" a1 S. l. D& _6 B" k
* Check memory range for valid RAM. A simple memory test determines! o( Q. n) b+ k! y- F/ |) g5 J/ Z1 F" P8 c
* the actually available RAM size between addresses `base' and
+ a2 L6 D9 F( u+ J9 j. A9 V7 `* `base + maxsize'.. X- B- E: F2 t( D4 T5 L
*/
' e$ f1 t, S- ~. z. d8 v# y1 Jlong get_ram_size(long *base, long maxsize)6 F5 G6 \' P! _( z$ ^( w: e
{
4 ^1 K7 }! z0 F2 ]' r6 g) p        volatile long *addr;. Z5 n! [$ L- s( x
        long           save[32];
, h5 T, H3 I) X" \        long           cnt;
  h$ J. E: a( p/ W        long           val;
& c$ J3 _' x- r6 ^8 I        long           size;
) N6 W2 f/ d, e( k* X2 C+ ^        int            i = 0;9 e% ~& ~8 ]  j) g9 u3 R7 v

  S! V( N1 @* Y# f/ m! ~, u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. J6 g- m5 b3 n4 m                addr = base + cnt;        /* pointer arith! */
4 p# [( z4 K& o% Z# R. i7 @' M                sync ();+ q3 K: [: f/ W% ]% a
                save[i++] = *addr;
/ y, V  K2 Y- \8 H* W/ |" Z. c                sync ();. l2 U7 l; b: k0 j: y1 q/ a, u
                *addr = ~cnt;
6 \7 v8 u4 U' t" u' a4 m9 V        }' i0 y4 T8 a, N9 ?; K
+ S4 F% H1 Y& k) h4 f; H# o
        addr = base;% X7 ^: _7 p7 f5 c$ {! t( M
        sync ();/ @1 ?1 k- }- G1 X& E
        save = *addr;4 b) [6 ?+ t) l" X) |
        sync ();
3 ~! ^3 S5 c5 _: N0 ~; C6 ~        *addr = 0;
$ j; M& C& P7 s3 L6 `" a( ^
) f' ^$ C5 S- n: C& Q  v: M        sync ();
( n( T; x$ O' _- P7 K  h! B/ n% F        if ((val = *addr) != 0) {
% e  E/ H4 r) `/ i+ v" \5 }+ t* y4 O                /* Restore the original data before leaving the function.4 u& }6 J: T0 x8 ~
                 */
* q+ t$ E0 f7 j( U; N9 U& q                sync ();
5 J/ }4 m/ F1 t; c                *addr = save;# K  b9 L1 L, x% ~6 K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. R0 E+ q: G. X                        addr  = base + cnt;. R1 }, F, {: K' w/ k# }' s
                        sync ();8 x' ^, u9 X- x. ^- O0 K" N
                        *addr = save[--i];
- c6 \5 O- T/ c- Y/ q  x7 a( C                }# T8 V2 g9 V4 u! d2 ?2 H. i
                return (0);
- ^; _9 N% M' w' l6 Z6 h        }
) R$ Z% r" d- a5 @& L
) C2 w0 e8 l! ]' s+ T( F        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: }+ `8 ?% Q# }# A                addr = base + cnt;        /* pointer arith! */
+ [. O* P1 d9 [& Y* v# e2 ^" b2 T                val = *addr;7 N# O' l& I0 V* R
                *addr = save[--i];' {4 v9 S% x+ g6 \7 }9 ~$ S
                if (val != ~cnt) {
4 u, V: s( Y; h0 y# _: U# e                        size = cnt * sizeof (long);
4 s7 s# \$ b2 d9 [                        /* Restore the original data before leaving the function.$ p* H& b/ l; z
                         */
- M& K$ e7 |, `, y$ Q3 f4 ]( w) B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 @  y+ L; X6 M% ]5 Y) u                                addr  = base + cnt;
7 D: ~' S$ c( J* X5 V5 g                                *addr = save[--i];6 E5 U5 e* ]  c. B9 Q$ c6 ?
                        }
; ]" ]/ O# W; Z6 b                        return (size);
, A+ t; V5 {9 ^8 q                }) E4 v, v, B  W2 @: W: S$ w. h$ P5 y
        }
- p& e1 V: l0 O7 F* r9 C
8 ^* j) k0 a( f3 H. ?        return (maxsize);
# h7 S+ d& F8 q7 z5 D" c5 ]}
. W. Y2 j; t% K4 G# K8 M# lint dram_init(void)
! }% U0 v" k4 G! I$ o& u& F0 p{* L) F1 r# e) Q4 j9 k% a
        /* dram_init must store complete ramsize in gd->ram_size */
( U' }6 J, T' Z# k# q( T! \        gd->ram_size = get_ram_size(' s6 N' t4 a& G$ i- j$ v7 C% P
                        (void *)CONFIG_SYS_SDRAM_BASE,
& p  m3 Y- \9 j+ |  B                        CONFIG_MAX_RAM_BANK_SIZE);) U1 B0 o  @1 G% h$ \7 l
        return 0;
! w7 O. d! V  I/ A: P% v}$ O* f2 \  W, `  Z
& n3 W0 H2 T: G& P

0 [1 C( r3 X' Q3 v- g4 V  I5 U- Z; k  D% I0 X0 q1 E/ B5 s* o$ G
9 B6 H3 `+ y7 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 g! I- q* n7 y3 Q' S5 A4 y, [  f. G% q$ }

: o! p  B; N0 V0 Y5 Q8 Z
5 J* F9 C' M7 d  s: ~2 V1 L





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