嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 N! L' [* t) u* Z( Z0 Z" h2 w核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ g- N" t- x+ h( h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 C" G' X7 z+ m. O

4 k  `" w6 m& p# W; p1 e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' k' i+ ^7 E7 s" m  ?% g

! J; T9 \) F( r( A  f: C; \
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 i0 {, }$ A* N7 C5 I+ K7 Y; T
/*
+ ?" p5 K5 m* R3 r8 S9 J* Check memory range for valid RAM. A simple memory test determines  }+ y8 i: e' Y7 Q" Z, N1 _$ `
* the actually available RAM size between addresses `base' and
+ O" h) O0 M5 U$ E$ o4 a* `base + maxsize'.
) S7 U5 C/ M5 t/ a1 v1 b4 R. d* i*/
: X) G! ]/ G, ?4 L/ Zlong get_ram_size(long *base, long maxsize)
4 N# K. L" w* |% f{
" k1 z! v4 m4 \) ]        volatile long *addr;
& `0 g& I8 m, t* {9 r. o        long           save[32];
; Z% }, |/ d9 o        long           cnt;
1 _3 G4 X& a4 Z# I; m  d* w% r. I& h( \        long           val;
) d! U7 U' k* P( z7 u& M7 j        long           size;4 Y7 D/ K  f. b5 n. b4 A. i
        int            i = 0;
) c3 B8 [' d" P8 P% J; K
3 S6 l) }& z7 u, \% M! o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ R5 r' W# p; H5 ]! s
                addr = base + cnt;        /* pointer arith! */
* {* y% ]" m$ f) u                sync ();* }8 h8 |3 e5 T0 I4 ?
                save[i++] = *addr;
# c1 P3 T4 C* i                sync ();9 }* x  n# G! u/ T" u6 x; `" w" a
                *addr = ~cnt;
. E2 ^5 v; G) j9 D        }
- L3 E/ B* L' e( @6 y- ~; ~' C
7 h5 |! J* }. {( N, J  a! G        addr = base;- m- _) W/ O- V$ U
        sync ();
- \% g2 e% Y1 e: @+ e8 {- X7 Z7 A, c        save = *addr;4 }  H% O7 b% |3 V) l
        sync ();+ {" |& }9 U2 \7 N! @' W
        *addr = 0;0 t: Q; V+ ~! A

+ e2 |" Q9 m0 E/ E( v        sync ();5 g  S2 X8 F0 I  P( F2 M! s4 H4 e
        if ((val = *addr) != 0) {- ]* s) U3 s7 k- Z' R
                /* Restore the original data before leaving the function.8 ]+ q1 |! P4 Z" I# n3 H
                 */
5 g- j. ]% D( K' a                sync ();0 S2 Y  E1 S9 u, R8 k6 B( Q. M
                *addr = save;
# f: Y" E+ J% O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  G# x' w; B/ q$ i                        addr  = base + cnt;/ @1 I% Q* X, W/ j, I2 D
                        sync ();1 O9 T3 ^; C& G% }
                        *addr = save[--i];
  P* a. b+ n" H9 _3 l) T9 M& e! A$ }1 i                }7 j: A: H4 K3 A( }1 |( o
                return (0);
! J; F! j! U! m4 t        }# Z' \9 L  P  R+ c* T

3 u( F1 R+ o7 o# L8 \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; u% J+ n- f/ R( ?/ W
                addr = base + cnt;        /* pointer arith! */# c' W3 q; Y, A6 Q8 o2 @, V, D( ?
                val = *addr;
1 H+ s( E% a% e" e                *addr = save[--i];9 s( P% K1 R* P0 b& Z
                if (val != ~cnt) {
8 A) W6 ^% P! z0 a" g: a, F                        size = cnt * sizeof (long);
% L$ @. X) h# w                        /* Restore the original data before leaving the function.) @" ]9 u! R0 U3 y. U/ u# S
                         */+ U1 P% X) a6 s- Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, K3 {9 J& r3 u
                                addr  = base + cnt;* D6 I7 ]* w  @5 b6 v  P; ^
                                *addr = save[--i];
5 `0 ?8 |. Q1 R9 g. D                        }: L, {4 K% c) j- B
                        return (size);
: B' _$ T/ H* U9 j                }
; j% ~; e& g* e( f: w! m& ]8 @6 b- E3 ?        }9 `5 Y1 n! a5 v; k

% [+ E/ }, M/ Q- w- \        return (maxsize);4 Y' J6 K$ o' k* i8 v9 R% _6 I
}
1 W  o" G& u" |% kint dram_init(void)
7 o- k5 ]/ Y+ V- l) k0 S{1 ~* G% {6 o& G
        /* dram_init must store complete ramsize in gd->ram_size */8 M( w1 s0 I) J- M0 l8 [
        gd->ram_size = get_ram_size(
1 r3 _' I* l1 H& f7 t# n5 B                        (void *)CONFIG_SYS_SDRAM_BASE,
- U  F- G( z. P- M7 C3 Q& b# l                        CONFIG_MAX_RAM_BANK_SIZE);
- D7 g9 A( X( v# t# g6 M        return 0;7 Q6 Y& D3 V' C  q$ R5 X. ?- @
}
( A) J( Z6 _) ^( W* c, x2 ?" m
& N% ?! a0 F  j0 y. e- k! x% \# ^) z/ }4 k$ N# D. @6 G' y

" ^& C2 l, V# O) v7 ?( m' e4 [
9 {) _$ d) Z4 x& I. G9 lFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- v0 n* S" m( U
, C! i' B: u, L7 S3 h( P
, X  o: [+ G! R( h* `% M
8 D# H$ Z6 a$ ^9 `* z" v





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