嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 `2 n9 W' B% `* R+ H. R) f# B
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. O, y' }' z9 S1 X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; V' R7 X* R: i% Z8 a
( y4 o. m5 G8 T3 C7 u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ C1 r) @# ?, X9 F0 \, D, p5 m
8 ~$ {) Y, C% j# W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% X; [, `% k# k/ P
/*
7 Y q% ^) [; U4 x
* Check memory range for valid RAM. A simple memory test determines
s4 i1 P# Z( i. j3 m# k
* the actually available RAM size between addresses `base' and
2 S9 T- w, Z; D$ R |
* `base + maxsize'.
! f4 G! i& z, }; N$ H \" M
*/
# `7 s( C& c d( H. @8 ]( g b
long get_ram_size(long *base, long maxsize)
1 v, c, C: a9 @
{
& B6 s$ X3 [! F
volatile long *addr;
# S+ d3 Y: {8 Y6 j+ |
long save[32];
) \7 b& _* X' C
long cnt;
( Q4 U% N1 |/ J: E! F" N
long val;
8 P3 y# d: k( g9 i. s# Y( o" J3 x1 ~
long size;
& R8 T- @. y/ ?
int i = 0;
( }" [: s2 B9 L. B
$ {' x' y, Y/ d9 O. ~* }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 P7 n/ B" `1 y5 W4 @2 l: z* Z
addr = base + cnt; /* pointer arith! */
1 @3 r6 Q. X- P r) d- w$ Z
sync ();
) D* L, F/ e J. n0 o9 s$ E
save[i++] = *addr;
5 p+ y; I! Q& c
sync ();
% W5 K" l: Y& g9 d+ p6 ?" R4 ]
*addr = ~cnt;
( V" x% A; k5 V8 w7 d
}
# s" K) K! U5 K( c
, a6 N# k5 E+ `$ W B4 r4 k) S
addr = base;
# ^$ e5 E2 `1 a
sync ();
( w3 ^5 c2 D" y3 H/ Z
save
= *addr;
0 A, R }4 u" j b+ `: I, K" I
sync ();
6 T2 Q' c h8 `9 P6 I
*addr = 0;
; f2 f1 P$ H$ W$ K, y0 D
6 `( `/ W# F T$ N e' \
sync ();
3 k4 r6 \$ B& i J+ f# c7 X! g
if ((val = *addr) != 0) {
5 w, o7 |$ L d- r, _! g
/* Restore the original data before leaving the function.
8 |" P: U. r* o$ E
*/
9 C, N6 P h/ f" r- @' K' p( D
sync ();
" r, p8 C, J' L- d6 F
*addr = save
;
5 a0 K* r* f. d4 B q$ ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 I+ h$ k: |+ i( i- r) V
addr = base + cnt;
, t# c1 D5 E* [, H7 [8 D4 D
sync ();
9 \$ x) P @9 F# e
*addr = save[--i];
$ {# s) N# Q9 h3 {% B9 [. `
}
. }3 f2 i8 Z( c6 @' B
return (0);
) v: r; \9 k# \! T
}
- t% c* T* X& F/ h
3 K4 @ Y8 Z* o; b" i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) ^2 b" L h3 p2 W- W' Y0 y/ X
addr = base + cnt; /* pointer arith! */
2 Z& T1 u! K1 E8 k
val = *addr;
. a! g8 J- p8 f) S; L
*addr = save[--i];
: a2 ^% u$ f. @ h' L
if (val != ~cnt) {
$ h7 x2 }, F6 Q$ w- k
size = cnt * sizeof (long);
6 F7 Y6 O4 O' y! N7 k5 [- |
/* Restore the original data before leaving the function.
7 [$ n; K' n7 Y& {$ n- h9 Z0 F
*/
( E- V/ u' `- Y, ?( m, I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ Z3 a8 y: d' B, E+ n4 i0 |
addr = base + cnt;
6 u4 Q3 A* @/ \& \: d! M8 ]" E
*addr = save[--i];
! }/ x$ [0 D7 ~ `) ?0 J7 H& w3 {: S5 K% ?
}
( ` G& w5 [' o: i% X& w
return (size);
7 ~' A& x9 \4 X& |4 z3 S) F, U1 W; a' ~
}
$ `; y/ C6 n. J4 B- b3 e
}
( R9 F* Q I+ z: c9 U
$ Z8 g6 \" S+ `9 B; T/ n
return (maxsize);
) C6 `1 F) q/ q, z$ i4 p
}
; {& N( G2 I; L6 X
int dram_init(void)
( f# B) `( d0 s+ Y# G
{
! @' m% {+ R+ `% x% b$ T9 s: X3 Y% g
/* dram_init must store complete ramsize in gd->ram_size */
/ S' o& P1 _! R8 \/ O1 x
gd->ram_size = get_ram_size(
3 i" b/ X+ s2 G4 E
(void *)CONFIG_SYS_SDRAM_BASE,
: ?3 B. m! _3 ^" m% x
CONFIG_MAX_RAM_BANK_SIZE);
; E/ p3 E" e, t; |1 g; x# f
return 0;
8 Q5 O1 ]9 g' ?- n# F
}
0 Q8 E6 y9 m) V- M! @, t
' w/ v% _! ^0 Y+ V! [. L
; x: }5 t7 z" v9 X% @
0 \4 X! `' y- O" U& c
+ u2 |$ Q% a5 x# ?/ b1 ?0 m1 o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) d- o# O. x) F( h$ l& ?$ C
& M/ x/ B$ X" \% q, j9 K1 T
' ^3 [$ @/ |* F* h) R6 `
$ d; `: {4 A" P6 [5 S, [7 D$ s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4