嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' H. i: p' M# {2 W& o4 v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* m) C4 E& I& Y2 @# h/ W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 h. T/ Q$ I2 L1 T0 V
2 N" S0 @: e3 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 d) z4 c. b5 A+ S# K' e
6 x7 K' g' t$ T0 W; @9 [6 B
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
I |8 Z$ d- \) H5 D1 S
/*
, o( C: l3 ^- b9 e5 O' d
* Check memory range for valid RAM. A simple memory test determines
0 b; m4 } g4 t- G9 z8 Q) i6 _; p
* the actually available RAM size between addresses `base' and
& c( C( d0 B5 |; G# k, B3 l
* `base + maxsize'.
" d t9 @) }9 `/ S# a. ] m
*/
2 B, C; Y/ ~1 V; D1 k W2 S9 a
long get_ram_size(long *base, long maxsize)
; t/ Q& v% ]" m0 x- Q& x1 ]
{
) x0 O7 g. z" c' K0 r1 g) t
volatile long *addr;
; E; |" I& i: N: S; i: X% m
long save[32];
; S% V D2 p) b t: F/ a
long cnt;
, d- `6 S& \% O) w; [
long val;
. ?$ A0 U$ h! e
long size;
4 Z( H+ e' y8 M3 E
int i = 0;
: o: s; O5 V# J/ g' N6 J
& k- z8 O R- S0 o2 i# ~5 L0 a0 {
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# y/ P3 R: ]) C) ?! C" m* ]
addr = base + cnt; /* pointer arith! */
1 w# [ N0 f% k/ v% \
sync ();
- P+ V5 ?" M2 t8 s9 W
save[i++] = *addr;
0 y/ a+ \# d9 F! M/ \# z4 @
sync ();
4 x- i- V5 ~! ]2 ~7 i% e& F
*addr = ~cnt;
. }; @7 I; M* h; a* m2 c" [) ~
}
, O8 A* E& F; ?
( W& S* J, C$ W- z
addr = base;
, ]8 ~; K7 E; F5 P& ^3 I+ f# c
sync ();
# Y6 X, Z a5 |
save
= *addr;
" W/ J: o( }- F: b8 \
sync ();
& p- u4 n2 d& X
*addr = 0;
8 J& G* g+ B; f. e7 O9 n
8 e; d% P3 r9 T+ \' _* |4 ~
sync ();
5 [9 i* A: E' e
if ((val = *addr) != 0) {
( E7 Z3 h* e: ]
/* Restore the original data before leaving the function.
* f9 p J) \" p+ _9 Q) n3 Z- Q# v
*/
2 `% F2 d1 a4 e& K2 {, \
sync ();
" g9 e# L1 i) B
*addr = save
;
3 \% a% W& r! o# I7 x
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 N5 ]- j1 j7 z0 M2 o/ S/ o: Y
addr = base + cnt;
% M3 n% N: j- g* \
sync ();
: Y9 T Y% v' o) }9 e
*addr = save[--i];
6 P5 y0 x% F( j0 k
}
+ w- [ d/ O0 N6 A3 a
return (0);
1 _, l4 ~$ o# w0 e
}
& i Y9 N9 @) D5 L
4 v9 U# a& }2 S! L9 i' h5 h* @' o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* U# W- {4 T3 f+ Q8 _* [, R: n
addr = base + cnt; /* pointer arith! */
2 B. z6 k: A6 t" m7 l
val = *addr;
2 I5 |9 C5 w, X. n: _0 e
*addr = save[--i];
0 B% z1 _' H F8 Q) r: D+ l
if (val != ~cnt) {
; u4 U. |% G( D# ?# m5 i, @
size = cnt * sizeof (long);
2 k8 n! a- b% j# [! {$ |
/* Restore the original data before leaving the function.
6 T7 W8 ~3 ?$ p }8 d+ Q' F# y& _
*/
4 m6 u( c* k, ~) r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" B' A# m+ e- V Z1 h! p8 L7 @
addr = base + cnt;
6 y3 S% B) s4 l. p0 T/ a& E
*addr = save[--i];
- J; G# C; O+ @' r
}
" k Q/ l* U9 J0 j c1 v" y
return (size);
5 E; n. z2 y% l/ }# J5 S
}
+ O" D$ K; j2 B1 d8 Z
}
# H3 o# {3 s7 L: B" @' Y( J
. l8 p3 `! Y2 X# [- F) h. G/ i: W" k' }
return (maxsize);
/ N' \0 \+ B5 I: U/ _& Q, ?: K
}
3 e$ z& O8 l8 b$ `8 S/ `$ B
int dram_init(void)
% Z3 ^- F5 O3 G8 C+ e& d
{
' `2 w- [! z" y5 T
/* dram_init must store complete ramsize in gd->ram_size */
P: l# u0 o+ p, I* y6 w. E
gd->ram_size = get_ram_size(
, u1 L! C8 n' H
(void *)CONFIG_SYS_SDRAM_BASE,
" Y- R* a: N4 l1 [, [3 m
CONFIG_MAX_RAM_BANK_SIZE);
! J! m ?9 o f' Z9 P
return 0;
8 A: x8 H3 h7 G0 Q
}
' X1 T) h2 L# z
% d6 {! N! J5 b9 e+ u
4 E8 {. b! B5 Z% _6 t. @& k$ r
8 r* z: ^3 i) v
! }5 V3 {1 V) K- i8 L' u3 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ x: E: l, ]9 w& a3 t) J
/ m1 M# M5 U d% ^+ u" q( p
, A4 D; S, s @( U. ]; G1 D8 J* p
; ~" p6 K1 y1 M! I. @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4