嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 j- L6 J6 ~' [4 N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" V3 I: ~4 m* |5 s7 l$ I$ w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' |; w; k/ R+ o) J% C
: R- s/ P, g7 @; D5 z4 y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ T9 |! [" O- e& ~
! ^% u, Z, X5 z/ Z1 N h! D- `9 h* g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" r9 k. G4 F; a& f& d; U
/*
9 r0 f, Z( C3 P. j! V3 z
* Check memory range for valid RAM. A simple memory test determines
; C: i0 @ Y; i- M
* the actually available RAM size between addresses `base' and
9 O3 k+ J' v. X5 }
* `base + maxsize'.
( j5 T* R% v3 C$ \6 m
*/
k5 V' o# _% w2 k+ B. r4 N
long get_ram_size(long *base, long maxsize)
0 K- s# g0 x6 W/ K8 E7 b* |: g
{
% k% d4 [* F2 s7 j9 Y9 |
volatile long *addr;
4 B: ^1 J/ {1 F" i
long save[32];
# Q" L- u8 m/ `# ]- ?/ u/ A
long cnt;
0 o9 L4 A0 v8 w" }0 B" v/ Y! s
long val;
% `$ B+ \- ^1 [( o% q5 q
long size;
. ^& i$ u+ f- z3 r: b0 v
int i = 0;
# z* i. U9 `" a7 d
3 K7 b9 a: N- v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& q# Z; |9 [, r3 a9 {* F% K
addr = base + cnt; /* pointer arith! */
$ N! g' e% t7 e8 [
sync ();
4 N6 `! o! @8 _6 d# ?
save[i++] = *addr;
1 f9 m; J2 I" W; d [9 M
sync ();
6 p; [& M% J! @
*addr = ~cnt;
5 h! s! t# D- L2 B
}
# G$ y! _4 t% u9 e0 P6 I) V: i
( j2 U2 T( z9 W( D$ L/ ]
addr = base;
, F0 f6 i3 n: V2 s( Z/ t
sync ();
! {1 j' g: u) r G! U
save
= *addr;
; O! Q; x3 |! v( m
sync ();
4 o/ t" p1 b. F) F
*addr = 0;
. W: O4 @# H9 G
i& X; L K! W, u. m7 L+ j
sync ();
, M: v1 |# \" h6 x
if ((val = *addr) != 0) {
; q: Y, `, v8 _! D7 Y+ T1 \5 p- [
/* Restore the original data before leaving the function.
0 k2 t: a0 [( E3 d% q
*/
6 r ~/ m5 n. j. B( I, P- X
sync ();
# k0 O% X1 ]! T* E, L$ ~/ E
*addr = save
;
! S& V. S6 N/ b7 F8 \, [) p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 |4 M0 C4 P9 R( q& {5 ?) c
addr = base + cnt;
& F1 C: Z; h# F
sync ();
. R( A2 z' C% V, r' ~! D3 }& c
*addr = save[--i];
$ ?. K @& L# n" ^/ J
}
3 S! d4 @6 |. d3 m
return (0);
6 h6 g: Z6 O, x* }4 O
}
2 |4 k; @. L ^9 D4 Y
( o+ z+ X5 ]3 ~" ~8 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* a4 o# S& j7 y3 \' K6 m' x
addr = base + cnt; /* pointer arith! */
6 ]9 |3 `3 n4 k
val = *addr;
1 B& r, T, |9 b' `& T
*addr = save[--i];
( c; G2 ^& }- }5 q/ j; d( }- Q0 M+ W
if (val != ~cnt) {
+ S% i5 i- V( ?4 q& v6 U6 z
size = cnt * sizeof (long);
0 r, o( r" q" k: a) \4 `7 U
/* Restore the original data before leaving the function.
0 v& W, U/ |9 E9 @& P# _8 u. j
*/
) X% G( {( U5 M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 K, k' q8 C! ?- p6 h* {# ?; B
addr = base + cnt;
% B9 Z$ G6 c. s+ P/ Q# r
*addr = save[--i];
N/ x; S! ?% B4 z* z+ r
}
, X) q! d+ d2 Y( Q+ o
return (size);
3 U! ?7 U5 _' l0 e) z( Z( }# {
}
3 F; [+ W4 T/ A& q9 h7 N
}
" t5 d, q9 K' \8 t* l
( p' d( A/ Q, j" `5 r6 ~
return (maxsize);
0 j" B7 E4 C$ Q" w" }
}
$ A# N. X# g1 _
int dram_init(void)
- \6 ^2 b" f, y
{
0 F7 w( n8 w( K: ^! U
/* dram_init must store complete ramsize in gd->ram_size */
: m' ^5 f" ~8 p H- n7 y7 `& j. r4 U5 `
gd->ram_size = get_ram_size(
) e& \6 ~/ y7 f4 W4 @3 S) B2 |
(void *)CONFIG_SYS_SDRAM_BASE,
5 i6 _8 Z2 I" X4 n/ a7 W$ K
CONFIG_MAX_RAM_BANK_SIZE);
8 ^) r* H' j& K
return 0;
6 f' L9 H @. l$ a
}
- D' X5 D- L h- d% |
8 a8 ?5 F8 s2 r# x
1 k5 V* F7 w( m* f& y7 O
1 d. G I) Y* v: u
, n9 J; X- q* I/ g7 I1 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 \% X9 l, P1 j' y2 C; h
- D, R% m! R: L5 p/ }, |
0 ^4 v& O& N, n J
+ I/ U$ S0 ]4 g m, D
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4