标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit 0 X) ]3 T8 M: s. i/ B# V" i$ m6 |核心板2:DDR2 256M Byte NAND FLASH 8G bit 0 q R7 }# j5 b1 o, _* B2 z `这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? " \1 ^" C$ B7 o x, \3 x; @# x, h+ N& G$ I% Y _6 t9 {2 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了? . A4 t; l4 u$ N- ]5 ^- Q . A) N( J, y; r/ N作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' F/ k! e6 _6 e
/*0 C; @2 Y" b" a( Q
* Check memory range for valid RAM. A simple memory test determines # c0 h6 D5 H0 P* the actually available RAM size between addresses `base' and * b, X7 d7 d% N! e. W8 o* `base + maxsize'.6 x" V# t: `7 j- }8 p; H4 |9 N
*/ 6 a, g6 @3 O7 p7 F- Y; plong get_ram_size(long *base, long maxsize) : J9 s7 O. S2 M* D. U" F. o- `{1 s6 y4 W1 d" m/ i
volatile long *addr; : r, k9 y4 m' K3 w long save[32];# o( t( [/ l- P
long cnt; + S2 h2 V& H& F; R, v, m( G; u( [ long val;. @, a/ f2 V" e2 A" g
long size; ' c2 z S" s8 R) d int i = 0; ( F' o' W$ {$ c 5 r3 U$ V: ]* a3 \* L. M4 Z for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; k! ?7 `' v5 r: g' r3 J
addr = base + cnt; /* pointer arith! */ # ?" |/ n* Z6 F% Y sync ();- C+ N$ H# a- g' {/ e0 H' D) j) r
save[i++] = *addr; 9 z+ p4 {3 ]# V2 v sync ();. o1 _" s2 H7 S( o# ^. W
*addr = ~cnt;6 [: t. S+ Q$ ~6 ^. }' g
} H, |) H# c, ~* D { ( t: Z/ g4 l2 F$ ] addr = base; ( b: X- ?: A" F E/ N( x6 ~ sync (); 6 E, Z2 l9 }/ L7 }+ o f save = *addr; 0 o- e1 S6 I. p. }) \. D. f sync (); 5 D" r" ~ ?* v/ y *addr = 0; # N7 n& X: x4 ~1 n8 {, A9 L. o 2 u' Q) Q9 F9 a" _ sync (); $ b9 D+ G5 O' |6 v) ~0 O% p- j8 f if ((val = *addr) != 0) {# R# ~5 E% f/ L }
/* Restore the original data before leaving the function. " ~8 K* u6 G. j4 ^1 G */: t0 c- W1 k% Z/ j& |4 K
sync (); ?4 F/ F. H p4 [: w# { *addr = save; j b7 _0 V7 w for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" s" E) M( h2 M5 ^
addr = base + cnt;' v, R2 @$ ]/ w+ T, d3 Z# U7 C
sync (); ( Y0 ]' W2 J; B" y *addr = save[--i]; ; t4 @- b4 c: u' B& f/ S } L2 E5 x1 ~: o+ U) T return (0); 4 S" N/ f3 ?: y [ }3 r7 p0 h: w* f% F) F+ k- a( ~0 _
2 k% @0 f1 j5 H& B; w T for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) { , A) K3 W+ R0 L7 { addr = base + cnt; /* pointer arith! */8 L; t8 v- [& C6 i% Q
val = *addr;, X! T+ g( i# H$ d$ e1 c
*addr = save[--i]; 5 P/ r' ~* e+ j7 `2 ^2 P N N if (val != ~cnt) {9 b8 ^# ?" C- t, h5 v
size = cnt * sizeof (long); ( q1 I( Z% ^% u0 v+ I2 O( ]! ] /* Restore the original data before leaving the function." @1 z& m8 s7 J# e& Q. d1 f
*/ 0 _, u$ R, w* W3 E+ r9 x i, L! ? for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 ?( v# N* U4 }8 v
addr = base + cnt;& b. [% }4 N0 @+ u* ~1 E
*addr = save[--i];( A" i7 ~+ G* @
} 8 U9 K% J& Z3 ?7 g9 f! P& W return (size); 9 Y+ C7 g; @4 q' l1 G- }& Q }' h& n" Y( F. G( t
}0 r1 r) K, e+ I. A
3 S* a( L& D4 z4 s return (maxsize); / ^3 {; z5 R0 T} 2 Q& y5 w1 o& \ g6 e6 Uint dram_init(void) 6 _& p* {# F4 R0 w{5 y! L; L4 y) G
/* dram_init must store complete ramsize in gd->ram_size */ ; C# `% B* D7 H9 P. L0 U- Y gd->ram_size = get_ram_size(. v) Q$ H+ L2 W/ z
(void *)CONFIG_SYS_SDRAM_BASE,4 `: M7 Z3 ]! Z3 W6 C
CONFIG_MAX_RAM_BANK_SIZE); . I- m" K; M& u! n6 K. c return 0; 7 B' I+ @' v% P3 `}% Z7 ?+ v: @9 Z: {! C0 Z
; {' U& {9 Z. C/ k3 S1 u8 I # X6 k @+ o9 ]5 y+ E R8 v, y' Y, U1 K7 h+ [. P0 d, r
& a; E8 U1 Y- l" [3 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! 7 R/ \1 b+ r" Q0 v" N / r" [( L. N3 y Z$ a" `2 y X- g& `* k* T$ p 1 A, ~) Q2 \8 _* g( n. y