嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" i- b1 O5 V- Z' M核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 Q) V; p$ P& \5 R) Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 N/ n" E9 k% C# J7 B. j# y! c) n
1 y& u& l; Z* h" }- F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! R" E$ }. e' z) I, d- Q2 N

2 X4 A$ {7 u6 a
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! J  u+ N/ r3 f6 C/ o5 W
/*
* F2 h. I( I6 W# |  d* Check memory range for valid RAM. A simple memory test determines1 o" A$ ~" R# ~' u
* the actually available RAM size between addresses `base' and
( E& w: e+ |+ ^- I. V, z* `base + maxsize'.5 {/ i( p  L4 }' K% I" J0 Y! x
*/
) I- L+ M! _5 W4 F& wlong get_ram_size(long *base, long maxsize)
1 [) r. @1 f% J+ h{4 S8 x$ H1 j; H- T
        volatile long *addr;
) y; }# @: Q6 T+ `        long           save[32];) @/ l7 ^" d0 ?( m% n
        long           cnt;
8 q  K8 y3 a1 L        long           val;
6 x( p8 U2 [$ A        long           size;
$ o3 J- M0 k7 `7 `/ a        int            i = 0;
, e8 |+ u+ _/ b2 J' {" X3 N; Y( p$ M# y+ j' y9 l7 o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- c+ Z6 S. I! Y( ?8 G                addr = base + cnt;        /* pointer arith! */0 S" |7 z2 \$ b" [0 e& b1 p$ T
                sync ();
+ X) m5 r  }: ]3 V7 i5 K: ~                save[i++] = *addr;
% h0 j) w; Z) \( T                sync ();' k+ J9 Z4 ^' z5 [* Z3 Q
                *addr = ~cnt;
# S7 U9 u. b' G; d" w+ Z! n0 \) h        }
! ]" T+ ^# g' N& p* L3 ?6 F6 l9 }' e" i: Y* U. C% r: D
        addr = base;& r/ a4 o! B; N/ _2 a* u/ I
        sync ();. M" j: j# c9 }- m
        save = *addr;$ \% i' _* r  a) O2 z8 u
        sync ();# e. a0 c$ V# X1 U& R
        *addr = 0;
# Q; Q& I+ Z0 d* Q2 z( G0 A. U; b6 e; D( L- {' k6 z3 _
        sync ();+ K- p% a5 P- p" f; ^" b
        if ((val = *addr) != 0) {+ c/ m5 s$ ~8 V
                /* Restore the original data before leaving the function.; P: W- c" r! b0 q* ?
                 */# i& _" {/ H' C2 k9 Q7 F) K
                sync ();9 B% Z: y  L5 v3 o
                *addr = save;, E9 Y7 ?, g5 W  y+ s6 G. J, A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) A- C, W8 Z7 z% Q/ d/ C# U) l. I
                        addr  = base + cnt;
) [! G  c2 _) s3 M                        sync ();: b! Q2 M, Z- V* ~
                        *addr = save[--i];
* I% W; \* o& x8 q7 t! |2 f3 x+ V! R                }
2 d' q( [9 N' t4 U                return (0);5 g7 I( l) L) M2 G
        }
7 d" f: e7 b, Y( ~* R7 \& \, S. y% ], H0 r, ]7 T5 A. y4 x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! e: x4 ]5 i+ b4 ?9 {) F
                addr = base + cnt;        /* pointer arith! */$ s6 n$ k1 D3 K! V" s
                val = *addr;! h; A( w+ [, B5 u5 L- x
                *addr = save[--i];
. z; G! o$ t" W' ^                if (val != ~cnt) {
1 T  a! \+ m, {) }                        size = cnt * sizeof (long);
. u# |# b; v$ n: C- r                        /* Restore the original data before leaving the function., w( O$ ~8 j$ a# i/ l7 a
                         */
7 V) w- r& s0 \! T. V/ O/ F9 ^                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, f) H- H4 a( J
                                addr  = base + cnt;
# B1 k4 f+ M2 Y& K4 |& S/ a                                *addr = save[--i];" E5 I% x4 S  S3 z
                        }- P, H! K  I5 c% q$ L
                        return (size);
. T  L3 P! ^. S, w                }- X% d: j. }6 U- C" \
        }; P* F0 Z$ A( d' k' R

+ m2 _9 }% p8 I, D        return (maxsize);
0 s+ u- Q6 v( V7 E% @}8 Y% R% s3 q6 C6 Z% ]
int dram_init(void)( F: }8 l( J' \: N3 o
{7 l7 r$ C- m% \* s2 L3 R
        /* dram_init must store complete ramsize in gd->ram_size */; k8 d* r) E& U% s; B5 Y
        gd->ram_size = get_ram_size(
- D. E4 h: N! ]9 k% Z& D                        (void *)CONFIG_SYS_SDRAM_BASE,* ?9 T8 f) J) Q/ e8 Q9 r% p
                        CONFIG_MAX_RAM_BANK_SIZE);
, V: g1 f, X6 f- r' z+ ~  d4 G8 Q        return 0;+ d3 @8 D; y. b) y8 A8 D! c: H+ W% x
}
/ k' j$ Z9 V& J0 a) E
2 U3 ?* Q, X3 {/ y( N3 D
9 M; @' j, f( B+ x0 y$ E- {: U, }' x5 y4 z" f6 F

9 L1 w6 W- }/ N9 Q, rFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( K- P( c) e, X" f" }6 L' Z! L9 b+ Y/ _; u
" V/ [" }7 B' |/ A/ j) i
, a% G  U1 a4 \! M3 Y( ~4 A; R





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