嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! R) Y- R7 j g
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% R- ^# G3 S& j* T3 Z5 M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ g, o! r1 s6 Q. ]9 h
$ a( B% p& j* m- Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* p/ U" H; @) J: s8 A
" ^1 ]& J3 t& N% S5 I* \; u" E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ e1 s5 ^, e8 b3 O3 v; S7 l
/*
* o2 a3 [' ]% @6 V$ @- {
* Check memory range for valid RAM. A simple memory test determines
% Y7 c, q5 w$ Y" r
* the actually available RAM size between addresses `base' and
- N* t7 a4 B; _9 u% \- I) ?
* `base + maxsize'.
' p8 }: {! {8 W
*/
4 c, \0 I6 T" U9 B
long get_ram_size(long *base, long maxsize)
) x9 D$ d/ b3 A9 [. A
{
/ U; T9 s2 n1 [0 \. ^# n
volatile long *addr;
# F) u V+ S9 k0 B* F
long save[32];
* ~8 B5 `0 \1 v7 V* S' z: o
long cnt;
7 @/ b1 {5 L' K' u6 i! t
long val;
8 ^* b) U% w% ~! o; T
long size;
' M$ T( N8 v+ f1 Q, _/ R
int i = 0;
- h: ?7 n' A' E. U
! J5 U, ?$ m4 O6 Y$ k/ Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- e8 x- P, j0 k6 Q' A
addr = base + cnt; /* pointer arith! */
8 B' \" a0 N u4 J5 Z0 r! M
sync ();
{, E/ p' g% Z1 K5 d) D2 Q
save[i++] = *addr;
" Y& g( ~% V9 K6 j- X# ~
sync ();
8 I- j3 R4 w {/ ]1 S8 K" s v+ T0 }
*addr = ~cnt;
5 J3 P4 l1 n8 ^: F/ I1 ~
}
3 @. l. h, S& w1 k. r% G
7 \ F& c9 ^% S; S) r ?+ a7 I
addr = base;
9 X' D# Z. _% [$ _
sync ();
$ A( R2 p8 G7 J& f) G- p7 ?
save
= *addr;
( X( l8 N8 V: n0 t6 @7 |5 Q
sync ();
$ F8 l/ g! o+ y; { o- Y
*addr = 0;
* L0 i: z# m; B+ n; ]" Z$ \( M
' d( c0 x* @) k# f1 A
sync ();
N# f# g5 V( ~) S5 P' W
if ((val = *addr) != 0) {
5 V1 z3 c* E" z
/* Restore the original data before leaving the function.
2 W% g5 f# X# t, q K& i' U8 z2 {
*/
+ m4 U/ |; C. t D
sync ();
# b. ]; m# K0 P& S
*addr = save
;
1 o, t2 t5 W" X; M0 K* G% `% J; ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( j8 \6 @. x: B; x5 U. Q) |0 Z
addr = base + cnt;
+ e5 e' o& p9 `$ b
sync ();
& ?+ S$ E5 w# R
*addr = save[--i];
3 r+ j9 f8 d$ K+ m$ h
}
( `4 \& u1 @9 g( ]& N# B. q f
return (0);
# u% Q; B5 ]0 L& ~. H
}
1 ^+ a" ~4 W9 l' N& {7 Q. D% C
0 R( A: s. S1 `# F( k }1 r
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, L' ?) x) P# Q3 I4 o
addr = base + cnt; /* pointer arith! */
% ]! s0 z6 \3 g
val = *addr;
9 u9 O% y% b/ V! L
*addr = save[--i];
' K) B7 X ]* L- X
if (val != ~cnt) {
$ a* J6 H( Q6 h7 {' S4 V
size = cnt * sizeof (long);
' D M2 ^: b2 u, I. Y" v
/* Restore the original data before leaving the function.
6 m6 x7 ~) _$ }6 v( n' a" u
*/
6 w2 Y4 S4 ?3 _1 i6 d: _6 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& w3 Q: s* \8 {7 u0 X' E8 ?) }3 w+ @
addr = base + cnt;
3 y- H* D2 y4 ?, Q9 N: H
*addr = save[--i];
5 p z9 [3 j. ~1 f: u% P
}
) Z% e7 z9 N; S' `' T* }7 m# n
return (size);
8 A! F/ ?5 p2 Z! J& R
}
5 h; t6 p- s3 Z- A3 W; L8 R' m
}
/ Z- r* ]& m0 {8 i0 }
; k% ]: p3 C! q. q4 g6 G
return (maxsize);
5 S" x/ K/ z' K$ K6 }
}
$ S# `; a0 v' [! o' a
int dram_init(void)
" G2 C V0 E6 j( l `9 ]
{
) ^5 r, k! T4 `3 [* D
/* dram_init must store complete ramsize in gd->ram_size */
$ q x5 z1 q% R% z
gd->ram_size = get_ram_size(
/ ], h& x! p3 H0 x/ D
(void *)CONFIG_SYS_SDRAM_BASE,
8 _, ]# U, g; N$ I0 g: e: F# L
CONFIG_MAX_RAM_BANK_SIZE);
8 X9 M' D8 T! M; f. M, y) }
return 0;
- i5 O3 |3 Q; u( e' _
}
3 ^6 l h# X+ m3 i- k4 R+ x' G
, g0 Q. X( U+ T7 O$ L
( g3 G# M N( S L3 K) J
% v k9 G% l4 V0 G
0 W4 @8 r7 [* Z9 s4 N" b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% [$ C$ w9 g; R+ x! @
( L. Q# l9 P$ n5 ]5 `3 Y* g A
. \0 Z) i# i8 ? r2 ?
1 v& D' X+ c9 H" @# A: X, a5 Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4