嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 V! J6 s( ~' C- c3 `% E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. ~- c) B0 H+ @& ^: `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' \# o1 {" ~0 f$ o9 U
* R# l7 V: t$ ?. o! Q( q" E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% A) E& r/ ` c3 \2 P. k/ x
: a* i3 P7 y6 f* {/ u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* G$ L8 z7 @* F
/*
/ M/ a9 |' N1 M' z/ B
* Check memory range for valid RAM. A simple memory test determines
* H( E* ^2 I' y) r* s& d
* the actually available RAM size between addresses `base' and
5 n- Q9 G D+ c
* `base + maxsize'.
5 I# _0 { |- d/ Y' h
*/
( u N5 n$ E! \8 t4 Z$ e
long get_ram_size(long *base, long maxsize)
; l1 T/ r, r0 _& N' v* p
{
1 N. }# U4 e9 Z! \, e
volatile long *addr;
2 y: D4 ]& E1 _1 K. c$ E0 {
long save[32];
^. R, @ r9 H, t
long cnt;
$ ?# M4 ^% j9 |$ K" F9 N
long val;
6 N# Z& Q) D! a9 K" d
long size;
( A9 Y1 n0 S0 q+ f9 o8 [. a
int i = 0;
! A y0 v( ~2 N, Z
R, K7 {5 Y8 Y; w% Y S+ ]( i5 m C# A ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( K+ ]! N4 r6 Q( d( A) o7 r
addr = base + cnt; /* pointer arith! */
: {: K6 f7 N( G& c" e! x
sync ();
9 G& Y X5 R* q8 O2 G+ C
save[i++] = *addr;
3 d9 X; z& X7 m
sync ();
$ }- A& @0 c8 P* t
*addr = ~cnt;
; S L# d' U$ ~& U. U2 N0 ?* n( g/ u- N
}
8 U2 ^9 \. s! ]" C6 k1 p7 E
6 W! K& ~9 A3 R" q
addr = base;
, n( D$ E0 w* o0 s
sync ();
1 v2 M6 y% ~) M! B
save
= *addr;
0 _+ F/ r1 e# e, E
sync ();
, p- ~1 L# C. l2 r$ F
*addr = 0;
+ z7 g! ]# t6 |8 t/ p. `- L, ]! t
2 _3 ]6 J( F& b) R6 V! M; K. K# V
sync ();
2 @+ Q7 \% n7 N! l
if ((val = *addr) != 0) {
3 U9 _) D9 c& [2 d1 m
/* Restore the original data before leaving the function.
/ Z" V0 _4 L" ?- v o4 E5 z- m
*/
g7 A3 B& R9 p. p
sync ();
5 N& ?! b2 {/ S9 Y
*addr = save
;
% t' g& }) d8 e" ]) B" S. a0 i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ~- \1 @' T* ]( ^- d* \' j
addr = base + cnt;
+ s$ C4 k) X( a/ `: e
sync ();
/ b0 k( B7 N6 P8 S$ q. k" ^
*addr = save[--i];
0 G+ A: U$ \4 v# ]
}
8 Z+ |3 f$ _3 H" R
return (0);
4 h- S/ D! a; q C
}
5 [! i6 k) a/ w# p/ o2 r( N
; u; n4 Z! B& [+ m8 H* k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
i4 }6 h& h+ Y1 _0 x
addr = base + cnt; /* pointer arith! */
- l: A- W. v8 R1 c% i( c! o& Y8 y
val = *addr;
, u$ X& ]5 |7 t+ s
*addr = save[--i];
) `1 N+ a# u0 ]
if (val != ~cnt) {
* Q; s1 G/ }) @& J! a
size = cnt * sizeof (long);
- J, C/ |: r0 p* H! ~# U, {
/* Restore the original data before leaving the function.
) b& V/ u3 R+ g* H8 q, p, [/ ^/ C! o
*/
/ |* J' j. P4 R% z4 N, P7 C
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' M1 ?. r$ g: f1 F0 W! U1 o
addr = base + cnt;
' p. V, {; `, z
*addr = save[--i];
, b0 \2 ~* o) H/ c+ C7 e l
}
: y( M# ]8 L/ q
return (size);
! j0 l/ V3 P' ?
}
8 y+ R! m. } x4 B/ K$ x0 a
}
9 ~7 r% a3 I. j& T8 s) S
" p% |4 C# ?* g' w" b( C
return (maxsize);
; s& z8 V+ Q- ^- |/ v# g
}
, }* y+ L! Z4 @; @
int dram_init(void)
' G6 L+ }8 a& ~5 p6 p
{
) p, s6 @ `2 X
/* dram_init must store complete ramsize in gd->ram_size */
2 l8 q8 Y' Z# Q7 g
gd->ram_size = get_ram_size(
- G, D: s: R2 ]
(void *)CONFIG_SYS_SDRAM_BASE,
" ~7 Q) @. {. H+ b3 V' D
CONFIG_MAX_RAM_BANK_SIZE);
- r' l: n: K3 g0 {
return 0;
3 u- i9 P. q* P/ |% d1 c# x5 S
}
7 l: U) m7 W+ \! d
$ Y( B- i* z8 x2 b8 f
4 k, @, n/ N/ x+ d; Z
# s& _5 Y, D( |9 w
! _0 z2 U6 B9 L' k! S! M5 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 q1 L0 ^- L6 U6 h+ ]. B: M3 h5 Z) a
( ?2 v0 N, s9 d, j( o
( n& z2 D" K, b
5 k3 @7 d" }7 Q0 v# C: Y; b: i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4