嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 i0 ^6 n; T4 T' E2 o+ R; E2 [
核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 `3 T, |0 U1 F/ I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) n2 Y7 D" C/ ^7 F# ^
) P* }2 D9 v1 e, h/ Z! q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 ]$ N# j" y2 N5 l
8 M& j! ^- a/ [# M2 e4 ~) g! U
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 q1 J  Y4 x! z3 j2 X9 c6 o
/*
0 }7 g: a1 H: x7 p# a* Check memory range for valid RAM. A simple memory test determines+ h+ u  e! d& j; N, o
* the actually available RAM size between addresses `base' and# S" p& v& ?1 D1 M. t! \3 r4 Y
* `base + maxsize'." E3 }0 p. k$ L8 W
*/" Z" m$ k4 Z6 ~# u
long get_ram_size(long *base, long maxsize)
! ^" L) z) z8 ~{; y$ N3 c3 p" V3 Z% B2 j
        volatile long *addr;
* U+ ^5 ?, @9 N) w# x        long           save[32];  P) @( G6 d$ p9 `- `& E' X+ J
        long           cnt;$ p# b7 r* X7 c5 n* W" t3 S9 l
        long           val;
/ p8 G& g- T9 d* c" _+ u; }        long           size;
& W# n. r' f& d, V  Z  f. V' e        int            i = 0;+ G  P+ u8 U* t* ]

! ]5 O  M& w0 Y. m        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, O8 _* C0 ^3 I6 c8 ^) P+ D                addr = base + cnt;        /* pointer arith! */: z+ y2 \* u! G6 S2 @+ S
                sync ();$ i; V4 p! e) F+ n) x4 u
                save[i++] = *addr;9 v0 a" P- q9 P
                sync ();
9 H1 ~8 R9 \/ @2 ~- v6 m% ]                *addr = ~cnt;( h+ \. j0 p5 `( g& N
        }9 d2 t( w/ Q, X6 ~
7 D* h' C5 |- n3 q0 j+ A
        addr = base;) M+ V3 y7 B5 n' [& }' x3 u/ j6 v
        sync ();6 U5 P1 @% G9 T5 l2 `) C
        save = *addr;
5 Q$ J: B6 U# n; T' h' J) p- V        sync ();
8 k0 E$ z' j. f9 t4 }( S        *addr = 0;4 ^) L  O! M1 V* \5 U  F! X4 J) J

) e& X1 ?6 J. s0 t; g4 ~. S% t9 F        sync ();  V, J( t! [! R' D/ O. [$ R
        if ((val = *addr) != 0) {" L. M6 \  F' J0 j1 M3 h
                /* Restore the original data before leaving the function.
6 V/ _* q9 O4 W; o9 f; Q$ _                 */
( a1 V* q8 u. u3 c2 `& c                sync ();
. F. R4 `0 K+ T' E/ }                *addr = save;2 Q) _. Q  Z. k  u2 D: P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' K& `! L8 C" e) E: _                        addr  = base + cnt;
# v/ \# W8 a. e6 }                        sync ();) l$ V4 C& a. f# y; W
                        *addr = save[--i];4 z+ D$ |6 X( a% G$ Q
                }
* j$ X, R. i$ ~2 g0 t0 `5 N                return (0);
. ]7 j' ~2 d( Z8 k5 q        }$ V7 {3 {2 _1 D0 Z: ]% G; P
* i6 m" h0 I; \" H! [4 M& D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- P( H6 U9 d1 n2 m4 [5 j                addr = base + cnt;        /* pointer arith! */
; M5 s& v" U6 e) g' d" Y# |                val = *addr;
4 s& ?! X& G) u; e* N                *addr = save[--i];
1 L$ b! N: e8 g+ x: ?* j5 ^- {7 `                if (val != ~cnt) {
# s; s7 I' C9 R% r- r# H                        size = cnt * sizeof (long);
2 y& s4 `$ v4 B4 ~. c                        /* Restore the original data before leaving the function.% `6 r! [9 E2 O! P2 l
                         */
) G4 x0 z+ x2 S( b& \0 ^                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' Z' o: [, `& s1 @
                                addr  = base + cnt;& S" {6 W2 J6 B
                                *addr = save[--i];
* l5 b. `' A( K                        }/ b, k0 `' r9 X, I0 M' U2 f
                        return (size);* @  m6 A: ?0 w  M+ n3 c
                }8 F3 n. R1 _0 Z) ]" Q; N" C
        }* |) `" v) h* d/ k4 Q

( ]; W' J) ~; X$ A" K        return (maxsize);
) k6 M4 k0 C0 O# v}  m" J3 S8 X) C8 c" i; }
int dram_init(void)) S% R( D& b  c8 }6 Y5 w8 Y
{* H# z' b+ Y0 v( A0 m
        /* dram_init must store complete ramsize in gd->ram_size */
9 t. |+ I& y9 P+ \" A        gd->ram_size = get_ram_size(
4 ^5 X& i+ }  ]                        (void *)CONFIG_SYS_SDRAM_BASE,7 c7 i. X" l* N
                        CONFIG_MAX_RAM_BANK_SIZE);
* c' C* }  E- i        return 0;) E( s3 ?. R9 P! P
}) y6 F+ ]: O" V8 k6 p& q
+ r& o& n0 }7 p* K( Q

1 {  G7 a+ Y2 f" [* e9 m! P2 i' E2 X
7 S- _3 B2 w9 |: Y' w6 q) Y
4 D- p3 V! r5 g" ]4 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 Z, F! w" D  h# o) j

- O! o- S3 x, ~6 O+ L9 a4 h5 i$ X2 _8 q
& w, D$ O) [7 n8 [) K+ m





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