嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 k8 G4 j; d' D. F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 u% Y1 w+ s; s, Z- v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
{2 g0 l3 i9 T" f7 q u" T1 I% U
1 |' F# c$ F2 t7 S5 U" x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. {5 \) T% d# a, Z/ B* x; \
5 v+ W/ _/ k9 Y: z+ y9 [; V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- s7 z/ x* Q2 m; N
/*
4 [* p! o, q: v" j5 F7 W
* Check memory range for valid RAM. A simple memory test determines
$ y6 C: X4 @ x Q% u; ]/ `. T6 ]/ Q
* the actually available RAM size between addresses `base' and
/ F! H4 k! z7 d1 _# Q: c' O
* `base + maxsize'.
/ r( n, n; D0 g2 G: [5 i
*/
" ~; Q) z8 U! \. _* T
long get_ram_size(long *base, long maxsize)
2 E, K" a& p4 e* Y4 ]
{
) G# E+ |+ @+ z8 X2 ?
volatile long *addr;
. g/ V6 a3 X! A1 L
long save[32];
4 @+ L% ?2 h0 z
long cnt;
! ^+ h- f& {0 i
long val;
6 @5 g; W4 \* D. F5 t- M* Y
long size;
* K i' f6 q% T& {. S; o* E# q
int i = 0;
8 v4 t' E0 }! O8 [: |! ]
# ?% w6 W7 A6 E. ^9 h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
_$ r1 P1 ?" h- W' F, N
addr = base + cnt; /* pointer arith! */
1 a: k. |, X) H' f
sync ();
! h6 o) m6 C% K8 T) B6 h, f4 ~
save[i++] = *addr;
2 Q' s! x/ ^% ~) b
sync ();
" i! w+ ~ _0 R" X5 N9 F" ^
*addr = ~cnt;
, W9 K7 R" L, W7 B. k0 G) O* l
}
\, I/ O% D, l; ?1 _5 s% ^, u# j; h
" |5 {8 E2 A, z2 ]; ~
addr = base;
, _' B4 e/ [) y4 a1 z! q0 x( f5 @
sync ();
4 K+ {6 r& L0 E2 ?
save
= *addr;
+ W- B _7 m p2 q/ W1 H. ~
sync ();
6 r4 v& q$ j) d( s" M v
*addr = 0;
9 Y: b5 D9 Q1 F7 ~
& ]% A( \0 C% S; X1 J2 J; N
sync ();
5 m" c" u" R' M9 ~+ p2 H( K
if ((val = *addr) != 0) {
& J' t& M' Z6 k8 k( ]
/* Restore the original data before leaving the function.
' V1 a' c: v( t' X5 S% K
*/
/ N# p7 G2 n: D& j! l+ B
sync ();
4 m. z3 A& N i! X5 f: o
*addr = save
;
( r% }% a6 y; q" X, m% P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, s7 Y4 u3 p, O* o5 {
addr = base + cnt;
. L+ h9 @( ?( x9 x! f
sync ();
: M& A) B% U7 w/ D4 F
*addr = save[--i];
4 ^7 ?6 X) t( o# ]& p
}
5 k4 |& ?# {: E3 S
return (0);
1 s( E9 x( B( V8 \% }
}
* i: j7 n2 N! @4 k9 Y! p X
1 C* S! r' {0 m3 }* |3 |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: \" u# s9 w2 H: P
addr = base + cnt; /* pointer arith! */
8 P$ |$ k: F4 |" a
val = *addr;
8 k2 s+ S1 O [1 M" A
*addr = save[--i];
/ e; ^. G! S1 M: y
if (val != ~cnt) {
# p" j2 P- N9 w: n' i: g2 D
size = cnt * sizeof (long);
% y% P5 U. B* ~. \6 u) c, i
/* Restore the original data before leaving the function.
1 e; L! u2 Z2 e# j1 y" j
*/
; U/ O, d) f) d, m! D \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 T8 B7 g2 X& a; p
addr = base + cnt;
, b, K5 N2 ^! G9 J: t
*addr = save[--i];
; m: d/ s; w% [" _% s8 F
}
3 z# j |2 Y2 W( o
return (size);
6 z8 }& A0 M7 a+ I* W
}
7 J0 [6 e. s+ R6 {
}
1 j5 s& f D d, Z3 a
8 C8 s! j/ R; R, s- [2 n- E
return (maxsize);
6 L0 v9 X! i: o7 \- x( N( ^. B
}
7 L j# P' v( c; n( a: W
int dram_init(void)
( { C4 W! _8 Z, A
{
0 N- w' u% A# [& `; \8 w( t" L7 e* Y
/* dram_init must store complete ramsize in gd->ram_size */
6 {) a8 ]- ~* J, o
gd->ram_size = get_ram_size(
/ M. l- d7 L8 m+ @7 a- t
(void *)CONFIG_SYS_SDRAM_BASE,
6 l; d- |- B7 W* x
CONFIG_MAX_RAM_BANK_SIZE);
' B+ A! q% o) w# E( C
return 0;
" \: c0 o/ N8 P) e
}
7 p/ ?; N$ r! b0 k
: {; q# I4 c. H8 T
. Y% D8 F; a. j3 v5 V1 J! @; p
* I7 U7 Y+ G+ D1 |4 I7 Y9 Q' B
, h, V1 ^, u/ C' W0 b6 d# \% c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 p6 g- T+ I& [8 Z. y7 b8 _1 A
. b8 Z7 {: e7 f4 t O; n
0 |3 p4 `! }( B0 j" F
2 r- M* z' a: R
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4