嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. o) i9 O5 c0 R+ b3 L* W- R+ e# Z! W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. Q- d: e3 W+ P+ y' ]$ L! U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 i. t$ i+ r, U$ m. K$ V: Q( k% G1 k
6 H! B. o9 ]1 Q( {6 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 J# a9 l- c, F3 a$ C
. ^: c( p5 g5 F! K- D) i$ r, r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( n# H3 B' O3 L. a! S! R5 E0 [
/*
% w% q2 c5 a/ C8 K0 s
* Check memory range for valid RAM. A simple memory test determines
+ g2 ? I6 j1 y1 Z( k
* the actually available RAM size between addresses `base' and
{: e; w' |$ H3 ]6 M
* `base + maxsize'.
& t/ c3 r; Y% a* z
*/
: ?; Y+ y. C9 Q5 e$ y
long get_ram_size(long *base, long maxsize)
7 x8 _. ]' Y; y2 L: J- a
{
# g) f2 B: A9 e; l. [8 j, x
volatile long *addr;
* @! q# f2 J7 r, Y9 @ \
long save[32];
w$ z# P! s J$ Y3 m5 E- h$ z0 Q
long cnt;
% x, H) ?+ I @# @& Y' R
long val;
) y+ b/ }/ P5 D
long size;
" M8 _# d- h) L) |7 o9 Y
int i = 0;
" Y6 |) e' H# k. L6 i3 A, d. r
( D4 c& Z6 ?& J7 |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* \6 S6 D3 K3 B- V
addr = base + cnt; /* pointer arith! */
* B5 T. E+ |( V) U
sync ();
( {% l, t0 u+ Y, b, ?. F
save[i++] = *addr;
6 F" G* B" k" L& S7 n" s4 w
sync ();
5 @+ W$ u4 M8 z8 Z' Z1 X3 {! t+ v" U
*addr = ~cnt;
0 u# o5 `3 B6 o6 i% a5 }- V. t
}
: @, {* i$ s+ n; C3 C/ d
% { }5 U( \3 h' A# }3 f. Z
addr = base;
0 s: t6 W1 H& b) u1 g4 I1 Q
sync ();
8 ~: I4 D0 F" a3 z# l- [
save
= *addr;
. V5 z! W/ |. A6 z
sync ();
. w4 k3 ]( |3 A/ U: G
*addr = 0;
- F p# e8 b# ]) L/ b% x# {
+ O0 _1 U4 s3 {
sync ();
, a& F, c- C9 U
if ((val = *addr) != 0) {
u9 G; k& E7 L5 A# p, E1 g
/* Restore the original data before leaving the function.
/ c/ |1 Z+ C+ R8 i5 f: @: K
*/
! `. h, L3 V# a! _/ U) M
sync ();
8 d- s) p( e" M' t* F
*addr = save
;
) o" F4 g, _2 m8 \. i' B
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
K# L# l" B. }5 n" b/ L
addr = base + cnt;
- Y/ \/ W) O3 E( W$ I9 H% F; x
sync ();
( Y/ O: g N' p8 b
*addr = save[--i];
# R0 @0 o' V. ` {
}
( M0 @7 t; C' r" b/ n
return (0);
/ ]/ e1 S/ ^: s- X1 Y+ }/ Y
}
% P9 t6 c! H3 V9 ?/ y
' O9 p! X4 {7 g C
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- D p. e! J& _: t
addr = base + cnt; /* pointer arith! */
8 S+ g/ y3 F- K/ a7 T. s
val = *addr;
+ M# V9 ~3 z% w' F4 p6 u; }, [* @
*addr = save[--i];
4 S: z1 |3 f$ L8 e# `) `: L+ R) P, u
if (val != ~cnt) {
. h. w5 ]$ G5 i
size = cnt * sizeof (long);
. O+ ~% A1 _8 N0 j" y* f
/* Restore the original data before leaving the function.
$ D7 |( O; ?3 m% `1 X% N( x
*/
0 V8 w6 b' k5 W ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 L$ e2 J( f. C4 F) m7 b4 [5 H
addr = base + cnt;
3 F! O' }/ `! J# m
*addr = save[--i];
2 _& j9 b* o- h% j1 j
}
2 Y g( Z- _) g" t* O$ B
return (size);
1 ~- K# d3 ]$ [" V6 e
}
( T( u" U7 F; c; D- c5 w
}
: V5 p3 D: Q9 b* L6 i! F7 e* ]: c: I
* o u3 P" P, x) b
return (maxsize);
/ n8 |: x: o7 K8 L0 \: P6 C
}
0 Q3 i* F+ g, t/ Q& z
int dram_init(void)
S. ~7 [+ h& j5 N
{
5 t+ v' j- P/ v8 A4 {
/* dram_init must store complete ramsize in gd->ram_size */
1 F+ H: U7 h* Z! M# H
gd->ram_size = get_ram_size(
9 H( S- W: N/ v, ]
(void *)CONFIG_SYS_SDRAM_BASE,
+ ?# h9 y! w! h0 I* D6 g" r( N
CONFIG_MAX_RAM_BANK_SIZE);
3 I9 `$ |: n9 x; S
return 0;
; Y8 ]) @( h2 v( u+ a
}
, q0 W u( h$ ^& T n
* D3 w5 v6 ]& A* B$ y& m
- r3 b* H5 y: }9 V
5 d/ |0 ?( t. m1 k
, g6 Z: v: y/ }/ T% `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, l8 Y1 h' o! H2 u( ?/ ` w
% @5 A! _& p1 N8 V, S
/ H0 e# P5 l. O
$ Y! r: U% V9 a' B
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4