标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit7 |# z0 Z1 Q4 S( P) r* W
核心板2:DDR2 256M Byte NAND FLASH 8G bit 5 M8 e" o& _( W. K4 E5 M, m! c- w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? 5 Q* f6 y/ n t) d t0 v T) M$ H& p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? A% c: w0 |, H6 M$ n* \
/ Q( z9 I: z& y+ o, Q6 ^ 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下: 0 O/ {6 ]- I3 h2 W p/*9 ?& q4 _8 c" s
* Check memory range for valid RAM. A simple memory test determines0 i' _! C/ q; a( ^2 V+ s7 h
* the actually available RAM size between addresses `base' and3 Q+ a7 T6 I; i0 u7 P6 W
* `base + maxsize'.8 k0 ]- h4 Q0 g8 `8 ]% ?
*/ 0 a/ L$ v J0 R) _4 x# q! ^long get_ram_size(long *base, long maxsize). G0 f+ L5 Q, b0 S3 h5 Z
{ # E' r, o K0 m3 ^$ }; E# { volatile long *addr;# E/ j! G) i, I5 d7 q7 U
long save[32]; ! ]) p. {) p) O( h long cnt;. ~. n2 t6 A- N/ N& S+ F4 C0 b2 {
long val;9 ]( a2 g+ L1 {; { D) L$ ~
long size;5 E# q m# ?" p" k+ p
int i = 0; 7 k0 i, j. {5 H! Q+ |- _/ V }# B1 g/ H- }# S4 k% |, O; p for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 U1 @3 d8 d4 J( Q& k8 e
addr = base + cnt; /* pointer arith! */0 V# x6 q0 [" a
sync (); r5 C4 q5 Y" A$ u& d9 {: n: w5 V! S
save[i++] = *addr; 0 [/ i) s6 D" ~* } sync (); 6 l$ e* w7 D; @" Y# A4 g( L1 h *addr = ~cnt; * ?6 U5 P3 ] P5 Q; D& D) _* _ }. t, F* n5 j0 ~8 Y
: `# G* X: C! V0 T0 n$ j
addr = base;) X/ _8 A' \" C! A9 g
sync ();# x r2 k# U% }/ Q" k
save = *addr;+ L% e: z- C K$ y; T
sync (); e. E) X- y9 }* I6 H5 K% R- h
*addr = 0; k+ T& V) \% Z5 O( P& U& F5 U7 D3 }. M( F* Z
sync ();! F9 V! q4 t! ~1 i
if ((val = *addr) != 0) {* I/ ^& I, \3 F1 T
/* Restore the original data before leaving the function. ! N* I, i! W- h4 v */; |0 y7 }" |( o" I# I$ o
sync (); ! R5 X" J. @/ W$ c# W3 j *addr = save;0 u! k* N* m4 z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 G# Y0 g7 r' x7 b0 Q& L' B7 m
addr = base + cnt;0 L# M& _. K3 ]$ W
sync (); * ?! K+ Z. u, n *addr = save[--i];9 J+ M& d* \. @+ T, C: M& D1 P+ y
} 0 n0 d( c% o* Y* N return (0); / }8 { t& g( E6 A: _0 q }. s; n9 h. T* W/ a
( ?& M% V) _2 g+ K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 2 L, ]/ |+ t+ L( K; V addr = base + cnt; /* pointer arith! */* G( ^; E, t8 s& W! `% W. ]
val = *addr;6 Q% ~/ {7 ~" r: V, l
*addr = save[--i];: F7 j2 a! V3 b5 c: M
if (val != ~cnt) {; o/ C8 y; W, X C
size = cnt * sizeof (long); * [8 I7 v, B- ~& w8 @ /* Restore the original data before leaving the function. 7 N3 U3 y$ z% m9 r, S */ ) X- V, B4 F9 p7 A8 N/ Q; J# Q for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { , L/ W' d; G3 R$ h$ a addr = base + cnt;5 ^2 H% L3 ~: ?. V, B
*addr = save[--i];6 R0 K R+ Q# Y2 @6 X& J2 x6 w/ a
} 7 i. w* H1 C+ o; f( Z7 t4 @4 b9 l return (size);9 r# E( p1 D0 {1 C) @) B
}8 A% c2 P( @: y$ f. U* `
}/ ~" ?( b" z8 p8 ?, S. c
7 Y `& C8 C9 ]: v
return (maxsize); % ^( `8 x) J+ w( q/ H} 7 t* {% S$ f5 K" f$ x. mint dram_init(void) 8 J& ]; g8 _6 x- j5 u% p{ $ l. n* r8 _4 u) V- l /* dram_init must store complete ramsize in gd->ram_size */2 ^1 g' o! V# o- V8 {
gd->ram_size = get_ram_size( Q1 Z- S, V# n9 I5 h
(void *)CONFIG_SYS_SDRAM_BASE,6 x W6 a6 h2 F% W9 w5 [0 y
CONFIG_MAX_RAM_BANK_SIZE); + U% G4 f6 T0 H( u9 j return 0; " z4 o( z% i- p" E! ?6 p2 ?} ; B- c8 a* x/ V: i# N7 K! _. h# A! i" }2 p, R
$ O+ F$ ` \# j) \7 G' ]& M p s
5 g* H) K: ?2 V, x& ^
( Q7 h2 f( w; j$ @! @5 {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! ; v# g) o: H* ^* q- s, z ) y: u6 W: g$ a! r" \ 1 B) ?2 p1 j; F" j8 m; Y, s ' l2 z) C6 p. s' F9 A' o2 r. R C# M