嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' ]' {( r1 e# o' }6 ~$ Z9 h* P4 y' Q" R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, H9 W- p. d; _" N! @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s9 P) v$ Q5 H& N
1 z- l1 M" S. t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* I, T' J6 r! i5 u. W6 n0 ]
8 _) _2 z& r. y5 r. x5 ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 R/ E& X# ~2 K; ?- S$ N" W
/*
/ \* A4 C( A+ i2 F2 t) T- z4 k
* Check memory range for valid RAM. A simple memory test determines
9 n" x& ~ r2 Y/ I. Z1 z
* the actually available RAM size between addresses `base' and
; J' y2 R6 e7 c3 u
* `base + maxsize'.
) n; k4 c1 p# D( y/ u( ?
*/
5 J" U" Q7 b) ~5 C! o: ]3 l, T9 A
long get_ram_size(long *base, long maxsize)
% t( E, C# T$ H0 W* Q3 Z m% V$ W$ R
{
c$ ]0 x1 x. B6 D: _2 J
volatile long *addr;
( A# ]' U1 @+ D4 x, q m4 @
long save[32];
% Q3 s5 ~$ ?5 Z8 i* y
long cnt;
" E/ m3 `3 I3 v: u2 }$ }
long val;
$ g {0 n0 U: y3 s" s( |
long size;
7 ~+ {' F- K8 y2 g" _) J
int i = 0;
, m* Y" o- w' R D
2 t7 E: o; t5 U& u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, e. }8 M6 Z& f! u6 H$ [# w' [3 e
addr = base + cnt; /* pointer arith! */
Q- @8 x$ m; X: J% S' ]
sync ();
: l- B/ I) R) H; C' b9 l- p/ r) c
save[i++] = *addr;
! O9 j( O" t1 @! C4 f' D! E' J3 @ h
sync ();
+ q) f7 b' v6 Q" G l$ y1 z! l
*addr = ~cnt;
7 t7 n5 a; U6 O; v
}
- c6 ?: F; [6 z. O# a0 a+ g% u
* u9 a4 f U" _2 I2 l. z* r6 H% Z
addr = base;
$ `) Z: c; C' T* N) |
sync ();
& u7 O' Z% D6 R
save
= *addr;
& Y, l2 Q& O' I0 C% t7 R2 D
sync ();
1 e0 I1 }$ R6 }% @
*addr = 0;
, y# T6 ]8 o F/ P4 K/ g
3 O2 ?+ c) ?: c) P" d( c" F2 B
sync ();
+ J+ f9 Y/ j: x
if ((val = *addr) != 0) {
8 H4 I; s/ x$ O- b
/* Restore the original data before leaving the function.
, o# @% D) W$ Q: ?
*/
. [ L, N9 q& l% t9 U" g$ g3 [
sync ();
4 [/ V; i1 M, f3 u% n; V
*addr = save
;
/ ^) T2 Z O8 p/ j% n- e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
^: W% m6 K) d4 u u
addr = base + cnt;
% }) |7 V0 a2 j
sync ();
* s# l' b# N) }% S
*addr = save[--i];
! e k: d% ?8 v9 B, x
}
6 z6 i* N1 t9 P! C9 ^ f
return (0);
2 M q) d/ `6 _0 Y. }
}
4 }% Z' x, M9 k2 A, m
- G: m6 e% g E9 E( l: `: ^0 {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 x( ?8 L: R$ n+ h
addr = base + cnt; /* pointer arith! */
j- E: l; Q1 D
val = *addr;
$ d: J$ p5 a; r, r$ I/ @
*addr = save[--i];
* }$ K1 J4 q% J Z i6 r
if (val != ~cnt) {
- K6 ?# P2 H( |# o% \9 ?
size = cnt * sizeof (long);
0 P' G* N2 w% s- F/ N
/* Restore the original data before leaving the function.
6 c+ e3 S0 }/ A3 M7 I; C8 g4 [+ L
*/
) s4 _2 ]' v( O% w* B7 w7 _" y. j2 N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) n+ r) s6 W6 \9 T- j
addr = base + cnt;
$ K! |7 [# i# c( a4 ?; k
*addr = save[--i];
) Q# y8 N. A+ l% g
}
4 Y( r% ^5 i' h$ \; l2 {
return (size);
4 m0 F7 t+ Y8 h
}
" E8 m. p& S+ t; H/ L
}
: G/ K( l8 T/ Z* Q1 f1 u
' q5 s2 u1 K0 @2 f' @5 p
return (maxsize);
' ~: i0 u* L! z7 G& z' @8 l
}
9 p" ?7 C1 \/ J' N* P
int dram_init(void)
0 C# U9 d# w+ {4 A1 Z8 N
{
5 P% `7 e/ |6 }) q$ {
/* dram_init must store complete ramsize in gd->ram_size */
7 d* K9 {( v/ D6 w( v
gd->ram_size = get_ram_size(
4 p- S0 L0 V- |. V" ?( p$ |
(void *)CONFIG_SYS_SDRAM_BASE,
( B- W3 E3 d9 M7 e |
CONFIG_MAX_RAM_BANK_SIZE);
' z0 `- g- P. m
return 0;
& r- }+ u( p6 o" J! O! g
}
* k# W+ Z% M d1 ^, Q! |+ R
1 p2 i' o) J+ H9 e* Z' l- i; s
. v1 Q' [, M) y7 Z
1 I; s5 O1 Y1 S9 v( `* q
$ M$ |/ d" w' B7 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( k2 F7 H. a7 l8 t( F* h
9 g" n& X% _6 @
! f& n i# V: d; ~+ b% v0 B
( [$ Z6 ^% Y6 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4