标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit& E9 H; G0 v0 e
核心板2:DDR2 256M Byte NAND FLASH 8G bit # R0 e+ A+ e; B6 e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? 6 s+ B: H$ ?$ J7 D7 q k " \' V: \5 G8 P" @$ Y# Y1 x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( T' I u7 _+ Q5 j$ a Z
) W- }* i" j$ ?$ b+ w 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: , E! f. e2 J ?) [1 J! i1 B/*: P+ G1 I( ^. t- ^4 ^
* Check memory range for valid RAM. A simple memory test determines' v0 S: X/ O7 N& K% `
* the actually available RAM size between addresses `base' and 5 D; `* R) c& F7 B9 W* `base + maxsize'. 8 t+ m3 |! ^) `' v/ ]8 N3 r*/8 {* S% o: I9 o+ E* ?
long get_ram_size(long *base, long maxsize)4 v6 {$ H9 x6 G& n* ?0 \$ j
{5 b; O% D; ^" _) e" P* E
volatile long *addr;+ h# P# l9 `& G; A5 x' @& [
long save[32];3 Q. w' N. @4 x# t
long cnt; / _- d% n d1 q+ t7 g9 q5 h* g long val;" u7 q/ F p' D" u1 C5 ]$ q
long size; 5 ?/ h$ V( ?: C, n7 t! I int i = 0; , Q$ m% {5 O3 g2 ^7 H: G$ [( I$ {7 p- y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# N7 p" }' O, b. H9 [
addr = base + cnt; /* pointer arith! */) m7 z" _7 D& `0 p
sync (); 8 m8 A0 r6 ]0 N save[i++] = *addr;/ a0 B! e3 z; k, w* T
sync ();. a* j: k# _, x3 H- q3 N
*addr = ~cnt; ; x( d% |) M8 p( ]- o } / s b0 Y5 b! o0 z8 {! w & Y7 C3 f$ [' K1 W y* K$ y addr = base; ( j1 H# F3 |8 C9 X& u) e( \7 m sync ();/ J% r5 e( x( | b6 p8 A
save = *addr;4 Z1 ~( b2 c" ]' d1 M& t! b7 Q
sync (); 0 V1 ^/ v Q/ Y1 o2 j *addr = 0;" E9 p6 F: [2 _
9 K2 C4 O4 P! Z |5 S
sync ();+ S& `# S6 M8 f/ X
if ((val = *addr) != 0) { " d: E- F, u5 q3 q, [3 M /* Restore the original data before leaving the function.1 p6 l& S) p. Y+ q
*/ # z/ q# \6 f4 Y: Y. |, E0 e# \ sync (); . `9 ^! [0 z. ?9 V1 T *addr = save; 9 ?# D; k- w5 g$ a$ E8 d for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { / T$ Y3 t3 P/ k1 ] addr = base + cnt; + A5 t. m t% h, W8 k sync ();0 a; E; {3 Y3 Y8 Z/ S
*addr = save[--i]; $ z9 u" l) C5 D/ u' [8 l } . m( M, X2 z% [ K Z$ g return (0);2 I' Z! C% m' Z7 p" {! x
}: \ X5 ]0 y v* i, f
) L$ F: t0 M/ i O2 r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { * F9 Q0 [* i# B6 G7 N0 f# | c addr = base + cnt; /* pointer arith! */9 L2 N2 o; }; l% i( Y; S
val = *addr;7 }/ W) b) Q! q/ i' ]
*addr = save[--i];1 v0 ]6 L0 x1 ?( {3 {7 ~5 ~/ S
if (val != ~cnt) { + I* T$ Z+ X! Q( N size = cnt * sizeof (long);3 B5 Q. y' }4 W' d7 W7 c: n
/* Restore the original data before leaving the function.- a' v1 Q/ c1 q
*/ ( w/ b4 ^- x' v, N6 ?8 f$ P0 d for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { f: x; b# Q' ]$ E
addr = base + cnt; 0 r" N) q* K( I, M$ X *addr = save[--i];+ ^3 _! b, [* g2 C+ U j; u2 |
} * Z* w! T' P/ |- F# h9 D return (size); : {4 g' q/ U6 g }; W% I {$ s) @+ z3 F* G
}* s6 `' _! U$ \. S1 r# h/ @3 k$ U
! Z4 c. _2 F$ P, l8 H$ `1 U return (maxsize);, g" t" v# X1 k
}& t2 u5 K9 k' X) j: k
int dram_init(void)7 [3 Z6 L: o. T+ V
{ ! K6 Y- `- F. _6 R8 R: B /* dram_init must store complete ramsize in gd->ram_size *// W- d# Q9 c& v3 h8 D
gd->ram_size = get_ram_size(% b5 B' ^) F. r5 k" N. X2 v. e
(void *)CONFIG_SYS_SDRAM_BASE, 8 {0 K$ x j4 K; | CONFIG_MAX_RAM_BANK_SIZE);; t/ E, P3 N. o
return 0;5 r- M8 I* q! j) }+ i. b
} , L5 K( y2 v8 W2 C . `* R, G# ]" @$ e* o/ P/ @( C! _ ' T9 m& i( O. |' L$ V; [ o' z2 n5 ]1 X
% r9 Q4 g f3 F9 Q& T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! p* a9 u! I) }5 ?2 X8 E, J
; \% e# z. k2 K1 \( r) ^* r7 G