嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: l/ r# d9 {" M1 Z4 ^$ V' T; `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 @' y3 J) ]% F) G, \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. C! n. S# z6 i3 @
7 J+ s) m: s/ h* p4 k+ f' C# L& ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% i. c5 k( N% E5 k9 K
5 Q6 L1 p g. l' s7 h8 v$ p; F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& ?: ^. m$ `4 J2 T0 s9 N/ Z
/*
0 R+ n* y. ]3 k6 F ^7 n0 N8 W8 D
* Check memory range for valid RAM. A simple memory test determines
6 {) N# `; }2 ?8 w1 z3 P$ m
* the actually available RAM size between addresses `base' and
7 y4 d3 }/ o% a" \" r: v. h1 W) L
* `base + maxsize'.
" X: N* g$ a) l
*/
+ L( ]- Y. b/ c
long get_ram_size(long *base, long maxsize)
8 J7 s$ E2 f4 d7 f* I
{
2 X+ Q! B% C: y$ C
volatile long *addr;
8 Q' w, [- `/ t) ^
long save[32];
/ E4 B- W* U/ M
long cnt;
$ c( N+ c, B b& m2 @
long val;
" U$ h1 a+ ?9 a; Z) X) m
long size;
; L' X! \1 M- b3 ^
int i = 0;
2 w3 K; z( N, u8 N; i B* z' } D
3 W- H, F5 w% _5 a7 {% T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% d. ^6 I4 p, ~- K3 c' X" d
addr = base + cnt; /* pointer arith! */
+ U$ r2 U" R9 G9 S" d4 K; }3 F/ g
sync ();
. t ]: N+ V+ E
save[i++] = *addr;
- V- m h0 D- D" K
sync ();
' \3 a- W6 p2 O% `; [+ I
*addr = ~cnt;
2 F d+ ?: Y0 W4 k
}
1 @8 ?6 R2 @" \3 |& w* ?6 S
3 w/ }% G' L& Q- I( f2 v( s
addr = base;
: \3 z7 x6 ^0 e: r& S" f& }
sync ();
9 i# v, T2 z8 r, X
save
= *addr;
/ x3 T1 o+ g3 e1 \
sync ();
7 K. J% N6 G/ e; T. _! c4 t
*addr = 0;
. k0 C2 P& c5 h9 D1 D1 M' ^5 U% G! K
% |; {, r: v$ [: w2 p9 D; Y
sync ();
; h! f9 ]' W* D) U6 k
if ((val = *addr) != 0) {
7 @" H8 P2 X: P/ f! a
/* Restore the original data before leaving the function.
1 w! i v8 e; g; u% K
*/
8 \' V! r9 d1 ^ x' u5 V) N' M4 x
sync ();
4 a& O/ l7 N5 k0 N% o d" H
*addr = save
;
2 x5 Y. ?, ~, e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 a# Y7 D, |2 G: {
addr = base + cnt;
; i$ O& X, G z6 s7 F; M$ V
sync ();
! a* ]6 [, Q0 O+ Z" t: L
*addr = save[--i];
- h0 a/ x) u/ f) c5 y. F0 ]
}
+ U/ x" J! D. I* u/ C, _, ~
return (0);
9 S' \+ @4 s) r" {0 r& Y
}
# u; o$ G Y8 K5 n2 a
0 n& ~" _$ @8 U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 g1 f, ^/ e+ C+ f
addr = base + cnt; /* pointer arith! */
( a1 e( s; k0 A
val = *addr;
* t- P' B% Q3 A- B6 `) N( {
*addr = save[--i];
1 T: d. Z( d( \
if (val != ~cnt) {
" B& \8 F7 X# r! O2 o% k8 L! A% q
size = cnt * sizeof (long);
: ^, G7 Z( ]7 D v0 J" T
/* Restore the original data before leaving the function.
( G/ I5 V) `! L [( H( h$ a. _
*/
% g, b, X# e4 e) ] ^0 x9 a8 d9 Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, g: ^, I, y. Q( {" N3 _
addr = base + cnt;
; d) n2 x: H' k* q' k6 T3 ^% \0 k
*addr = save[--i];
9 }' z2 I1 Y. \* n6 N
}
. C1 M/ m! ? S' f( l: o# m$ F1 H
return (size);
' m; B9 {$ T/ R2 }0 h
}
1 ~ E/ { g1 x3 A# B9 c! c
}
$ M/ t# ^, h- c
, v2 Y' o/ m* n! R' ]
return (maxsize);
4 ~% \0 Z- K8 P4 I% S0 J
}
* Q0 N/ A$ E2 b9 D1 h, o
int dram_init(void)
3 K6 p" e# p# d% H/ S
{
2 s; g3 o; F* G1 A4 {3 k. B( V
/* dram_init must store complete ramsize in gd->ram_size */
% [0 e5 `% [! o. E
gd->ram_size = get_ram_size(
8 s$ l$ p& L$ W0 c
(void *)CONFIG_SYS_SDRAM_BASE,
. a( H* H/ K) B% V1 N* J
CONFIG_MAX_RAM_BANK_SIZE);
: N8 Q* u2 |+ I% r! a
return 0;
+ ?" E, J5 P @' b
}
5 c& a& y$ C8 r: a$ Y1 n) k8 g) T' @
- z4 S8 h& f( ~: ~& k% p" U
" E6 K H. I; s! E
. a8 n- |6 n& n
! e R$ P1 f- y- q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 n7 l3 Y' C# [) @3 t5 K* d
4 k4 Z. v! A6 Q) G0 v4 ?
/ y8 V* M- D) x0 }6 S
7 A W/ C4 c+ j( P( W* m. J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4