嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 P0 y2 ]( w: f) Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& `& Q) B* t' j* s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ h1 J# P8 q' y" p2 G6 K
. ~: h; S/ L0 y9 C/ D5 I7 y: K( ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 `/ x& h1 A6 G3 L
0 q) v. Z( {$ e# Q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( f# {3 m( a7 `4 Z: Z: L
/*
+ i5 e/ X7 L" }* y, [
* Check memory range for valid RAM. A simple memory test determines
s7 N( ^! f. J0 ?9 O
* the actually available RAM size between addresses `base' and
6 P' i% P: F C/ P k# W
* `base + maxsize'.
$ o; y8 a+ j4 W9 x/ c
*/
7 p1 ^* ]. g! m2 ^, F
long get_ram_size(long *base, long maxsize)
) j Y0 G0 q; v! A" K
{
" {$ _2 S$ \4 [% a7 I
volatile long *addr;
8 B K- L8 y" U% S/ P
long save[32];
* o+ Z% f- N/ r1 R+ H% @ q
long cnt;
! b& E% J- V; n7 e
long val;
7 Y1 i" g0 ]: C0 o- k/ P7 S
long size;
& c |; B% W) v7 j: O- p
int i = 0;
: J6 E! w2 b9 Q2 m2 R
l/ m8 ^& a( K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 K* E$ r8 P% [7 N* C( f* Z' ?
addr = base + cnt; /* pointer arith! */
) M3 }) Q% P- X$ X6 I
sync ();
& P$ c% Z6 \* Q; }, l( x0 i# B
save[i++] = *addr;
5 z* b% o6 S. `5 x/ z4 p( }9 F
sync ();
' Y% I$ J q* k U3 e% Y( Y7 ~6 H; x
*addr = ~cnt;
" b: W8 n1 R1 N
}
; _+ r r( h5 ^; r/ D1 W9 [
! ~3 n" b0 ?. X' o& C% q# Y' D
addr = base;
+ X \2 m$ {6 ?* e' Y, u
sync ();
9 d: E5 i' o4 ^/ x# q
save
= *addr;
( P' G/ Z8 V; k b
sync ();
# `) F! p2 I5 A7 J5 l
*addr = 0;
5 H2 C$ i) `' z4 G- P
% F% H# T4 X+ T8 ]' m
sync ();
4 W0 [" i' h- j/ N- o5 O% K" w
if ((val = *addr) != 0) {
% _9 v' K9 Z3 F1 \* t- f
/* Restore the original data before leaving the function.
( Z# T4 T4 O' }- N- J9 W
*/
3 A8 w- a- r8 w7 f) e* L
sync ();
/ i- O2 ?7 ?2 c# w0 R. H- t
*addr = save
;
* M- L: f: N2 S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 I, y* Q2 h. n$ v
addr = base + cnt;
- u" N( G5 S, t( K% t& _7 k
sync ();
2 L5 j u$ i, }* S$ I! x
*addr = save[--i];
( E" a0 T6 H* o- Q
}
. {- {) [: J. ~7 a3 a
return (0);
}: Q% i* H; I F7 i( V0 O w
}
) t( P; ?' @8 {: W. z( w* R5 q
5 i! @9 m0 g2 }0 L7 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& }8 p: ^& ] c% q& _
addr = base + cnt; /* pointer arith! */
3 X/ q f; Q Y$ a, N
val = *addr;
( q' Y$ T6 |5 \7 O
*addr = save[--i];
+ d2 s, H" _3 f' A! U
if (val != ~cnt) {
' g: H$ V' K& j t( `5 @
size = cnt * sizeof (long);
9 U* r5 j: ~$ S% W: n1 r
/* Restore the original data before leaving the function.
2 p. g. F& t& E- w" K
*/
$ a5 T) g/ e( P) \/ K5 K) |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 f6 b# Y8 \! k/ Q% W4 s1 d
addr = base + cnt;
' Q L# Z# ~6 t- X* ^+ F& j
*addr = save[--i];
; Y" t. A$ W& u! z/ Y$ b5 x0 p7 p$ \
}
( j7 r- x' g) |% ?
return (size);
, ^' O) n8 _( p6 g) e6 {0 D7 y
}
6 n6 O: f* E7 R& g
}
; G+ T- j% K6 ~- r4 G
# r4 D/ v/ `* @2 T$ P6 f
return (maxsize);
9 l# o2 o. `# O3 E
}
C6 @' V) v8 V" G, D8 G
int dram_init(void)
! Y X& s! y! g3 j2 @! b
{
* U+ b. P5 [+ e( G6 i
/* dram_init must store complete ramsize in gd->ram_size */
( u6 X& w$ B9 U$ m7 a
gd->ram_size = get_ram_size(
2 S4 Y# O% h6 j9 p r6 W" O1 Q
(void *)CONFIG_SYS_SDRAM_BASE,
$ Q8 A7 `1 v; E# I
CONFIG_MAX_RAM_BANK_SIZE);
+ `6 I5 u! c: X+ f
return 0;
5 \! S4 G+ \0 P6 W: B
}
) W4 M5 p/ `7 h% L- k0 O5 u0 ?/ Q
' P& P: W1 T/ L7 H9 f
9 z7 K0 r2 |$ _( s! p
* m( @; w7 P' K
: u, d+ I$ c4 j0 d) e; i" \$ m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( B7 [0 l/ l2 I0 w& g! b! g
7 \& E; G$ P1 ~+ Q7 f! _
5 b. X/ K0 W5 D- {
' c$ H% \: v3 n- X# q4 }( d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4