嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 d. k5 [+ c! Z1 {3 K: o: {核心板2:DDR2 256M Byte   NAND FLASH 8G bit; S2 s6 B2 \! J9 L+ S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 E/ q/ ^, [7 z, A: z
% T. }( D( P$ l. |7 \" \9 m是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  y9 r; q7 s1 t3 U
0 P6 y4 a2 T4 `

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 b3 `. c6 n8 @3 W" ^: y/** Q7 S* d' G6 H, }: {# P
* Check memory range for valid RAM. A simple memory test determines! L& @% @0 a& c+ C
* the actually available RAM size between addresses `base' and/ H- ~& q! J8 p; q  ~! \4 s/ D4 h
* `base + maxsize'.' m$ Q6 [7 Z2 ^2 W- h  U( h& Q4 x
*/( t# D# g# t, P2 N9 ^
long get_ram_size(long *base, long maxsize)! Y$ h9 x; r8 N6 v8 F( O
{0 u  k2 Z8 x/ s- K* t2 z
        volatile long *addr;
. X9 j, M, o6 B, u1 {- _6 u  ^        long           save[32];
3 P0 R$ C( ?4 _9 L; |( h; K        long           cnt;! I/ b" Z! q! X0 I
        long           val;4 v' m4 R" W; a- F& X5 n# ^' F
        long           size;% o$ _: n/ y0 @( Y9 s: ~
        int            i = 0;% s. Q# e0 k1 p( h3 w4 m

8 N) k0 h; p( w% c' F/ R4 A0 J. w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 T* W4 O% L" ?" Q" i! c* @
                addr = base + cnt;        /* pointer arith! */, J; _& _+ b9 t  G3 I% `0 R
                sync ();
3 S! r! l6 y# T0 A# ]                save[i++] = *addr;0 F: C$ s+ a, s9 Z
                sync ();
7 q" R/ C! ]! A' y  `                *addr = ~cnt;
( U* w0 t* n: I, x; x! K        }- w* w3 V( k9 p8 ~7 D7 x

4 J% \) D; ]+ y  f6 Q$ r" q        addr = base;
# F+ F( R# j0 o' V5 _+ O- M        sync ();
' {: i( z2 Q& B. ?* G        save = *addr;
4 `% o+ K$ u: Y/ d, H# M        sync ();
0 X  \: B& {. `& F: h" a        *addr = 0;
! H+ W% e2 X  U0 n4 S( f1 ?. ^( Z6 t$ P7 \9 Y# S
        sync ();. I( L0 o+ k; Z* O! E3 I+ c' n
        if ((val = *addr) != 0) {
( n, }. a) v+ P0 W; G                /* Restore the original data before leaving the function.
1 U: s5 H, L0 ]9 N: C                 */
8 p# g  I5 P3 i+ X5 y, s- }0 [                sync ();7 h/ j: e5 Q& I  M
                *addr = save;/ X0 N1 F- Z: o* M# H9 [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# P+ ?* r2 N# e+ e% P; i7 Z
                        addr  = base + cnt;
, R9 ~" @/ {5 b5 O6 u" C, u' P. a                        sync ();, l$ z" C7 v' R
                        *addr = save[--i];/ I0 W/ t. W2 W) z( \5 z$ X) Z
                }: g0 u) v  d' q- |, u
                return (0);
  E( ]$ E# {7 n4 S        }2 L( r* L2 j/ z' z6 ^
, b& d. Q8 O& J- M; b, u! y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 B0 N: e5 g! o/ K' r# [0 I& l
                addr = base + cnt;        /* pointer arith! */
/ E" W  `" J9 R4 F! w4 i0 l8 \6 Z                val = *addr;
& n* [4 s% P4 k! S: ^4 U  k                *addr = save[--i];% ]6 v/ w2 w  o( H4 o8 J( _
                if (val != ~cnt) {
2 e1 `9 |% w% A. L2 m                        size = cnt * sizeof (long);
' }# h  D" b- P                        /* Restore the original data before leaving the function.. Z  X* p" k6 J; N
                         */1 j! |( X- j  [5 b# U# U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! |5 B' _1 g) g2 J                                addr  = base + cnt;
, Z' f/ @( H- l5 s$ P                                *addr = save[--i];) r7 e1 c4 \$ u. S1 f
                        }$ G4 G4 @$ g8 o; ^3 `1 r
                        return (size);
4 R$ C6 U3 p8 _5 @0 Q                }
8 R0 W4 P9 }, a# b/ T1 [* e, H4 L        }' P. K( q6 J7 W6 ^: k: d! l
" X2 u/ N; h- k# Z
        return (maxsize);# X2 L1 ~- t( G5 G2 f( P
}
: i; ^2 {+ h8 X  k& a, ]1 q: uint dram_init(void)1 V$ W0 }; c5 z
{- Z8 r6 ?) `4 a9 W' M
        /* dram_init must store complete ramsize in gd->ram_size */
$ g8 g" x( v; g        gd->ram_size = get_ram_size(
9 `) W0 o& V# v+ K                        (void *)CONFIG_SYS_SDRAM_BASE,) r/ ^: N8 `/ Q3 I* @, _
                        CONFIG_MAX_RAM_BANK_SIZE);
. X. O/ f$ [$ w* U( X% ^        return 0;
) X7 X! J" }4 V/ \1 E% J% {8 Q}
  ?/ h5 C' o! G2 E. P
6 [3 H. l0 ]! |* q9 c; U0 i* c( b% c0 P- N: d8 M1 d: s' v

6 a  U1 g6 _7 A3 B3 ^
; t" w6 Q! h" k4 E) C+ f$ qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* o+ E: G+ `+ L( s+ j8 p

2 D. L- ~9 R9 r9 z/ q' E: a' b
" v; F8 C  W- N/ J: O/ E

6 a  T- ^% g- g. ~( {  Z; n/ X; r% K




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