嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- M- E6 ?  a% ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ r, B; i" V$ }: W这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 S" G2 \/ n! I) K1 C5 p5 f4 ]8 @% y0 I) P% n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& q0 s8 ~, v# E8 n0 p, G
- u# @) J: |9 Z1 `- Y9 G3 h3 k
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) y4 }% Q3 e! B% ^. i
/*
, I6 f. Z5 o+ ^- G7 |- x4 V* Check memory range for valid RAM. A simple memory test determines3 Z( x* _* R7 J5 g1 w
* the actually available RAM size between addresses `base' and
! s4 L' W; G4 A% f2 b; R' C# o* `base + maxsize'.) U  V7 J$ N, t7 V' Q& Q2 l( W' `
*/
$ M2 ]$ Q; @/ P5 r2 nlong get_ram_size(long *base, long maxsize)
& x  @2 A4 n1 B! j{) M* C/ @' |' }# w! c) L
        volatile long *addr;2 D' \6 }  B: _+ h4 h9 x0 e  X
        long           save[32];' L! r) b0 J6 G! O
        long           cnt;
2 N9 b4 T6 t* s; u5 F- ?        long           val;
% ~& G1 I% p/ k# J; m( e" \' G1 T9 E        long           size;) h8 F" i; h) ~6 A" ~0 G7 W
        int            i = 0;& a/ u  |, F  P( v" O

2 d' x/ j$ ~5 g8 [3 i" C) b; u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ K# k3 Z9 x  F+ K  D
                addr = base + cnt;        /* pointer arith! */' y' n% D3 y) e5 B3 c
                sync ();0 Z, ]: B! I9 i) A# x' }  `
                save[i++] = *addr;
% L$ P# Q+ t9 n4 q5 ?                sync ();
# p3 r, P0 T0 Y7 j                *addr = ~cnt;
/ p% `# S; a8 }2 w! q* L! E        }
# p* i/ _( s+ Q) O  i6 U8 @5 W. z  w: w* F- F
        addr = base;( {4 m) L  _/ j  L: H
        sync ();3 q8 m7 z6 r! D  C& q/ ]1 j' I
        save = *addr;
4 K, {" J* y2 V        sync ();# j% N( y  F1 t" A9 l4 z
        *addr = 0;
6 b" U( b$ Z8 s2 g6 p2 N/ w5 h. j/ L, r  e/ I0 a
        sync ();
4 [0 T6 }* l" A7 |* d6 B        if ((val = *addr) != 0) {% |) C0 X! }/ Q+ _6 u. G
                /* Restore the original data before leaving the function.
) `# \: ~3 l) K5 ]                 */
8 _# F4 o- v: \1 _/ s. u( Y( s# N' J$ c                sync ();
+ u( i& I3 ]  J                *addr = save;
" n3 r% f( X" j4 Y9 k1 S2 |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 h: _) D( Q! g+ A2 m                        addr  = base + cnt;
& _# e* |3 I: z  X( T; R' J                        sync ();
6 I, u0 B) f1 x- p6 u3 Y0 ^                        *addr = save[--i];! d0 ^! c$ s7 U1 n
                }8 q- m- r; N% \) u& h; ]
                return (0);
: |4 Y% D0 P& V; Q# J        }
( e. g( B! H9 J0 p) Z' P; `- K" ~: H: t7 |+ t6 W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( A5 q( n/ A# [' M$ g/ ~
                addr = base + cnt;        /* pointer arith! */
3 o# [( ~1 c; u; N6 L8 E                val = *addr;$ R$ H  O& y/ C4 `
                *addr = save[--i];( C5 V0 L- E5 F
                if (val != ~cnt) {
. z) V, L% }( `: p/ }                        size = cnt * sizeof (long);
5 B, L' v+ h0 Y8 u; U                        /* Restore the original data before leaving the function.& T' e& j- {) ]
                         */: {' T/ \4 _- v; t, k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. k* K: ^* N$ i1 e                                addr  = base + cnt;5 @5 l  k+ {6 x" q  @
                                *addr = save[--i];; T1 d; g! ~- z3 h- @* v* V$ O; T
                        }0 L' E  L$ O* g( Y8 G, ?! {5 n; G# _: {
                        return (size);
6 z" a/ R8 r2 P                }+ B! k; @* R0 n5 H
        }
9 d) b1 b6 c- c6 }! x* A% G9 e& W; d0 U' A3 Z' P
        return (maxsize);8 P" M/ o1 S- `4 ^5 V$ L/ ]
}
; `2 C* J5 e. c) e& ]int dram_init(void): i" G4 V" |5 o, h6 o0 r' {4 z
{
$ m1 g0 R8 Y! y% P; y        /* dram_init must store complete ramsize in gd->ram_size */
1 L' H3 J/ |' `( t$ C3 A' Z        gd->ram_size = get_ram_size(
1 `% }* O' l' S5 d, U0 Y6 F6 o7 U                        (void *)CONFIG_SYS_SDRAM_BASE,
7 V& q0 J- D4 V! W; Y9 |                        CONFIG_MAX_RAM_BANK_SIZE);! c5 h7 X) {  w% K
        return 0;
& {. A) G  }* B* P9 O, Y}/ L, s$ |: Y$ v6 E$ a
! F! f  \* G4 x1 F
8 s5 ^/ t* O& s5 w; F2 [* }* d1 ?- A
+ T7 ?- K7 l' R; y
) T5 c$ [1 c) q0 @9 f) @0 Y' `  A* L, u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# F% o5 f0 e  u. G; t* v% ?1 q

: Z) m# a/ I. o2 s4 O& n0 o, o& c& q
( z* X9 C+ N9 _$ @, z! A





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