嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 j: h: Y0 u1 C# F9 r, ?1 m
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 s/ }1 n# t q6 o" z5 \7 N4 ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) N1 F8 }# ~9 T+ @5 Y
: T8 Z9 K, x+ z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 J4 J5 L* H; S% k6 R
2 |: L+ U; v, ?4 O, n* E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 j# U; E8 n+ t
/*
# x2 ^/ x" Z1 J# o9 P2 P" l; x9 [
* Check memory range for valid RAM. A simple memory test determines
& f4 v' H7 h8 {- O6 p, b8 S
* the actually available RAM size between addresses `base' and
' N# V+ g9 ]# P V- J( Y+ O
* `base + maxsize'.
( W* j7 l4 i; Z F8 [1 d$ V
*/
8 n7 Z2 r9 A: Q1 |
long get_ram_size(long *base, long maxsize)
' `, f; ?% k( e2 H
{
" J' x7 z, s/ k& ]+ T, W1 Z
volatile long *addr;
* }% r4 F& `7 ]0 f- z
long save[32];
: k2 P5 r( q( x% J+ _
long cnt;
0 ^2 {9 c$ c) {1 P( R h
long val;
0 R8 F2 h/ u( X& O6 a: u
long size;
* j3 K, o" P! j7 M) D$ x
int i = 0;
) n0 v6 P% }* _; s
" _0 ]; X, e; N/ r; ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 \$ K3 k" C5 @% Q
addr = base + cnt; /* pointer arith! */
4 n$ I7 a) G1 U g5 s
sync ();
5 c5 @) g3 m. A6 `2 J
save[i++] = *addr;
1 x+ u; }" y# h
sync ();
( U( v+ L `; }9 D
*addr = ~cnt;
. U' q6 C2 z+ U; q& H* N; h6 A9 [
}
. V- X- N( y9 A/ h$ u
) N9 I+ l; ]& q- {9 O1 N
addr = base;
9 _$ N2 p5 U0 J& `+ |
sync ();
8 @& P- g; g/ C2 j/ i' V" |
save
= *addr;
2 B G/ Q5 v( }
sync ();
; X) ]/ s# K1 t' y
*addr = 0;
7 V, t& f9 i( `
6 N" W N+ J2 [! g
sync ();
2 h1 R1 H! b* ]
if ((val = *addr) != 0) {
2 K' u1 `, p0 q0 ^3 F% @: e
/* Restore the original data before leaving the function.
7 m+ }. N0 H0 B& ?0 D) s
*/
9 k. ]# @3 r* \2 K% ?0 O0 F$ I
sync ();
& f$ n$ L% b9 y/ N
*addr = save
;
* r/ d2 l/ C1 G. r4 Z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' ?9 j# _6 X& b* v% p; G
addr = base + cnt;
; @/ n) e$ k* N' R3 v
sync ();
$ ~/ V. i+ X, Y8 K
*addr = save[--i];
" g8 u1 j! l8 ?# }$ c$ J, k# k* }2 O
}
' O3 b7 M( }; S& `. D
return (0);
3 t) L: B; A1 [( n# G
}
3 M6 a+ M3 H' L; W9 T
0 {' f" W% T4 Y, X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" d9 o8 \) o. J3 Y! I0 \/ ~$ G
addr = base + cnt; /* pointer arith! */
+ X4 f; l& ~+ j. `) p4 G% `
val = *addr;
% f0 P4 E: p1 f- T. V
*addr = save[--i];
4 l `: W1 n* `/ N. J; O1 c
if (val != ~cnt) {
7 o/ R, x e" h9 z% H' p
size = cnt * sizeof (long);
4 A: ]0 ~/ j7 ]# c" q
/* Restore the original data before leaving the function.
! A0 Z4 w2 B# i1 X$ |+ \( q- ^
*/
4 B+ a' u" t6 a9 v5 x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" |0 f1 t6 r# H+ S; S$ F* Y
addr = base + cnt;
! n' Z; a! h o& |8 x5 w; J
*addr = save[--i];
! i" Y0 D; u6 [' _% D/ K1 ?; f
}
- L! h% W$ Z4 I w0 Q# w% ?& t
return (size);
( s" @# e7 r X0 @
}
. W$ x0 u2 T$ ?2 R5 Q! G+ _
}
8 Q3 Y) N/ }1 b* x: d+ a' r
0 ~, ]: W& E* @4 a6 N$ N2 c2 a0 q
return (maxsize);
" V. U6 a6 y0 Z: ?
}
8 D1 A- j! ]6 }: d" k
int dram_init(void)
0 `+ I0 [3 g, R6 v# Y7 V
{
- {+ {! S# _! P V
/* dram_init must store complete ramsize in gd->ram_size */
* E" `; _4 y8 c: q6 _4 M1 w: n1 m
gd->ram_size = get_ram_size(
- d- E# |6 [" [# X# S
(void *)CONFIG_SYS_SDRAM_BASE,
" W- ^: \. I+ H* H4 G$ e. |: s5 C% U4 n
CONFIG_MAX_RAM_BANK_SIZE);
, y( D4 A* y. g' i! m/ L
return 0;
' } }& [, [7 _
}
: y* R; B* }' ~8 [* t( G
, [! ?, W) I6 I: q4 Q: ]
- }& V+ g' N0 T( H
# L% P6 [1 l& H: X' w* _
* f' K; \' e( E8 U% @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- g7 i8 D& j% x% }- ?3 a! y- v8 H
, E1 ?8 ]! f1 Q" }3 W, J
1 t2 d! |4 ]) J# R
2 _; k7 q- b9 u1 G/ Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4