嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. ?0 P4 T8 P6 d2 I) p0 k+ Y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! F7 o9 e) V b2 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; E1 {* d h5 Q K, S- e6 B
% s% f' h4 l1 D& e" x+ N7 r l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 ~& H# n$ z1 y5 B) J7 q _
& t; r% I# [5 X" U! V3 |& C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ t6 v; E) T* N/ i! Z9 J( \
/*
5 a% g' E' ~+ ^- a8 V& {1 x
* Check memory range for valid RAM. A simple memory test determines
1 j0 i4 e4 h5 [+ v% z
* the actually available RAM size between addresses `base' and
4 R9 w+ p/ l0 q2 f* ?
* `base + maxsize'.
# m' q. V1 v2 k% X
*/
* Z% O7 x% C, _8 ^! }
long get_ram_size(long *base, long maxsize)
0 D6 _9 ^% F' z3 Q
{
& ~) k" w' r E" h
volatile long *addr;
1 @/ J/ L1 ` N) j, ~
long save[32];
5 T: `) c1 C! ]+ `0 O' ^2 ~% t
long cnt;
6 j4 J, F# o3 W2 b0 q6 p
long val;
0 D6 k, T2 k. t/ O u+ ]
long size;
; e( q; e1 i. g. t z* X" o: \
int i = 0;
`- ?4 {* I, P
: q) ?" A" `% U' q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- D+ E& @! ?7 Z" x: }5 o9 K" f
addr = base + cnt; /* pointer arith! */
. w. P3 H# r- q5 {
sync ();
, o, j \3 O/ Y
save[i++] = *addr;
& [0 T* S1 \' V' V# a
sync ();
+ X4 ?0 o* O; Q: F
*addr = ~cnt;
) q& F. _- m% e4 \5 @3 N- J$ F
}
( w* f& |1 H' H5 T- b0 E
1 r5 T0 U# a+ f1 T% r2 I
addr = base;
9 _& `! E. A# E3 ], Z2 x5 ~
sync ();
: p" O, m" `2 F3 ^, c2 t
save
= *addr;
/ q4 X* Q( O+ Z8 x B
sync ();
, b& d" g i& u7 V8 g4 A: F {
*addr = 0;
7 P5 u0 R) V( d( Z* G2 \$ W
, f! Y: T& ~8 T5 S( [) A* g
sync ();
+ Q. W4 F8 y& Z- Z0 G9 x. I- S j
if ((val = *addr) != 0) {
" |% }1 @" r8 ~& Q5 V
/* Restore the original data before leaving the function.
- i2 Q" Q6 F g6 u3 ], q
*/
; r: E, X) F% f7 e
sync ();
2 o* v3 ~% S2 Y' k
*addr = save
;
0 K% d3 K* `+ v! v* h+ k( C: c
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
{6 o) {* Y4 @! r" [
addr = base + cnt;
! ~4 A. a+ L8 J |( g
sync ();
! E- w) `8 \& T) i* R
*addr = save[--i];
% g& y9 I$ V3 V, [1 Q
}
2 O' L; E# M8 S3 z' a! B# C& S
return (0);
% O4 X* x( N* u- S+ r! o2 _
}
- j* h5 B/ r. l4 s. E4 T
7 A( n5 Z! d \# g2 Y+ g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ s9 Z6 R1 ~( E" U% `& |* c
addr = base + cnt; /* pointer arith! */
& ^7 N% Y) i2 U' }
val = *addr;
: Z8 N1 d8 m' T9 Z [ D/ C
*addr = save[--i];
0 |' Q. Z' G, p9 c
if (val != ~cnt) {
. Q5 @ N9 {0 I% t5 W) a. D: T* j
size = cnt * sizeof (long);
3 e$ l' V6 L0 B: k. E
/* Restore the original data before leaving the function.
! g! H: R* b4 |8 y1 s* C/ J
*/
0 Q/ N- R$ ` D! [5 k2 O, k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; F3 d% Q" E3 D$ ?4 j
addr = base + cnt;
9 @- W" f- N9 A' Z" i: Y0 L
*addr = save[--i];
U( `$ O" O" k* W( U
}
4 i5 I& g6 v1 D- E/ v6 P+ S
return (size);
! a, w0 P* {/ t2 e0 A- L& d4 X6 }, r
}
) I3 F; I4 T- ~/ V5 P( ~ H9 ~# X" f
}
) J% K6 r- a$ z
8 ]9 o5 j: b0 `) o' H
return (maxsize);
( M6 \9 N& R" X8 P
}
1 Y8 c- F4 x& J7 s: t1 m9 |
int dram_init(void)
' p9 {- k, _2 @$ }4 C: D$ ?" j
{
% v& X# M) S9 p! \9 r4 p
/* dram_init must store complete ramsize in gd->ram_size */
) p9 {1 T! S. S& h) ~2 i
gd->ram_size = get_ram_size(
1 z$ d8 q8 a% ^) E% B4 Y
(void *)CONFIG_SYS_SDRAM_BASE,
! }- s, i- F) N
CONFIG_MAX_RAM_BANK_SIZE);
, L1 A' B1 |4 }2 E+ B6 K9 H: i$ l
return 0;
% l( ^; d+ d4 V" j& ?" S- m' d
}
( M+ Y7 ] p1 N8 ~: U; y' Q
0 T t2 S7 L" s4 P$ U4 B) @; k
2 y- ?9 u' n" ~0 k4 X9 z
9 G* L0 \3 E! R, _6 i' t
8 h* l) l7 S/ Q2 S; T5 ?/ k1 l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ P+ f$ j9 B! R$ T# Y
/ Q1 t* x! P2 |! Z
4 G- U: U6 {) G4 l' O
0 w6 i# z' u2 x) H/ z4 P) |6 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4