嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) s8 W* e4 P/ |# r1 @& u" _
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# Q0 C. T& n+ O& m2 `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ g7 \5 @ G# F5 J8 w
% Q' l# T7 ~9 r9 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 Y0 N5 o g: i( B, d' v3 \
$ P1 n/ }7 O+ H& `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% Q; R2 A& T6 V
/*
7 C+ p2 c' Y. \7 r8 C9 w0 c$ {
* Check memory range for valid RAM. A simple memory test determines
% W2 z2 W% n2 r& p2 Y
* the actually available RAM size between addresses `base' and
8 Y: i$ N u8 t+ I7 g0 r6 A e
* `base + maxsize'.
7 }" b& {' k# F# F$ y( _
*/
2 c' o- {. P( T# W' L2 C
long get_ram_size(long *base, long maxsize)
1 X' K/ t! l3 N6 k9 X" p c$ h
{
1 A* _2 e' X, R4 @" W5 C
volatile long *addr;
! w) y. {& N2 H: j; X; v3 @
long save[32];
* g% D0 u; M. `' w
long cnt;
" p' R) ?3 U! P( k: I
long val;
, w) |: K% `6 _" o
long size;
, M# \# D( j9 D
int i = 0;
# l1 u/ q& q" r. P
8 P' r" M/ o/ b# y* F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! G0 \* @7 M- {4 B! S/ l+ A u$ @
addr = base + cnt; /* pointer arith! */
( ]1 N9 i( @& l7 x' H- ~
sync ();
9 Q4 G# }0 a, Q+ H+ Y
save[i++] = *addr;
$ o: Q' z6 }" t3 [8 l, `! f# y: _
sync ();
. f! S3 M- f/ _: T6 X. Y
*addr = ~cnt;
( z" {4 D, ?; f- Y9 f5 M9 { a
}
# p- j6 S! |* I1 C
' B% M2 J- a+ K0 U- H; P
addr = base;
5 O0 a' ]0 V% I' M( }$ x
sync ();
& m8 g! g5 T' O1 s8 j0 \6 @& g
save
= *addr;
' [* }8 D, Y3 R1 |2 `" k
sync ();
4 Y- \6 D) j( N7 q K
*addr = 0;
/ p/ D1 m$ |! f5 C, I6 H
* X* I- y/ E( ?2 F2 U/ J, l. _2 G
sync ();
% T: H* [ g0 r( e! y. Y0 e+ D
if ((val = *addr) != 0) {
7 U2 K: w0 V1 f. P1 b
/* Restore the original data before leaving the function.
; m6 W4 W& l+ N8 } m
*/
$ }( t9 \" P; k5 g+ f" M: z
sync ();
+ j% w/ [4 K, q/ @1 ^/ N' p6 O
*addr = save
;
8 K4 q/ u E- }& ]4 F3 [) ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. t6 M6 v# z' E+ \8 p w D
addr = base + cnt;
: _1 R* a. N! _$ o4 @. l' K/ Y
sync ();
& J' @1 ]/ p. v) K8 `/ V& u0 }
*addr = save[--i];
) a+ z1 }/ q4 q3 D6 p5 w
}
( G$ G& a- k4 O/ g; N+ }6 E% [6 ]7 r
return (0);
, q! F3 Z) {/ {1 g1 y9 X8 U3 g
}
5 U& |' L" P* c' R
* v! v% C9 Y1 d' U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 Q) h* k0 s) k! j; |
addr = base + cnt; /* pointer arith! */
& P6 K- A1 `* U {9 ], `1 ~
val = *addr;
5 u" V Q( |' M$ \ O
*addr = save[--i];
?# g* E$ m w; }
if (val != ~cnt) {
Y3 P. @5 g# J( W
size = cnt * sizeof (long);
9 Y, d7 q: @2 `7 K$ n
/* Restore the original data before leaving the function.
8 q4 ~ O5 t7 y" Q6 L& ^7 i
*/
Z Q* T2 ]! Z/ H9 ^/ Z8 m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" j: A2 a1 n0 E. q
addr = base + cnt;
w6 v1 T+ [9 ~9 W
*addr = save[--i];
1 \) S! p |# F9 t+ d. O- A) r* e1 t
}
2 {6 t! [ m4 l0 l; f
return (size);
. g) r. }) i' J
}
/ ~9 g9 X- |' t5 f
}
+ d( i1 j3 L* Z; T& f
. f' J/ D- K- s5 A
return (maxsize);
9 e9 M! }" B/ R# x- y- N( ?# m+ S
}
( G* ~8 o4 H" d) X) g" ^! e
int dram_init(void)
3 s$ C6 w, T$ |$ @+ A0 V% m
{
! c3 q2 y( w* i0 }$ I
/* dram_init must store complete ramsize in gd->ram_size */
: V ~/ p C5 S! N0 f
gd->ram_size = get_ram_size(
$ w8 \0 Q% |* G- c
(void *)CONFIG_SYS_SDRAM_BASE,
8 i) }, W8 Q6 t& i* `( S. }
CONFIG_MAX_RAM_BANK_SIZE);
4 O. r2 k& p3 Y& O' l. \
return 0;
# X) B+ S0 P; |* Y8 y. C' a
}
. o- r/ V* @- O' E3 J
; M$ V3 h: V8 Z* ^
! C, E+ v( G ?+ p- W9 v" G
$ P) t% r p0 C- N# V8 r+ @4 E
+ m, E [- D0 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ G* e0 R4 w& l4 Z5 w! G
, x7 |2 g8 C$ q: V2 p5 K0 ^( d
& B0 S' V, m" E1 d
' x2 N( N( V: k8 e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4