标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit* k) |3 J; R: c& L m7 T
核心板2:DDR2 256M Byte NAND FLASH 8G bit # Z5 R- ?3 Z) Z( ?2 f6 n这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? # \) x. p; ]* J) a" |. S5 C1 b* P% V# T6 D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 f9 B# O* h% w& R" E# t1 ?
F7 w/ ?; }# ^ 作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 q0 i7 G7 s7 [! Y
/* / E) B* [ V! i- J4 L! D$ M8 k( q* Check memory range for valid RAM. A simple memory test determines 7 V, ~8 @1 J5 s4 d8 ]* the actually available RAM size between addresses `base' and $ L8 v+ H8 b4 J9 J! T8 G% ~( ~4 q* `base + maxsize'. : G r9 W2 Z q& I0 V9 j( Y( v$ U5 ^*/* P9 o+ I7 P; h" u p+ Q) \
long get_ram_size(long *base, long maxsize)) }# w2 u6 x9 P8 b: q$ H
{# y# I7 m8 e6 [. t- d# j
volatile long *addr;) j c8 t3 I3 s6 j! a A, _3 J
long save[32];9 @- W: e! |4 L1 S: ]( L
long cnt;7 f6 ?% L2 `) R# U9 d
long val; ! N# C( w9 q+ R! Q8 ^: C" t& P) L long size;, K( t2 i/ G F: l$ m
int i = 0;$ W6 G; _6 m7 O9 ?- ]+ v& |3 q- V
1 Y+ k y8 ~, Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { 1 ?; R3 T, X, S! g addr = base + cnt; /* pointer arith! */ ' H+ R# P6 R D% _ J) B( s" c9 k Y/ { sync (); 4 @* t* H9 C. q- c save[i++] = *addr; # ]9 N0 C: c, B4 I sync ();' v) }# {! _ G% s( _
*addr = ~cnt;) t/ {) ^( K( n, g* ?
}( ^" [# [6 ]6 \( z+ K" H7 A
: r1 h- ?. L% F% `' y addr = base; : L1 w' R0 _. O" e, R sync (); . D1 G) |! \0 S/ L- Z4 K7 d: E save = *addr; + ?3 k. U4 h Y c sync (); 8 ^6 ^* {. V3 m7 b *addr = 0;, Q+ U { t9 S h
4 s) @$ ?) J9 Q$ F3 q sync ();4 t$ {# w0 q0 H& S
if ((val = *addr) != 0) {: f" f2 ^5 @6 z
/* Restore the original data before leaving the function. + A5 @' E6 e" e; M3 L! g1 B$ c */ * Q% h* s& Y* V R sync (); ( ~: M Q5 `( F$ x" ]1 ^: n$ k+ S *addr = save; 9 ?$ V7 f$ e% ]* r for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { 3 \- S4 E* j& F0 X3 s6 E addr = base + cnt;, t s! ^; r. t# P8 N# W
sync (); 5 [+ W1 X9 u) X N" K# Y8 B/ o *addr = save[--i];/ [; Y5 G' q: a6 ~& t5 E4 S
}+ r2 r6 [5 I; g. _: E
return (0);, h! I l$ \, x6 @
}( D7 Y- u, X5 v+ m
$ H! `8 N- P+ @! x7 ? for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { 6 ?, j( \$ Q6 u Q h1 ^- t addr = base + cnt; /* pointer arith! */$ @+ P' N4 d0 s8 A6 g1 k
val = *addr;1 P( g- E" B6 @
*addr = save[--i]; # m7 Z/ H2 j9 n; D+ P if (val != ~cnt) {3 g$ [4 `; f: T) [1 R) |! y" T6 r
size = cnt * sizeof (long);0 P# c6 w3 c* [
/* Restore the original data before leaving the function./ Y1 \. S q( {$ K# `& \1 S
*/1 }/ ^ K" S* O. L! K* e' I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) { , z7 x" T& k5 Q$ v1 I# s addr = base + cnt; 8 b& x" X6 n: j0 y/ ?7 c2 A& h *addr = save[--i];& I& [. U" e2 ]6 Y* s1 D- C
} 0 f9 s0 y/ H, k( L5 t6 p Y' o+ X return (size); , h+ y: u i! n, K: `+ @. S } 8 u9 H& R1 z8 H: L: m' m0 ]4 ]. J } ) N: K8 r. d, F+ l, W8 C2 _$ D: ~( k q0 V+ ~
return (maxsize);, H3 U) h* f- o
} 6 e9 Z+ `2 |! v7 f5 Xint dram_init(void) & d$ b8 m+ T* q6 N( j{ ! p) s4 Z8 B9 f' |, {6 ~" e /* dram_init must store complete ramsize in gd->ram_size */ / M; b+ L2 P# e; M gd->ram_size = get_ram_size( # K" I/ d2 R$ E (void *)CONFIG_SYS_SDRAM_BASE,( {; ^; m8 N" ]. R2 k1 J x
CONFIG_MAX_RAM_BANK_SIZE);3 b: p1 J! s0 f+ B/ \
return 0; ' s( R: }7 j7 w; t/ e$ M}5 a' p& S* d& `
# [8 ~8 n6 R b( o9 Y6 c
% z5 Z; Z2 y5 Q6 ]- E$ {' ^; i! c, y) S
) E7 Z, [ o) I' U6 L9 W( l/ V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 c9 B# \ ?1 J6 N @
}9 ]% B5 D4 j8 o. X/ \+ l) n# Q
2 i3 ^ P8 {8 i7 t8 b 1 v3 q5 B) K& |