嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 b$ |6 A4 e) {+ Y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 ]" Y' i/ G$ `/ r' t d* h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% B+ f5 F& z) l# I1 Z! ?+ o* _
9 l5 E5 a" J1 H+ e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& ?, n/ ?) c" t8 U4 z% Y
; E6 g8 ?: B t* G/ f" A+ ^; K( L- ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 c# Y# U6 p9 P4 m( N+ s& M- d
/*
p; N0 E, |6 f% n+ G) m0 i
* Check memory range for valid RAM. A simple memory test determines
4 y, P! O7 P& @$ z4 F6 M$ E' b
* the actually available RAM size between addresses `base' and
+ V/ M0 r% c; o
* `base + maxsize'.
6 Z8 X# [1 O3 z& }( h2 v4 R6 r
*/
$ y8 U. z9 a8 W8 E3 i9 S) g
long get_ram_size(long *base, long maxsize)
- }- P2 G6 I3 @' {7 x
{
& A6 n# ~ f9 w( k$ s3 d1 l
volatile long *addr;
- g. I, C7 ^ n0 O' J. @
long save[32];
$ I4 D" g2 L9 a
long cnt;
. |0 p5 J6 t3 k
long val;
* s$ ^2 C3 L7 K: p
long size;
2 N, J3 }& K% A* T9 X
int i = 0;
8 b& f" ~% r5 T; b
" e. ]- m& I9 ~( B
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: t9 C) Z: F- k- W$ T; g: s) g
addr = base + cnt; /* pointer arith! */
$ p# N) A# a) W. F, X, t
sync ();
! p6 Z8 L5 o! D. M% P0 t1 L
save[i++] = *addr;
2 o& b6 A7 d9 R* Y2 F+ V8 \
sync ();
8 R3 H0 J: P# L8 n% h
*addr = ~cnt;
2 e& I1 k% }& G) g
}
! C5 {9 E4 u% D' D$ c6 a5 i
0 Y, q: C$ |; J3 H# `, Z1 G
addr = base;
! Q" Z, N0 D. z* e$ ~$ s
sync ();
& V; N9 m' N3 g0 p; U
save
= *addr;
, c8 [( J# v! x; B6 b7 W
sync ();
% M9 Q" e2 C5 Z" b J0 {
*addr = 0;
0 _: x- }3 e$ s& n
1 U* l' M) Z+ }% d; n9 {( }
sync ();
4 L6 u2 _7 m# k2 j- Z9 C5 y0 l/ k
if ((val = *addr) != 0) {
$ s7 L$ e3 N/ t
/* Restore the original data before leaving the function.
3 O7 o* y" }2 e8 z7 {* O z
*/
0 T* I, F' P" @1 m
sync ();
/ l- }& H, r; N, X9 y5 l8 f
*addr = save
;
7 d, A# t* a4 o+ y1 F
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 I6 [# Y1 g0 [; i. Z1 M6 M
addr = base + cnt;
" T' Q% K5 _0 x! [( S4 c
sync ();
. Q. P/ S* R" [8 q: X& O2 h# q# d
*addr = save[--i];
& h4 J# O4 S8 f5 t$ u" {1 R
}
0 l/ K( w; }' @7 t% O
return (0);
' m4 A( d1 i3 m7 W
}
6 m: e1 O2 c# f6 @2 i2 k7 m) U
' A* H: n1 i; u2 a- p- i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
w* [1 ~" h$ [1 e
addr = base + cnt; /* pointer arith! */
3 @3 K5 B, ~9 D i# z
val = *addr;
; G9 I" J1 A$ |5 U" n
*addr = save[--i];
p8 t5 b( F3 |: i) H6 a- \7 f
if (val != ~cnt) {
, J2 O" ]8 e' ^# t2 C: c/ R
size = cnt * sizeof (long);
) ^9 R5 u( _& p8 F
/* Restore the original data before leaving the function.
0 J: k2 \# i# N
*/
1 Z2 ?) S) _- \" K6 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' j( d! \5 J4 Z5 F7 J! U
addr = base + cnt;
& O7 i" t% j1 U( P
*addr = save[--i];
?; s4 i& C1 f- u. o
}
S4 N% Q. N0 q6 Q
return (size);
. D) ^7 [% `, `3 B' W8 V$ P
}
# c+ j/ q: k' E; g
}
% Y/ i2 W( I1 i4 {
* l/ l3 x( O& |. `+ _
return (maxsize);
) `) N2 ?# J. C0 J v6 b8 D* B
}
6 v; ^' V! W: e4 D1 ^* U$ }9 }
int dram_init(void)
4 m7 x4 I& m+ r/ P; V
{
) B# G v0 p0 I7 {+ p% P
/* dram_init must store complete ramsize in gd->ram_size */
' b4 c: [" {0 P3 @
gd->ram_size = get_ram_size(
! m6 q8 m) k) M& `1 {. \
(void *)CONFIG_SYS_SDRAM_BASE,
3 B2 S0 f- W7 T f1 f) x* f, ]
CONFIG_MAX_RAM_BANK_SIZE);
$ h4 a: t' m" i7 r: i6 x# v2 Q
return 0;
( W r4 a7 u$ O' D
}
0 w4 M0 ?& U: w; ?8 {: j- `
* o" d o x9 [2 U; A
+ l6 ?: D- x; @# U( ~* g
4 O' z/ J6 I" X1 L! u- ?, L2 E
2 ]" ^: n; e% C1 x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 T# Z7 _$ d" ]
, z8 C( N. z! `, b% _1 i: g# _
1 I% E( a6 f+ E5 G/ d- r1 B- V
( l$ J. A. m6 ~! f1 c0 @/ U* O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4