嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 f; G- x4 j$ ]) L& y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: `( v8 s2 y x {7 q, H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) d& G2 L. G# o+ I
! ?5 L* ^0 A5 A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 b( t% B& D2 R" d+ W
1 E7 \) |8 H- ?* W1 E& N, B, b. F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, d/ Y Z. D' I, V2 ^2 C
/*
# d! X7 V2 _( J
* Check memory range for valid RAM. A simple memory test determines
/ k+ @/ r2 U/ y! Y, y- v* @/ u5 N$ V& a
* the actually available RAM size between addresses `base' and
4 N0 y$ q+ j+ @- j+ y& C8 ~
* `base + maxsize'.
( ^" k! A" k0 W% C5 X5 f4 Z3 d( X4 B
*/
( [& g- G# y6 ^, |6 S, Q5 b: }
long get_ram_size(long *base, long maxsize)
1 Y: U* Q2 ?4 n4 V1 x, J
{
' M0 }) x9 {3 Q, \% S6 l6 I
volatile long *addr;
9 }9 y0 r. C( f0 j
long save[32];
" {$ W* m. T4 P5 N
long cnt;
. X+ d, r2 Q7 I0 v" d
long val;
6 g% @6 s" g; I$ ^
long size;
! L; Q, e2 h# @5 P; T2 w1 [. C
int i = 0;
$ ^) h0 j. n3 s- W& C
) U6 n5 _5 m0 Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, ^; A, F# h* E3 k' L
addr = base + cnt; /* pointer arith! */
+ _, |. x% d# ?5 ~* Q5 {2 U6 i
sync ();
; Q" b8 e) O6 L+ L9 }( O( y, V
save[i++] = *addr;
1 K1 q8 p9 A) x) Z# O
sync ();
( N% S- f1 ?/ V4 S* r6 X9 x. s$ l
*addr = ~cnt;
2 U3 K$ u# s& d" {% m' _
}
8 Z$ j6 K2 c6 H+ h4 I
; c: m' ~6 _3 L4 X& N+ I
addr = base;
7 w% p8 K7 ^* }
sync ();
! D7 P5 X/ `3 K2 O4 \9 B ~: E7 q
save
= *addr;
0 F& g3 R5 I7 M! O% z
sync ();
% B) k% [: J0 f" U' T4 F1 Y' ?: |4 ~
*addr = 0;
7 t6 O* k7 c/ ]4 U: `% [9 p2 ]
' x# B, ^% p% O6 _( b$ S! |
sync ();
, v$ [; o8 K* e! x# f4 S: B
if ((val = *addr) != 0) {
+ S9 D) Q0 D+ E& D, F& _: n2 g* o
/* Restore the original data before leaving the function.
3 G( v2 C* F7 L' h( y
*/
: \' h0 i( ]" b
sync ();
5 S3 s. k2 S& d& V
*addr = save
;
) o0 | w0 E. ~* [; S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- o$ ?- z0 v# P# `7 [
addr = base + cnt;
* k* G4 A0 d. V1 w
sync ();
h- d: d4 o9 U3 `
*addr = save[--i];
+ @' D" D" c6 s! Y v
}
) G9 ?8 G H9 F; d2 N9 G0 s
return (0);
, ]* a: c( U* o* i, O
}
2 `% W6 G, r+ |+ `0 W
) A4 E" l) f! o% u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 N- ? M/ w( I0 M7 U% B$ v* `
addr = base + cnt; /* pointer arith! */
& N0 I2 ], N9 _& x( y; A( P, S
val = *addr;
E9 k% r& R0 d3 X
*addr = save[--i];
- K& D- c9 g- |0 H9 T( C
if (val != ~cnt) {
2 C. I% L) N! u, @0 C e; x) E; q
size = cnt * sizeof (long);
. G; }3 ~7 f8 S/ \7 y9 x" O
/* Restore the original data before leaving the function.
6 i0 _* e4 K% Q5 y9 N9 C
*/
9 g$ s8 Y3 z$ t2 h3 V- s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
e) I( I2 O f4 G8 ^
addr = base + cnt;
" N- d8 y( |& A% l0 _2 v
*addr = save[--i];
9 M7 F$ _: o- X9 q! G1 G
}
) U! i0 L( E; }) N* ?, [ ]% y
return (size);
2 u" ] v0 U) H4 u7 @) i
}
+ s" V9 r* n# _
}
# O. G% a2 B5 K
2 o" o. O% x) d
return (maxsize);
6 }. I2 g& b5 S# @4 ~7 x7 h- R8 K& t
}
9 E( t* R0 J! r: |
int dram_init(void)
) g! ~, r5 {: k/ N( A
{
7 q6 B, e) s& n0 o
/* dram_init must store complete ramsize in gd->ram_size */
' B' R6 k; Q: P% Y
gd->ram_size = get_ram_size(
0 l8 [, h! ~* Z; C
(void *)CONFIG_SYS_SDRAM_BASE,
5 x! ], }3 i6 D7 g9 J' P
CONFIG_MAX_RAM_BANK_SIZE);
7 r6 T9 h; X6 e4 {0 ?' _
return 0;
1 b) D1 o/ c" t F* \" o
}
! J) l2 ]8 T, K! T% y: P% i! h
& i; F6 L v0 Q- p |5 w
% P9 t: C& {. m2 T9 L
% d6 p, b! T' z$ U. b4 z2 h5 o
) ^. A% i0 k: D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 g; B% ~0 y9 ]9 O H! z4 Q% F2 Q
! I+ y( j9 Y) m, z. ]6 O
8 A9 {- S7 l2 Q* J4 @
, k; T& K* L: r0 W& P
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4