嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: l/ r# d9 {" M1 Z4 ^$ V' T; `
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 @' y3 J) ]% F) G, \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. C! n. S# z6 i3 @
7 J+ s) m: s/ h* p4 k+ f' C# L& ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% i. c5 k( N% E5 k9 K

5 Q6 L1 p  g. l' s7 h8 v$ p; F
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& ?: ^. m$ `4 J2 T0 s9 N/ Z/*
0 R+ n* y. ]3 k6 F  ^7 n0 N8 W8 D* Check memory range for valid RAM. A simple memory test determines
6 {) N# `; }2 ?8 w1 z3 P$ m* the actually available RAM size between addresses `base' and
7 y4 d3 }/ o% a" \" r: v. h1 W) L* `base + maxsize'.
" X: N* g$ a) l*/+ L( ]- Y. b/ c
long get_ram_size(long *base, long maxsize)
8 J7 s$ E2 f4 d7 f* I{2 X+ Q! B% C: y$ C
        volatile long *addr;
8 Q' w, [- `/ t) ^        long           save[32];
/ E4 B- W* U/ M        long           cnt;
$ c( N+ c, B  b& m2 @        long           val;
" U$ h1 a+ ?9 a; Z) X) m        long           size;
; L' X! \1 M- b3 ^        int            i = 0;
2 w3 K; z( N, u8 N; i  B* z' }  D
3 W- H, F5 w% _5 a7 {% T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% d. ^6 I4 p, ~- K3 c' X" d                addr = base + cnt;        /* pointer arith! */
+ U$ r2 U" R9 G9 S" d4 K; }3 F/ g                sync ();
. t  ]: N+ V+ E                save[i++] = *addr;- V- m  h0 D- D" K
                sync ();' \3 a- W6 p2 O% `; [+ I
                *addr = ~cnt;
2 F  d+ ?: Y0 W4 k        }
1 @8 ?6 R2 @" \3 |& w* ?6 S3 w/ }% G' L& Q- I( f2 v( s
        addr = base;
: \3 z7 x6 ^0 e: r& S" f& }        sync ();9 i# v, T2 z8 r, X
        save = *addr;/ x3 T1 o+ g3 e1 \
        sync ();
7 K. J% N6 G/ e; T. _! c4 t        *addr = 0;
. k0 C2 P& c5 h9 D1 D1 M' ^5 U% G! K
% |; {, r: v$ [: w2 p9 D; Y        sync ();; h! f9 ]' W* D) U6 k
        if ((val = *addr) != 0) {7 @" H8 P2 X: P/ f! a
                /* Restore the original data before leaving the function.
1 w! i  v8 e; g; u% K                 */8 \' V! r9 d1 ^  x' u5 V) N' M4 x
                sync ();4 a& O/ l7 N5 k0 N% o  d" H
                *addr = save;2 x5 Y. ?, ~, e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 a# Y7 D, |2 G: {                        addr  = base + cnt;
; i$ O& X, G  z6 s7 F; M$ V                        sync ();! a* ]6 [, Q0 O+ Z" t: L
                        *addr = save[--i];
- h0 a/ x) u/ f) c5 y. F0 ]                }+ U/ x" J! D. I* u/ C, _, ~
                return (0);9 S' \+ @4 s) r" {0 r& Y
        }# u; o$ G  Y8 K5 n2 a
0 n& ~" _$ @8 U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 g1 f, ^/ e+ C+ f                addr = base + cnt;        /* pointer arith! */
( a1 e( s; k0 A                val = *addr;
* t- P' B% Q3 A- B6 `) N( {                *addr = save[--i];1 T: d. Z( d( \
                if (val != ~cnt) {
" B& \8 F7 X# r! O2 o% k8 L! A% q                        size = cnt * sizeof (long);: ^, G7 Z( ]7 D  v0 J" T
                        /* Restore the original data before leaving the function.
( G/ I5 V) `! L  [( H( h$ a. _                         */% g, b, X# e4 e) ]  ^0 x9 a8 d9 Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, g: ^, I, y. Q( {" N3 _
                                addr  = base + cnt;; d) n2 x: H' k* q' k6 T3 ^% \0 k
                                *addr = save[--i];
9 }' z2 I1 Y. \* n6 N                        }
. C1 M/ m! ?  S' f( l: o# m$ F1 H                        return (size);
' m; B9 {$ T/ R2 }0 h                }
1 ~  E/ {  g1 x3 A# B9 c! c        }
$ M/ t# ^, h- c, v2 Y' o/ m* n! R' ]
        return (maxsize);4 ~% \0 Z- K8 P4 I% S0 J
}* Q0 N/ A$ E2 b9 D1 h, o
int dram_init(void)3 K6 p" e# p# d% H/ S
{
2 s; g3 o; F* G1 A4 {3 k. B( V        /* dram_init must store complete ramsize in gd->ram_size */% [0 e5 `% [! o. E
        gd->ram_size = get_ram_size(8 s$ l$ p& L$ W0 c
                        (void *)CONFIG_SYS_SDRAM_BASE,
. a( H* H/ K) B% V1 N* J                        CONFIG_MAX_RAM_BANK_SIZE);
: N8 Q* u2 |+ I% r! a        return 0;+ ?" E, J5 P  @' b
}
5 c& a& y$ C8 r: a$ Y1 n) k8 g) T' @
- z4 S8 h& f( ~: ~& k% p" U
" E6 K  H. I; s! E. a8 n- |6 n& n

! e  R$ P1 f- y- qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 n7 l3 Y' C# [) @3 t5 K* d4 k4 Z. v! A6 Q) G0 v4 ?

/ y8 V* M- D) x0 }6 S
7 A  W/ C4 c+ j( P( W* m. J





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