嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ ^. X; o4 J) L( }8 A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& O, j. F. Y' M% f/ M) a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
F# G; w: o) ^) O
; [8 @( W+ s3 N. n/ \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" ^6 o5 A* e# \& N1 `# h
, y; k5 P3 Y9 h/ v2 z4 y0 N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& Q c* W' U* C9 }
/*
4 G G2 e; E- I3 h
* Check memory range for valid RAM. A simple memory test determines
0 ~7 K$ y3 C8 M/ `7 Z' y8 b9 B o% u
* the actually available RAM size between addresses `base' and
! u- x( y( C/ b g* g$ n: E
* `base + maxsize'.
" ^# `' l0 K! L4 Y% J
*/
7 F+ c. f7 x7 H- y$ _
long get_ram_size(long *base, long maxsize)
7 a) V- [0 @' L6 \- u7 S
{
8 ]/ |: M5 s3 G2 b4 G; ]$ U
volatile long *addr;
0 G0 N5 ^, e, y2 _3 Z5 s* r/ }
long save[32];
& a F1 Z3 b* \8 Y/ M) \4 x
long cnt;
8 i: ?( S2 i( a! ]" u
long val;
: J* ^% C% E0 l8 @! D
long size;
3 B g$ X# x: s4 d
int i = 0;
& S6 A* B: q% M- L
7 H/ q. r) h9 O& H9 g& P! p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
l0 R' s! g( n" F
addr = base + cnt; /* pointer arith! */
2 J4 [& g1 m* O3 [) r9 B( I! i2 V
sync ();
E7 B3 J! M! Q$ a3 Z0 B, Y
save[i++] = *addr;
]/ x ]3 J! W
sync ();
* d( g( m1 c4 b' _" D- {0 ]- N
*addr = ~cnt;
- g% a! {6 \6 B
}
2 _; ^0 G1 y- a3 ]& Z5 c/ z% Z4 H
! r4 `+ f/ P9 _, H$ o/ \- \
addr = base;
: k8 L( ~) x- ? f U
sync ();
# n$ c' Y: W, Z) J, ^7 s; ]
save
= *addr;
/ }: f D% U8 o1 z- i
sync ();
9 @+ X& I$ p- U0 G
*addr = 0;
2 v9 V! z( i8 c+ I- O3 t! r6 E: u( I
/ w& }( z K* b2 i1 r# M" n' |
sync ();
2 C/ c1 ^$ Q4 C/ o3 X
if ((val = *addr) != 0) {
, B2 l3 J; B1 |3 T
/* Restore the original data before leaving the function.
e+ l% a U5 Y7 h
*/
& I2 z' [: E) m" a! q1 Y+ h' W* b
sync ();
+ E: r8 O- e0 b2 \4 n
*addr = save
;
) j; |' C/ b# S& S4 k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" r/ q" j' l; o, }/ `" F4 d9 D
addr = base + cnt;
- t; }: [9 W4 e' e) M! i
sync ();
' ~" C$ J% _9 c$ f- X
*addr = save[--i];
- y1 y1 K( d( @+ L- r* u3 m' h' l! v( m
}
5 I5 N3 W$ J4 Z4 Z: b; i+ D, J
return (0);
; d9 l5 ]9 o( U% p! s4 m. t
}
9 a/ s7 ~4 H7 ]- o, B" C! p
. Q7 i/ R$ j8 p2 j M9 p, T7 b
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 W8 v7 O g* y/ H5 x7 Q, V
addr = base + cnt; /* pointer arith! */
7 w6 B, {% p% B" C3 I! T
val = *addr;
& V3 g9 I$ x, Y! d
*addr = save[--i];
' @1 R9 j6 U0 S
if (val != ~cnt) {
- R6 v$ Q5 a4 o- i; r
size = cnt * sizeof (long);
0 w+ m2 c9 s {& Q/ }9 d
/* Restore the original data before leaving the function.
6 v1 A$ V E" K# @
*/
, E4 ^* F; M/ p w( x: S8 R
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) y. i' `% X/ h, w5 A% e
addr = base + cnt;
3 B/ W) }0 ]& Z1 e) i
*addr = save[--i];
$ `# \$ k/ Q9 j. d$ [1 U3 u
}
6 F# c5 Y: T+ {* r: A# y
return (size);
; s( K- Y4 ?& f) o% c' u' P2 [5 C
}
; q- E/ L# ~# O: P
}
5 `6 Z. }) x+ i1 I+ K/ G
* g0 g, J. Q1 v) O {
return (maxsize);
2 O$ H& A0 D7 G- x
}
r/ J2 j: r) h8 n% r) q6 u' ]
int dram_init(void)
' x! }( Z9 i7 J$ \+ s1 l
{
! @6 |# m/ _3 t3 N+ w
/* dram_init must store complete ramsize in gd->ram_size */
# X# E/ a" z- P$ C5 ^
gd->ram_size = get_ram_size(
5 n; M; G9 F/ u" I8 S
(void *)CONFIG_SYS_SDRAM_BASE,
X5 B ^2 p* n) V8 e
CONFIG_MAX_RAM_BANK_SIZE);
$ \ m- o8 {2 O O
return 0;
( u) l5 L8 m; g
}
* z5 a( e; y' S5 Q- C
3 ~/ u$ D+ P8 s$ {
5 u q9 p# o# v3 p% ^
8 h& x/ N1 y! e) n. ?& I
" Z$ y& M0 F/ c! e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' `6 R% x- t6 ?* ~
& x& P6 w3 U# l4 N3 V) c: v
+ x- g* ^) ^" ?
: ?; E% |8 R* }2 W# m1 {# O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4