嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: i, O9 V4 l0 y, T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ W: O* j, m' Q1 }+ {1 ^5 _8 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& z7 ^8 R0 @+ \4 u' x4 j
& Y9 k& {# j# P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 @ @: D2 b9 @3 i# T7 g# W4 n
/ R5 c) ~7 y D# Z6 d( H. A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 l4 Q6 I/ P: ^
/*
, K7 y8 j+ c: @0 k ]5 S# ~
* Check memory range for valid RAM. A simple memory test determines
" w9 M* _8 K7 Z& Y
* the actually available RAM size between addresses `base' and
4 D! |$ E2 V5 J3 y3 u1 k E2 L; I
* `base + maxsize'.
1 M: ]2 r! ]: d! Q
*/
* a; Y/ X' a( Z* b7 V, H- S% A
long get_ram_size(long *base, long maxsize)
5 P& N+ w( p0 r; n
{
( g1 U6 v* ^% ~# F% p8 s
volatile long *addr;
8 x" a$ ]2 N0 o* }& h
long save[32];
3 i! u. ]' {, X) p, g* j
long cnt;
. u) y' N( h8 M
long val;
% i/ a; O0 |- l( [
long size;
: {! b# L, ~: ~1 e
int i = 0;
0 w& B% P/ N. U7 |. T
5 w( n1 b" z* F% }& e
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ g$ ]! T' U# H! }, h, p" u
addr = base + cnt; /* pointer arith! */
% j+ H/ Z% X+ g- L8 W7 w8 b
sync ();
: W# |3 D2 c* J# G5 E5 w
save[i++] = *addr;
* E: A8 b5 p/ N
sync ();
# L4 i" K, q7 o: l* O
*addr = ~cnt;
: j$ h: @0 W% t4 ~% {: d5 F2 J
}
& j: \, p9 A8 C" U" h
: w# C7 i: w* s' w- T: u' _& k2 i! Z
addr = base;
' `) A4 I7 `0 n( Q/ {5 p
sync ();
% Y( g& p: u' p; `; ^9 M. e
save
= *addr;
) c& q% ~3 y( n* l" m( }, C* m
sync ();
, Q% ]! i- n0 }: H2 j: f
*addr = 0;
" ]! s2 h& f6 D% L
/ \. k- L! Z& Z- r
sync ();
8 \ K& o! t* b7 F3 p2 R
if ((val = *addr) != 0) {
# g0 }: O! D3 R0 t
/* Restore the original data before leaving the function.
* P6 a1 U. W5 _, j
*/
% N8 @8 G. R$ C5 b7 D$ k/ T9 K
sync ();
) G0 d" q7 J% m5 o; R% h. @
*addr = save
;
; h; S" L( m8 U* N0 C+ r. Z4 p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 I9 x# x% J! m8 i1 A. ~
addr = base + cnt;
& ^6 ^, y6 U o2 v" R4 D6 \! \
sync ();
6 x' h8 `. x H+ K0 p
*addr = save[--i];
( A3 _) e4 F& M- }* Y8 l
}
2 y0 V0 m n, Y
return (0);
% [" `; y; B- W1 p( |4 W1 k
}
# ?# H; F$ ?1 d
* a. U! d$ Y( x' V# u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 k3 a! ]; l, R; X* a" e9 K: _
addr = base + cnt; /* pointer arith! */
1 y& a6 V" d3 T8 J' _' N
val = *addr;
2 _( `" Q8 g: I4 Q2 K
*addr = save[--i];
3 o, a9 q, k( I
if (val != ~cnt) {
6 d2 ?0 a# i& y9 ^9 r: F7 r
size = cnt * sizeof (long);
1 u2 i1 J P) W4 E ]( Q H
/* Restore the original data before leaving the function.
/ g; u6 {6 c8 f. P9 q2 `
*/
$ s+ |2 w8 H2 `7 d3 @4 V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 e0 z( ]$ U' R
addr = base + cnt;
9 e" _7 \( [7 m2 h" E. Q
*addr = save[--i];
3 L5 [9 ]8 q" G* Z9 a* u i
}
6 u% u" m# x" n- e W: j+ i0 Y
return (size);
* {( a2 p. Z/ [/ Q2 h7 l; f1 f
}
. y5 \& _; y1 m8 J1 v( h) p- g
}
3 K- J" p/ g: K: D( U; l
7 k: S6 s5 r" f
return (maxsize);
9 p5 A% b1 d& H+ Y1 F
}
0 m8 {3 G/ V# H, N
int dram_init(void)
- }. O5 D/ t% }' \
{
8 ], B& u7 j- {. T5 J
/* dram_init must store complete ramsize in gd->ram_size */
5 K/ c' \; M# Q# b4 T
gd->ram_size = get_ram_size(
" R% ]0 Z( A) H7 V% m2 f9 H
(void *)CONFIG_SYS_SDRAM_BASE,
9 g# L/ m1 `' B; } O
CONFIG_MAX_RAM_BANK_SIZE);
: R7 h0 h! l/ A! `' m" b5 H
return 0;
2 ?, d# b. u5 Q$ D4 I0 X' ^# ~* e
}
. y% U4 g, @' ?9 ?+ D+ \, b
. b' A0 \8 p t
$ Z& W% A1 f2 e) l* o V9 |% {
( `# f. e$ {0 C, {
$ c) X+ A0 o! m7 }/ V/ y- W# m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 m1 l0 g, @* @ i
3 s; u4 [- P/ j H4 p
/ R: g. k9 {: T4 B( P9 ~
2 ^3 F0 m: G2 R& k9 d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4