嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% @0 U# o* H' }8 I* C4 a9 h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 l6 Q; R6 J2 E; A3 q+ d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 J+ i1 N3 f+ T1 [8 ?
0 z4 }& f' f3 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ l! j( s6 m Q" y
9 F! Q2 a5 B/ h& G) g& F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. N J& {. ^; n+ s
/*
( ?- A0 F$ m8 E
* Check memory range for valid RAM. A simple memory test determines
1 @8 S4 E2 `) n/ W* l# _" Q2 S
* the actually available RAM size between addresses `base' and
% X% z( H9 ^1 c; j# H
* `base + maxsize'.
& ^4 [) G5 C% X5 K9 e
*/
3 M5 g& Z7 F, X: S9 Q1 @! A. G
long get_ram_size(long *base, long maxsize)
8 \" Y' _! z/ D, h
{
) s- R7 i; p" `% H! p5 q
volatile long *addr;
6 t7 w8 F% D! ^& e8 C+ }
long save[32];
+ E$ A. d- E0 o/ k, d v
long cnt;
7 i k- Q& o3 G9 s
long val;
{/ y$ M! N& u$ t' M' ^
long size;
1 ^) d. S$ Q6 f2 l5 l8 L7 r0 i3 y
int i = 0;
2 m6 j! F- ^" O U i! K
" h9 N* d* O% o( P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, j9 r/ y7 d. {: k3 k0 U* @
addr = base + cnt; /* pointer arith! */
' U# ~, w- y, u
sync ();
- K C1 V1 _7 l6 j4 K$ f
save[i++] = *addr;
U, X6 C/ @% q
sync ();
# p c r. g# @& H. n
*addr = ~cnt;
, L7 I2 c3 c- |9 {
}
) \, w, M4 S4 ]' @, H
! y0 @7 r: K& F& s& t5 S0 ?
addr = base;
" Y' Y! ^+ s2 @' G% s2 v0 x+ _
sync ();
2 @0 x1 n: g( ?7 ?; E* T
save
= *addr;
& G2 L4 y. G9 z6 L* R
sync ();
. \/ g# a6 g* |" o! ^& o( E, B
*addr = 0;
" `$ C6 b* o- C1 ~. r
. v# g" e3 @1 T3 F! r" T
sync ();
0 z' ~5 D0 k9 Y- H$ H, W
if ((val = *addr) != 0) {
/ B5 m/ j8 d' {& E
/* Restore the original data before leaving the function.
0 d; \" y2 Q& L: V/ Y3 i
*/
/ l- t6 U- c' Y4 c" ]0 ]3 j- V# A, o* k
sync ();
( Q: R8 |8 r: o$ b& v$ G8 o+ f
*addr = save
;
O2 l% R, a5 q" |( z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( g. d7 I! z2 |8 n$ i5 s
addr = base + cnt;
% C0 x P. J2 H3 F) P7 I$ p
sync ();
! E; E( }! _) i% v
*addr = save[--i];
9 h# [. I* W2 J/ z
}
8 E' f9 f; L' F6 ]+ d( v. ]
return (0);
* h4 V: c) @3 r) x, \( ]/ u
}
. C C, M7 n) T* V) f
8 d8 {9 ?& _; s# n. p6 E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 R; p4 L( \+ |/ H
addr = base + cnt; /* pointer arith! */
0 {6 N& b V; p: Y- L# c u% l
val = *addr;
6 V0 D4 M z3 t$ t
*addr = save[--i];
8 N$ H$ @9 M: H0 B1 J
if (val != ~cnt) {
V* P) ~, N" ]5 t ]3 p
size = cnt * sizeof (long);
; S6 T! @3 f" @( f% q
/* Restore the original data before leaving the function.
) |/ l$ c1 q8 d# I/ V. ^9 f
*/
+ x9 q9 @' O) m w% L" R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) W" f! T2 H3 }) |' ?9 k, [: \& f
addr = base + cnt;
4 ^' R& o5 u( i
*addr = save[--i];
0 Q6 u0 x9 C$ K. O3 P5 g
}
4 O9 J+ E: E5 A$ g# O; G
return (size);
0 \# [8 C$ `5 i
}
& L) U1 s# n0 |7 r3 f3 d& C+ f
}
) `& }6 O. y: n( e4 \0 G) `
' t) V, E6 e7 D
return (maxsize);
3 d7 a& f5 i: D- ]( j
}
; j; ~# A$ {- k, v7 l
int dram_init(void)
0 K- n* I$ Q7 h
{
, l/ ]* K. x+ c7 y
/* dram_init must store complete ramsize in gd->ram_size */
C: i* R5 f) ]- N4 m" _8 x6 |
gd->ram_size = get_ram_size(
+ V' Q. Z) V2 w( u/ a' V* L
(void *)CONFIG_SYS_SDRAM_BASE,
3 J6 |' m) @/ J) L2 N! O: K
CONFIG_MAX_RAM_BANK_SIZE);
5 V. y7 L3 y& F' E
return 0;
2 S9 B- G& S# ^
}
$ A# H! O6 x& i" Y l& c
9 T2 g6 q: t. o8 s
' {: q Z6 c: Q2 [4 C l
. y5 }/ ?0 v$ P! ~
" o. f. [2 K6 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# F& G% K4 \0 Y! X0 e, ^
2 h: A& Q" T& j2 p, Z
0 k' i& `% o. P8 I3 o5 U2 C' U
6 L. g" b9 S" y7 i5 ]
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4