标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页] 作者: Mr.Loser 时间: 2014-9-11 09:33 标题: TL138 uboot是怎么区分配置两款核心板的 核心板1:DDR2 128M Byte NAND FLASH 4G bit6 b) u$ a) Z! g5 g0 M
核心板2:DDR2 256M Byte NAND FLASH 8G bit4 T. F( F8 `4 J0 Q0 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢? : j# t5 u {0 F' R $ c% a: x7 u% g& l2 p. B- Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" Q! t" s3 F! R1 G
1 v2 w1 D+ e- P" j2 d/ e1 t作者: 2532609929 时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# H, a5 T' k5 W& {, R; g
/*7 u! s9 n) T( u* C5 s
* Check memory range for valid RAM. A simple memory test determines * w0 I5 D6 B7 k( s* the actually available RAM size between addresses `base' and# n9 |+ f) s8 n3 `2 I6 E
* `base + maxsize'.3 a7 B5 X/ \) c
*/) \* w2 r J# h
long get_ram_size(long *base, long maxsize) " d1 f3 N" b4 F8 A/ F" ~6 H5 b. h* `0 ~{ ; R4 q) {% t0 X volatile long *addr;9 \3 o0 ]. [ c) y; k- G2 y1 S
long save[32];8 A7 g! l" I w
long cnt;) N4 A, h4 ^0 R6 u: C0 v
long val; 9 U+ r3 e5 l! f1 [/ h* i7 ` m; ]0 X long size;9 t. q2 @3 `4 ~' q+ S0 r
int i = 0;/ I9 l- N y3 o" s
0 w' u/ W6 @# `. p2 ` g* ^ for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* W# N# v8 z7 u. {& z
addr = base + cnt; /* pointer arith! */7 D9 |0 o' I: [: ^
sync (); ' t9 f8 Y) N D2 z1 s P- R) U save[i++] = *addr;, \2 Y# I& S- D, A
sync (); $ y5 R7 y7 p# ]: b( e9 Q6 {2 z *addr = ~cnt;# [7 z: _" W1 K6 Q7 V
}9 y% F' N' R; D; G2 l7 \
( j, p+ `( _; G/ h+ g2 a addr = base;4 J" t( q* ?( S7 k X$ P# }
sync (); 6 z R* G, n. ?+ e3 @6 T1 m, ^ save = *addr;1 C/ ^; ?' m* x6 t4 B* n
sync (); # r9 O# A* _2 r *addr = 0;- R4 R& ?' f% E% `$ m& U9 @
/ Y: v6 B. V. ~7 Z& k sync ();4 ^3 {- V+ K4 T
if ((val = *addr) != 0) { " o0 t$ M) @/ y; M } /* Restore the original data before leaving the function. K/ H& S: B% Q6 ] */, G+ K2 F3 x& @3 H
sync ();& V, k" J; L% |! C! m& K
*addr = save;' u$ c: Q- b- z3 f4 J5 e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { $ H3 N# y' W3 b$ H9 ~ addr = base + cnt;2 M# D/ s9 ?9 g: m7 o/ p+ v! g7 A
sync ();& b F4 P* x3 u# f, c: q* ?
*addr = save[--i];' J$ @- ]+ q/ o8 U3 q0 @; w [) S
} ! R; E: E# z9 P! } return (0); 6 P) o+ t2 R3 G5 Q" a$ d( L) b }' l+ j7 E+ D# z& ^. @% [5 z/ q/ Z! Y
1 b2 w8 N0 ]# t- h8 }5 e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 k* y8 Y) G$ m; G, Q2 t
addr = base + cnt; /* pointer arith! */ 1 X" W9 t$ U0 ^% @2 s. f val = *addr; + T3 e1 e9 }8 o( y *addr = save[--i]; 4 b( `7 P7 m4 J+ b if (val != ~cnt) {1 O3 _- a+ o: U7 b
size = cnt * sizeof (long); / p: o9 k7 V8 y* G3 n /* Restore the original data before leaving the function. ) F5 T4 R: n) [6 q/ n9 w: ? */ + m* q; E% \& ]. c for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- z: ~) o& B. @9 M; d M- R" @
addr = base + cnt; , B+ B4 \+ B! D *addr = save[--i];7 H6 M2 s1 z/ f7 N# o
}. _/ I- Q/ C i: P. K4 q2 ~9 I
return (size); + W1 R- O3 [7 j$ i W } 0 g9 Q# E4 E3 `! v' e }- y% Q& V0 W/ J7 u8 k( ^
l* t3 u) c! R3 ^
return (maxsize);* H( b6 q# _0 j9 r
} + x' G5 j- ^# e n' @int dram_init(void) + G! X5 O5 a0 ?3 H3 O7 C1 T6 h{ * P$ X3 I9 D* Y+ ~2 G /* dram_init must store complete ramsize in gd->ram_size */ 4 o1 e& u3 C4 K gd->ram_size = get_ram_size(! { B% T7 o. F5 ~9 I! k6 q
(void *)CONFIG_SYS_SDRAM_BASE, ) d8 U' r! v" @3 J5 ^' x CONFIG_MAX_RAM_BANK_SIZE);8 a; T4 _; F9 @% r8 l, h8 b4 U: u
return 0; $ t& h: T7 @8 m6 t} # _! W" s0 b' N3 ^ E6 r: v' }9 T: m4 Z3 H( y7 s* p! ]+ @1 H4 O, @
" z2 [( L! K2 c0 r8 R5 m/ a6 L% w5 A. D( V8 ]3 N t, {' J( ]. e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助! " G, {: o% S& T Y! U2 Y I6 `+ _' A( b; e/ H3 T. L 0 b5 S$ j3 v: j5 Y