嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 Y4 {# v; I6 M& u+ l! g1 p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 U/ K2 W: T. E3 w# m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 i5 W" V/ i5 y. T6 x# y+ K) ]
) v, U- v2 R4 U( j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 m+ V- o) n1 ]8 i- |
7 t% [) C5 i" r9 W) C$ P/ s
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- }2 A( L' u( k9 i" T. j% c, e
/*
$ g: c$ I @) [9 `2 R& X* n
* Check memory range for valid RAM. A simple memory test determines
2 q& F: ~; I1 \' \5 H- R! V
* the actually available RAM size between addresses `base' and
; d0 }+ ^6 \$ T9 Q2 r# l" b4 H
* `base + maxsize'.
. {1 b2 a6 d1 E% a. ]
*/
$ U2 ]5 N" [5 l8 b0 R( {/ Q- Z
long get_ram_size(long *base, long maxsize)
s* Y- Y2 c: J4 E6 Q0 [' z! g
{
6 N" L) W# i8 j# U" h; j8 `
volatile long *addr;
% M8 E, ?! a; l9 j6 j* G, V
long save[32];
& _% }+ Q# M2 z. p6 i& l( M4 n- T
long cnt;
* ^' T( ~; _1 I1 v: {0 j
long val;
0 d% L5 j( B) P# u2 B- D( @
long size;
! [, Q* l; P- s" D* o
int i = 0;
) k6 o9 ~* Y4 c( C/ G0 L
6 ^7 Q5 z0 g6 V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( ?& d4 ~: C3 A3 Z3 U5 s4 j
addr = base + cnt; /* pointer arith! */
" T g' x8 v2 @: Q! z# ~6 H8 j
sync ();
9 E% D+ e& @+ [; p6 ~; ?0 n- ~
save[i++] = *addr;
* T0 q. i8 g- | M1 J: ~6 K
sync ();
5 ]1 I3 p/ ]; c3 [
*addr = ~cnt;
' ^. p- T, |7 t, U. v8 k, q. N
}
% U. n/ J6 v" c0 m
6 k$ u5 e1 @: [8 a2 p' ~7 |
addr = base;
1 j' p8 i* C- `! p5 `4 q
sync ();
5 a0 _* U( L( d5 A9 T' L/ ]/ s
save
= *addr;
, d' ~8 q2 K. c- @, S: _) N/ l! I
sync ();
i4 T2 t) R# `# ?
*addr = 0;
0 Z- b: a( G+ e
- {% {( Y4 ^, {$ z" q
sync ();
4 x/ X& b2 J* O
if ((val = *addr) != 0) {
- Y! h) x' i- Y, N7 Y1 u7 F
/* Restore the original data before leaving the function.
2 L+ t2 Z/ h2 b A0 p
*/
! R5 j* }, y! ?; z$ X- b, _ o9 B
sync ();
: i- p8 K Z1 v: O) f) c
*addr = save
;
5 K/ E* v! ~" R8 ^/ X; u
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# B) G) z1 w: W! R3 Y
addr = base + cnt;
9 K7 @# K$ Z7 L3 F
sync ();
1 h% x! R% d9 W+ s
*addr = save[--i];
2 g- F/ h% z- u5 y! }
}
1 l6 _% a- T: X' t3 J+ d+ Y
return (0);
% E% q2 a2 Z0 n/ ~* E L8 t
}
- B& {, @- [) e7 r {
/ r; w5 t, X1 `- E6 o6 r" U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 s( T& V) t3 R% R7 d1 {
addr = base + cnt; /* pointer arith! */
/ w' e1 K& n: {7 Z6 t1 t
val = *addr;
% F- H3 T% j1 ~
*addr = save[--i];
! J* v. I2 s& H3 w
if (val != ~cnt) {
k$ w, r4 w m8 T% \
size = cnt * sizeof (long);
0 ? t% v! O4 ?- l. x
/* Restore the original data before leaving the function.
1 ^* u4 I+ o6 p* o4 `0 a; W
*/
" K7 a: [7 q4 G) m! E7 `7 r+ m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 Q' w- X( w0 Z* r( f. L" C+ A
addr = base + cnt;
! D. G( K [$ r9 y" ]
*addr = save[--i];
2 m% o4 d& t6 g8 ` S V( N- r
}
* T) C& s' T6 F" V4 `' Y" G
return (size);
6 j* d( x' c& T# j( k, _" ^
}
* h; X! s7 @9 i2 f9 K
}
" [ G. s) A6 Y2 o
% M) H5 T5 @( Y
return (maxsize);
3 M, b) i) x7 m+ T0 y( Q. h/ E7 n
}
$ V, g( _. C2 f' x4 p
int dram_init(void)
3 L( u1 `/ @5 b1 S$ x
{
p, m- P+ L/ S& u( r* o/ |
/* dram_init must store complete ramsize in gd->ram_size */
' D+ D) ]! W6 @4 X1 y) j/ t
gd->ram_size = get_ram_size(
; P0 G7 O2 {5 m7 }8 K' g& n
(void *)CONFIG_SYS_SDRAM_BASE,
! R/ t; z2 M: X& a3 @7 j
CONFIG_MAX_RAM_BANK_SIZE);
# m; L/ G# ]8 @- J+ u7 F& t+ X% b- |
return 0;
5 x$ l. Q8 \& Y, H
}
3 e, Y( N9 I, D2 X) {" p F/ T. T
' Y' e- j3 {# `; ]1 M) e
( P E+ Z+ T5 I! ?" C. ^, m& F
4 [* h, R; `& Z4 O8 ]
* w* w' U3 E9 O# z1 ^: o* L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# j/ ^$ J8 G1 s6 E9 x& e- r' V; Y
1 R# V0 D2 ]# `* j
6 k9 l8 |# c5 }! l
7 a# X# \" p7 o( I, G. D- l" \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4