嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ O( ?( E0 Q" H+ L1 R核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 u$ q/ Z+ R+ g' u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' K0 l; J& K8 N4 s+ C

9 U6 @: A' Z3 Y! A0 X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 {6 u1 h+ i& m" B
0 W5 _% k- n7 C, u' u
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" A$ x+ u7 u- X3 o& k0 Q3 T
/*3 n% ?1 x2 @; G- r/ n0 K& j2 ]
* Check memory range for valid RAM. A simple memory test determines$ @* [7 m9 {( L9 h' \: P
* the actually available RAM size between addresses `base' and
, _3 [1 M$ h4 P8 f- \& ~& {* `base + maxsize'.
- I0 l4 |0 I. T) `) G0 C6 P*/% a* k- L  g$ R& J0 c
long get_ram_size(long *base, long maxsize)7 w: {: ?/ m) u) O
{( |. ?6 y- W+ f& {! E/ }+ W2 t! z8 t
        volatile long *addr;+ X/ p! p  k/ Y# Q  @
        long           save[32];
3 x; j& b0 U( J$ N% e9 Q% G        long           cnt;
( n8 i+ q+ A$ \' X2 N) S        long           val;3 |" ^7 d3 o7 |' g& h6 c  g7 ~
        long           size;9 t! t6 S; C: Y9 I+ n% o
        int            i = 0;5 N  ]0 ^7 o* Y  k2 k. j, J! i
8 m; Z' ~& ]" g: j% K- q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# z' i# E# O/ t3 f" \
                addr = base + cnt;        /* pointer arith! */
5 L, n- I( i' w8 g, N                sync ();
4 ]: D6 [5 b' I/ z                save[i++] = *addr;
: y- F6 A" H6 W( k# z                sync ();+ J! |. b% F3 g, T2 F
                *addr = ~cnt;' `* @1 N/ u$ f# T- i7 ]
        }
3 x) S. C8 j6 V* U, l* Z  ]( P* j7 @. R' D
        addr = base;
5 m8 {- w9 N( m; w6 B1 M' L. h        sync ();) G0 ]3 x. M+ t, K" w3 }
        save = *addr;: v- r  {% ?3 p  y# }
        sync ();5 [; T  p$ R* I# X
        *addr = 0;
: a1 P2 y9 P, [, i2 T3 K
0 j% r. Q+ ]0 g* a        sync ();* Z6 f; c7 K, ^
        if ((val = *addr) != 0) {! o: w) u5 @! b
                /* Restore the original data before leaving the function.
, I) N5 q3 j$ a8 W4 ~9 |                 */
% w" i: B" ]) H; C" M) _0 v                sync ();
) e! X4 B4 m( g; B                *addr = save;/ [6 \, b5 n; E- e+ w% E5 \1 w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 r( A" [6 `! K7 G                        addr  = base + cnt;
6 N- C7 z$ R  J: p; E+ g) D                        sync ();
; m7 y; i# C8 R8 W( _5 W4 ~                        *addr = save[--i];$ A  T+ G8 E9 I- Y* r" S
                }8 |' k  I( q% G4 t2 m
                return (0);
! ~$ o7 O( H# h0 v/ l# X1 G        }
5 w/ C* l4 ^) C  a& [, V- e' q( D& U) b5 O# ^
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) M6 d: u) G" ?* b                addr = base + cnt;        /* pointer arith! */+ k0 \* I9 U1 C; h: b6 ^: |
                val = *addr;* ]: N+ t. ~9 t6 L7 w) }( }5 L( P
                *addr = save[--i];
3 i# O, u( k+ C- q0 V. y2 T) W                if (val != ~cnt) {9 F/ p4 c! _5 Q; q
                        size = cnt * sizeof (long);
/ {# o+ Y4 u/ \8 E9 c7 P                        /* Restore the original data before leaving the function.2 q$ K- J+ k! ^3 d9 k5 A3 [
                         */( S% z' X4 Z2 a6 O! M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 w$ N) ]' F! L# M  P1 K                                addr  = base + cnt;: j) L4 M! A$ R* }& a8 z: O( v7 H
                                *addr = save[--i];
' o1 s: h- a( y" @5 J9 q                        }
: u9 A2 V* ]: j" }4 N                        return (size);: q# B' ]/ h. Y! @" F/ I
                }
" Y! ?! y& d9 U$ L' G% U        }5 N4 d( E' j- E( t3 T+ e0 h

6 q9 u+ d) b8 [# M% @        return (maxsize);
, G" B8 m+ L2 H/ V: n}
3 Y7 l5 F/ x' Q) M4 Pint dram_init(void)
5 D2 E- n( H( `' @{
- |1 L( ]# C' R+ e+ ~; x        /* dram_init must store complete ramsize in gd->ram_size */) G! c2 b) ]3 A
        gd->ram_size = get_ram_size() @3 Z# j2 Y8 _6 Z$ `9 p- M
                        (void *)CONFIG_SYS_SDRAM_BASE,
$ @, N4 C7 C9 `9 ?                        CONFIG_MAX_RAM_BANK_SIZE);- `& j& ~; ^) s7 ^* b% ]
        return 0;
3 b. M7 F5 Q, |, V9 Z}( \  N, s* f% x. T, i7 s" h6 ]& M
/ z( e1 o- o( n6 u
) z! x- b4 j  k" }
! ^/ p3 `$ t# D+ ~7 K6 {" j

) L3 C8 \0 b2 o- ]6 J1 j8 ]7 ~3 eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; e0 d3 R& X, c* G- b& n/ }" U
7 w  v: a9 q2 R" \  j9 @  [( K4 f& W2 R

( |! z9 ?- i9 t2 _




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