嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: @5 F# q; B1 X. Q7 P
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% M+ \" f$ `9 Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s G; s$ F$ \5 |; C3 x
: P: M/ `' R) A4 m- Y/ ^6 o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- F! Q: F; K- C$ f% e
5 a6 B+ y2 @8 [; X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( Q+ w5 ~. X# p0 R0 f- X: a
/*
: ?7 ^$ V6 ]% @' V4 F; k
* Check memory range for valid RAM. A simple memory test determines
0 p0 E6 {" h1 d/ }7 x+ h' W
* the actually available RAM size between addresses `base' and
. a( m* u$ Z% W2 S
* `base + maxsize'.
: \' J' R# v( ?2 h$ h
*/
3 I4 O/ I/ t5 s4 |
long get_ram_size(long *base, long maxsize)
+ e, N3 R |; S2 a: D8 p: i
{
; ]" R1 ]" }: h, o1 X. h! x
volatile long *addr;
5 [$ [: }9 o- {7 g [( \3 L2 M
long save[32];
6 [; E N+ k2 v3 G5 |/ X9 {2 r9 f: Z
long cnt;
3 Q$ `+ o$ E. Q) }" q/ Z
long val;
- }; O! r3 H" E) ?7 B+ ~% t+ R* D
long size;
4 {$ C# w. y5 d+ E2 F$ \
int i = 0;
1 [5 `6 e7 {( v# ?
, N; t! N- b7 A/ V5 v0 J& r# U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 `' m! }/ W3 Z" M+ U$ I' j
addr = base + cnt; /* pointer arith! */
# P2 x8 E+ n& Z; n# V8 m! J- s
sync ();
" `2 T" H' X( Y4 X- q
save[i++] = *addr;
; P- D1 a/ B% \' ]
sync ();
" R' L1 V0 D/ r- A: K4 @
*addr = ~cnt;
$ S! h# J& B8 o0 r% R
}
4 y- A. [+ P6 C2 W
# g9 X# L% o5 ^% [# E Q( r' B7 n) A
addr = base;
+ H6 B; U% @, x
sync ();
) I, i# A: Y6 S1 J. \/ x4 P) `
save
= *addr;
! V D/ \9 [1 R- N/ N8 {! E3 x. e+ _
sync ();
3 ]2 x5 C0 K( N% ^
*addr = 0;
& e8 W5 k6 N) O8 N
( K) O& r7 z5 v* r/ A" a
sync ();
* O+ k* H4 d' Q6 B# Z
if ((val = *addr) != 0) {
# E1 A* M/ ?! R+ |: N( @8 J# \1 h. G
/* Restore the original data before leaving the function.
3 e2 Z% b' O: I
*/
5 n- B5 `6 ~: q/ ^9 n% H# K. m+ x
sync ();
+ D* S1 ?+ _; V. u+ g
*addr = save
;
) E/ {9 E6 C, `9 M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% d+ b1 `: }' R" `( `; L0 Y* Z
addr = base + cnt;
( {" x( N2 D: }& x$ M
sync ();
8 q7 C' N* l( R
*addr = save[--i];
9 ?' \) ?( E+ B# b
}
' b/ B/ i& H8 _& @& `* w4 \2 i
return (0);
' ]2 M% O# B* |) _# C, g+ A
}
f F7 Z5 ^3 ~: y
/ z) s- |, M2 W1 H% g8 ]* N& S6 Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 K" V& ~0 x! J
addr = base + cnt; /* pointer arith! */
, g1 L- r1 H& ?, ^
val = *addr;
+ G3 a' J4 L U1 ]7 ~& ]
*addr = save[--i];
& L! K! R: @0 A/ _4 C; A
if (val != ~cnt) {
9 w% D c/ m3 G6 m; @* o2 Q
size = cnt * sizeof (long);
4 n3 ^2 B: r. l1 `: B" ~
/* Restore the original data before leaving the function.
( w' i1 ]5 C$ e' ~0 W4 J
*/
9 d' y8 H& n i/ \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ m& X9 Y3 d, C' }( M5 _/ L
addr = base + cnt;
: O! ~/ w6 o% L* b3 ]
*addr = save[--i];
3 n3 V: U8 g7 ^* i5 d0 q T. B
}
8 I( D0 n; @+ Q6 C
return (size);
* c% i: G. L) }
}
8 i% ~6 \. R I+ T
}
/ }9 P' W0 j7 A9 I$ R# T
, y: p" v) j4 }( ?. A0 {, \
return (maxsize);
/ I" }% F( r$ C+ I- X
}
, |# \2 X; M+ L$ Y& y. E+ V S
int dram_init(void)
" Y* U2 X6 g$ f& p/ D
{
4 |1 y3 E% x: H o+ Q6 `
/* dram_init must store complete ramsize in gd->ram_size */
4 _. z \- Y3 ~, Z6 ]
gd->ram_size = get_ram_size(
2 f5 T) E. T) F
(void *)CONFIG_SYS_SDRAM_BASE,
2 T1 D( M/ G+ |, z8 U* \+ Q1 B
CONFIG_MAX_RAM_BANK_SIZE);
* R. n Y; }: \% u
return 0;
8 I* a0 f) b' ^. N
}
c5 Y* J3 n2 _8 w' S
! v z/ A& ]- I- M8 l
( N/ y5 w2 D! K
) c" n- _7 s- B$ b$ l
" b1 u! k" k/ D; z- T- K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 U) j/ I$ |: ~) }+ n9 w
, A$ J' e' V5 }) g# |" P: y! @
$ K+ F4 r7 ]1 h9 d% W1 q
+ P& H& r7 c+ o' `# ]$ h
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4