嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
j4 e0 R+ s. P3 Q6 i. \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. v* v4 \3 K' w7 q* C3 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' |0 w. n1 v) H
1 n) u$ x$ |3 D! h$ |: l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 S. l. X7 Q5 R# x. u" n& B
/ V1 R' F" S4 ?2 s5 N7 g9 _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, }- q* O2 ~1 P1 `: Q; F9 u
/*
8 |8 H* S, f% [8 W0 L0 o
* Check memory range for valid RAM. A simple memory test determines
$ d7 z9 p- y0 P! n5 Q2 D/ \
* the actually available RAM size between addresses `base' and
8 d& x( x6 D- b# P& J7 e
* `base + maxsize'.
# ^1 x/ \; X6 M: R- k2 k
*/
; |& j/ q8 w' o# H# c1 u
long get_ram_size(long *base, long maxsize)
* I: h P. G% V* g8 j U% v
{
; B. Y8 t$ I. y7 o2 t& ]/ V" x
volatile long *addr;
; F& u; a& w- T S, J
long save[32];
1 Y, r) q' k( M. w/ Q
long cnt;
2 t3 k) g8 v0 j7 [; Y
long val;
! S0 `1 D6 e, z
long size;
4 W. m# P% b1 l& I4 |) X
int i = 0;
6 v( A7 p; h; m2 Y
0 Y# ^+ ]& L n8 Q4 V' O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# Y9 O: K, V0 T. P% R0 j
addr = base + cnt; /* pointer arith! */
; b4 V ]8 j3 Z. k0 _
sync ();
3 O% p8 t. {' k+ }- D! h, B) ~/ a
save[i++] = *addr;
$ c: y; u8 ~" t* U# E- U5 u2 }
sync ();
1 v: E, n. c2 l4 y# p
*addr = ~cnt;
7 m- x, l5 Z3 Z, @: j9 ]. F
}
& v; b! [0 Y) ?0 O- ^; a& U+ h0 I6 D
; l. B8 m2 s+ X9 H, T
addr = base;
- g" _) |2 y0 {$ d4 U
sync ();
$ u9 p. S5 M+ H) L& q
save
= *addr;
2 A2 d! y: D. j% i" M l
sync ();
L7 J6 y' P9 M% s7 q3 o$ ]# e
*addr = 0;
5 Y% L: p! R, P# q3 P0 }: u
, \% X/ |9 o. O6 E7 z
sync ();
; a( _7 h ]5 E4 T" ?
if ((val = *addr) != 0) {
6 Y5 ~; A2 O6 @
/* Restore the original data before leaving the function.
3 F( O& ~7 M1 V+ w- u9 |
*/
1 X% G" o/ I+ T, X+ M( m# P
sync ();
: X5 p+ W# Q$ x7 w- ?9 M, i$ ^2 Y/ r
*addr = save
;
) b* T9 X1 b% J/ O; B
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& s# @" U( W% q
addr = base + cnt;
* J+ u5 i& r0 b, I2 g
sync ();
# L. F0 p, K2 s" Y& S) O0 ?1 q
*addr = save[--i];
+ D& h) _# X: n. s
}
0 W' }; b z2 `7 ~! b
return (0);
6 C9 t& ~9 N0 w7 `( K: n
}
$ l1 C3 k: b u7 o
% I" q: t4 q3 t) V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 p4 r' @- f% t' O' t3 w
addr = base + cnt; /* pointer arith! */
4 k' t, j# z0 s4 n7 ?
val = *addr;
' K- O. ]) r$ t" R) I( j
*addr = save[--i];
# v$ B3 \! U3 w) \( M. Q! K' k
if (val != ~cnt) {
+ A9 R, O: G$ v1 M+ U* C* b7 P
size = cnt * sizeof (long);
# T& Z3 [, P+ V. y: e4 r( U1 B* X
/* Restore the original data before leaving the function.
: K4 o$ Q. @) p$ x/ Q8 A. |/ Q
*/
: P/ R" l% G( {$ J* `/ j( r( ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! G9 E$ ^8 `3 M! X/ t
addr = base + cnt;
( Y, y4 x* y6 _+ R$ G" V! v
*addr = save[--i];
( {* N: H' | x( t
}
* }" W, e5 R* B$ F) Q
return (size);
9 g3 x: n5 J4 E
}
* U& `3 J) H. f! L n
}
8 [: G/ b7 w7 R8 H7 T
$ L# @+ n! h0 |6 h1 n( U7 W# e
return (maxsize);
+ C1 F0 C- q' Y8 |2 A' _8 U
}
; G8 K4 d' X6 h5 i8 t) L+ f& [6 {
int dram_init(void)
% R! g9 z/ m6 }/ w s3 T
{
0 F' I5 i( V, X1 C, I* s
/* dram_init must store complete ramsize in gd->ram_size */
' z$ z1 v( g- Y; J
gd->ram_size = get_ram_size(
( X3 {0 i" u3 {3 Z/ j- |9 g
(void *)CONFIG_SYS_SDRAM_BASE,
7 s; T1 }+ T9 A" |3 O
CONFIG_MAX_RAM_BANK_SIZE);
( N* f0 M, M* F
return 0;
4 R$ P I) y: }7 C3 G2 b/ t/ x
}
! B _; c8 H/ M7 w G; G+ Y
. {6 R- S# w! G; G9 `" D
' v. M* l- p7 T7 K; O; e' d
. k Z7 h4 N& d# D6 [: k
/ d7 a9 @9 \' N5 Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& y/ U9 A7 w2 y1 u+ u e1 [+ k2 B
; a+ |; F- L/ I4 K& ^
- o5 U. H3 N! ^' c. I) P" \
w& @& b$ l+ g+ V8 J6 z; L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4