嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' z# Q% C0 W1 a
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 W8 R# k k6 R! _; I \+ i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 c9 i+ e% K/ r/ C
- ~7 Z# [) P/ O6 r7 q3 J8 T1 `: J; i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% v# ~3 N4 y; u( e! V7 g
, y' p) m- x3 U- w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
O. Q% T9 D, `; U* e
/*
) _1 }$ b' `+ M, j! W
* Check memory range for valid RAM. A simple memory test determines
M' g6 Y/ Z) q# [# ~
* the actually available RAM size between addresses `base' and
: Q' P, P8 g* q
* `base + maxsize'.
) u: T* n: ^8 ~7 e0 u, V/ x" I
*/
n2 n6 T- v3 V" J+ ^9 H. O! W
long get_ram_size(long *base, long maxsize)
1 [* w" S9 i _5 Q6 b, T
{
0 B; l! ]2 b! W+ a4 G) e& i
volatile long *addr;
. Q1 r6 z! x# m0 s3 ?
long save[32];
# u, z7 f+ d. Y' K$ [9 |
long cnt;
% i& }$ Y2 E0 e' @9 X( Z
long val;
! Q! g+ _ A: g% \4 R6 g" L
long size;
8 T' g1 c, m- d* Z2 n; z6 B
int i = 0;
$ _& ^- ~; e, E
/ S$ t8 j6 j3 }# ~$ e5 K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* q/ Z. F/ p R+ a4 b2 g
addr = base + cnt; /* pointer arith! */
' w- l; G* e4 N7 l1 L3 k y6 L8 y
sync ();
1 @& r/ i2 }5 @/ N7 _' s
save[i++] = *addr;
" v U' k6 E" ]) B1 {3 u J- ]
sync ();
% l. {1 b5 O: n# G
*addr = ~cnt;
6 Q# D" A4 K- q& \
}
/ g; T6 N9 R. w3 j% ~2 n7 @
% l' d, M3 ]: C
addr = base;
9 P5 Z4 t, p9 H4 N- P. T) [
sync ();
& w, ^; [+ u7 c: q1 G: g" h" b
save
= *addr;
) @$ D2 p/ O6 ?! ]) ^/ s! Y
sync ();
0 K5 l1 u( h. q$ q
*addr = 0;
* ^7 p( o! Q/ e5 @1 y
6 L3 O U0 x9 x6 T
sync ();
2 N2 B8 G1 t, D/ H* ]
if ((val = *addr) != 0) {
" H/ {% y& d: @0 B# p9 n2 o
/* Restore the original data before leaving the function.
. j4 N/ K3 b9 ^ F- L
*/
+ [4 k* U8 F& {. L: U3 C% L
sync ();
$ \# L2 H. m" c
*addr = save
;
% r% e0 e& o( c( V7 C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 a/ \5 I5 d8 k: q% z% O! n8 M
addr = base + cnt;
5 E, s- b& m/ V) B! X, g* M4 A* Z
sync ();
. |* P) ?# C" J$ ~
*addr = save[--i];
5 E$ y! o8 E9 W
}
3 g8 u7 g2 F1 s0 q: ?* X: b) e
return (0);
@0 c* f) _5 W/ H; @4 A
}
* W8 R- R* W+ b; ?
t) ?0 n: i& z% A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 i8 A6 }8 S7 a& D
addr = base + cnt; /* pointer arith! */
/ q- g. m0 ~" z# H- S
val = *addr;
, d6 c3 j4 \+ v* }: Y# v$ O
*addr = save[--i];
3 T! Q" }. h- n8 P! P; U8 i
if (val != ~cnt) {
$ X( C% }$ B; d
size = cnt * sizeof (long);
# H2 s; k2 w- |2 _
/* Restore the original data before leaving the function.
m$ `+ Q/ |9 B/ b- j
*/
/ b5 I0 _' k3 ]6 d8 U6 x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 ?5 p2 W. { D' Q+ d: x
addr = base + cnt;
) T4 F$ I& L+ e5 A! O" z" P0 x
*addr = save[--i];
$ o( M6 | Z5 H. y# [- f
}
7 k+ w$ K* r0 e. C1 f2 p, }
return (size);
- R: H+ ~; N& T8 j
}
0 B- Q" r0 E$ O& M
}
! N/ j! P A; r ]) f- E
2 v5 }, n- |: m5 O3 p
return (maxsize);
" l3 W+ |% t: N: Y* n8 ^; _
}
4 Y% p& h+ T1 q: H8 m, H
int dram_init(void)
5 ]5 m1 u C, i* j, i/ C8 K; K
{
$ P( K8 r2 s; C! B: A8 b
/* dram_init must store complete ramsize in gd->ram_size */
# Z) z% N% i) v) ?# @
gd->ram_size = get_ram_size(
( H! c1 A" R# i3 f3 S: a
(void *)CONFIG_SYS_SDRAM_BASE,
5 K8 b, i. C" T. p* S$ ~3 w) b
CONFIG_MAX_RAM_BANK_SIZE);
$ m$ f2 I- I9 I8 f6 |" ]3 Y1 n; ^
return 0;
; I% ?! |1 T0 ~- L, m; S
}
/ r5 q. Y6 Q, x+ A% F# C1 d
% @1 }5 m# L: z( r" U0 o7 x
/ X" \$ t" L3 v7 E0 Y: J8 G! D
% i2 N1 f. V( _5 Z- f5 s: n
9 Q8 V N* r! h/ Z J$ C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% i5 s& G5 q+ L6 \
$ B9 O7 l) I% j/ f
/ R( ^. C* ^, m+ m9 Y. o/ r
) k) A8 J! y) k! V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4