嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. V' A! v- M9 P+ }% g9 b核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 G% f* J* H) ?4 C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% K! ]! g7 W& n9 y+ o, v1 q( Q

5 |/ {! a5 l' O3 k9 w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# Z1 K& p0 Z2 ~- ?, N

3 u* Y4 R) e0 T1 z" \1 u9 ^& l5 z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 B' D" z; D/ |  Z( ]
/*" D; d# |7 b* A4 K( h! A4 O
* Check memory range for valid RAM. A simple memory test determines
9 u2 W' g) T% k8 T* the actually available RAM size between addresses `base' and
' j+ y5 @9 X  d* f4 H$ S* `base + maxsize'.
% a( e$ N" E9 L9 k) u6 s*/
7 u6 r; L! _9 {+ k( S! `long get_ram_size(long *base, long maxsize)
0 ~: p& J4 ?! T* P/ N+ R0 t{
$ I! d+ B) d! T3 v3 D! U, R1 I7 u        volatile long *addr;
- A, e8 ^# W9 q6 c# V& ~. i        long           save[32];3 g# m5 Q( M4 s2 k/ A: F
        long           cnt;- @1 ^' W' O- n3 L3 l! O
        long           val;
; X, K! H1 m8 o8 y! h- _  v! u$ ~        long           size;3 {/ h, a! K8 h% U3 o
        int            i = 0;
* u- B; u) ^1 r
! _7 R7 v, s1 k) \5 g- E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 E+ I% J6 i; E) P+ b                addr = base + cnt;        /* pointer arith! */
/ Z, }$ G* b& x) D                sync ();& @$ a1 J- Y' b
                save[i++] = *addr;+ ~! W7 K/ X3 e8 `) \* s( Z
                sync ();: k5 B8 X( j/ ~% f  M6 M3 l
                *addr = ~cnt;1 o( o1 `2 u8 z
        }4 s7 x& F# B0 _" T$ S7 o/ v: B
2 y1 Q4 ]. P: `$ J9 Q
        addr = base;
7 o7 c2 q+ y$ \% B- H+ i- O        sync ();
$ ]7 W% m3 E, j* L1 k        save = *addr;4 V: ~8 _) [  O5 L/ I
        sync ();1 U' Z  \7 x: y9 Z) O+ w
        *addr = 0;( r$ S2 i. d; D+ o+ r7 j

3 V% `" l0 A/ W3 U5 K3 y* b1 ~        sync ();
1 @/ _& @+ X- |7 `% z4 X        if ((val = *addr) != 0) {
& e" u  t& M+ O( Z. r0 ?6 i3 P                /* Restore the original data before leaving the function.
- E! D/ Q" G0 N" q0 }                 */! P& x- c- Z9 I* K& q
                sync ();
! Y/ d7 j! J. f3 h                *addr = save;
4 Y5 I3 Z# y: z) p% `/ a- ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( [! B8 V6 y, M, J* }% E0 G3 c
                        addr  = base + cnt;
6 S8 a* c% U1 I9 e, N& o# k, Y                        sync ();
8 g2 T/ _) t) W) w4 B                        *addr = save[--i];
9 s# i: O7 l% M( v                }
: Z5 D" n& D8 L  ?( x                return (0);
: k2 D( b+ Q$ W8 e        }! b4 T* f2 N# y) D& N7 P) G4 n. m

& b. m8 k" a$ Z% o* Y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 X: z" M) W8 P& y# H6 V* B  I0 E                addr = base + cnt;        /* pointer arith! */
; ]% b! v. s$ v4 ?                val = *addr;
, j1 E% ~; M- G( A: J9 q                *addr = save[--i];4 {1 n. \" {) \1 x1 H" b
                if (val != ~cnt) {) n: ?; }% F9 R1 @* W3 [
                        size = cnt * sizeof (long);
. d( h( `0 o% r& N6 |                        /* Restore the original data before leaving the function.
1 A- h4 T, }4 N+ t& R8 m$ s  ^                         */
1 ]5 x. _( M9 ?! g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% e; B9 y0 d8 v- ~* R) q                                addr  = base + cnt;  c; X0 [( G$ |) \! _
                                *addr = save[--i];; U# k0 L3 `# M( w1 r
                        }
4 ~* z  q% A, c" M3 v2 b6 S                        return (size);
$ l0 a5 N  D" S) y9 @. \8 B3 z& f' q* a6 p                }' k4 A+ ]/ `6 G' C# D. |
        }
8 k3 R% A& f  N( ~% ?6 x. w3 M4 E3 E4 A- m
        return (maxsize);
2 O1 g! \5 N* O$ w) i}0 ~3 S6 f% G# X+ f6 V6 [0 A
int dram_init(void)
" F, i5 }5 b+ S9 U{
& i0 x+ p4 u1 f! `5 I, ^        /* dram_init must store complete ramsize in gd->ram_size */
( C! }5 Z* W* n# _        gd->ram_size = get_ram_size(
6 G; o  i0 A8 X7 x; _7 R0 ?                        (void *)CONFIG_SYS_SDRAM_BASE,
7 `% o' A* h" W4 j$ X8 G                        CONFIG_MAX_RAM_BANK_SIZE);
' z& d5 h9 \% B0 m( F1 h        return 0;  {- `( n4 ~. ?
}- ?& q2 u, U4 O- x3 p- }

* J4 m. J( Q2 {* _& X3 M5 l9 Q! ^' J' G! c; j+ Z
4 e) ]+ o  H6 Z% [

$ {! Z8 M6 @5 t; c9 r8 XFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) q' v/ M8 ?* c5 l

3 s  E+ P4 P1 ^% s$ C
6 {* {) o; L. A7 S9 h& |
$ h4 J) W3 t7 K' b





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