嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# }% f0 q$ q9 ^! i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 h) l0 ?! I# M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 _1 f# [9 a u; @0 a3 W
. \, I2 C5 m; O$ T9 p' w$ [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 Q! G0 A% d* m. w
. o: }* y9 c# W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 Y, g% G5 Q8 [/ Y
/*
$ `. t; O- p& u1 O9 x, x
* Check memory range for valid RAM. A simple memory test determines
E$ R9 B, R6 s# t
* the actually available RAM size between addresses `base' and
0 f+ I# h3 y1 Z
* `base + maxsize'.
9 Z; [7 K% v! v# Y3 `1 n
*/
: Q/ `. k% @ T
long get_ram_size(long *base, long maxsize)
6 S3 z6 u2 d D0 P
{
" t8 P0 S' |( f, l X) I7 m
volatile long *addr;
$ h# }7 g; s; y, L/ \4 q5 z5 {) w
long save[32];
9 T# L3 n- ]; P% ^2 g8 N
long cnt;
8 L" O7 K$ I% ?7 L2 r4 m" u
long val;
' b) s* _: `" {' Q6 c
long size;
8 q/ k. t& G+ u6 T% ^
int i = 0;
e( X* t0 p- F& z; O
4 x1 N# e3 g* X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& U& l. U3 `) O# z/ d
addr = base + cnt; /* pointer arith! */
" ?* U6 c9 c1 T- U9 t- u$ s
sync ();
$ L- P$ b+ ~& l: b
save[i++] = *addr;
8 ]5 V& b. r1 i2 o: X8 b2 }% v( q
sync ();
, E$ J# s5 R- Z
*addr = ~cnt;
}( O/ E2 n% S6 K- Q
}
7 e& ^$ v6 a8 X1 E$ Y4 Z+ o) Z
6 d& U' m, ]- T% y
addr = base;
& V( U; x7 |. i- Z; X) C
sync ();
" s9 s5 Y) h" T( @
save
= *addr;
& H5 o r" Q, f
sync ();
. ~3 N% g' p( ~# _0 b3 L
*addr = 0;
8 x6 Y& |$ f3 e- s' n
; W! ^! J, B' b% W$ }
sync ();
7 @, I8 W" U i! {) N- X# a
if ((val = *addr) != 0) {
: R5 T. x/ ?2 F4 M. s: V; X( n
/* Restore the original data before leaving the function.
* Y" [8 X6 \* V" |7 s8 a
*/
4 f+ S) V! C' \3 Q9 ]( R
sync ();
! T, x& w9 z% v( l
*addr = save
;
$ i& M. W0 [' a3 `9 l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 @: U4 \) d6 F: b2 u- y
addr = base + cnt;
$ ^8 T {3 m# a* G
sync ();
. ~, c# a4 P M% C3 `
*addr = save[--i];
1 ]5 `2 z5 b+ z
}
3 e) f4 T. ?& w# R; O1 i8 g
return (0);
( ~ t2 E( h. j; e) b7 n0 o- p7 W
}
9 C% Y, j' C! [$ E( I' u% J
5 c6 n5 L% [3 M; r+ V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 A$ \& E+ u) f$ F- T- B! {0 K
addr = base + cnt; /* pointer arith! */
( P2 w/ r, k- N D& \, Q% Q: Q
val = *addr;
: V N% d9 {, g+ N* D5 u
*addr = save[--i];
P5 Z& t6 a- n t/ B1 _6 S/ b
if (val != ~cnt) {
! o3 a2 S5 s: ~. m5 @
size = cnt * sizeof (long);
( H" P4 d7 `& S4 A" c9 c: F9 U6 H8 R
/* Restore the original data before leaving the function.
3 y1 l7 W0 |; p6 p8 o2 E. v1 [
*/
( e b. i# |4 f: M& w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 D( Q! j2 P" V2 F- I
addr = base + cnt;
! _: G8 [8 ?9 ^3 Q* h/ }4 A
*addr = save[--i];
& A3 _$ |) p) J" |
}
a2 j% K* b0 E) E9 I
return (size);
; r2 g7 Y' q6 y! y, ?3 h8 |
}
3 \& l1 Q8 v; R' X1 n( Q
}
: X: i1 m0 U g: r
5 j, ?; q+ X6 w. I- H% y5 X
return (maxsize);
2 U- i1 C- t M
}
6 G$ G. G4 x0 r
int dram_init(void)
|) y5 v% h6 C; z! l
{
3 W8 S( ?8 s* Q. T6 u7 ^
/* dram_init must store complete ramsize in gd->ram_size */
) m8 W* P0 w* g9 I0 m& z1 s
gd->ram_size = get_ram_size(
/ t( ~. A: B; v$ m
(void *)CONFIG_SYS_SDRAM_BASE,
/ X: u! [* J/ a" Z8 s# x
CONFIG_MAX_RAM_BANK_SIZE);
4 ~5 f4 J6 G- d" D" C
return 0;
* E4 T. r0 e, o0 U) P4 @( [
}
/ ^3 p' p. b2 d3 h
: T7 J0 q! s# o: q) @2 w9 B( i
g- @8 Y7 ^& L& _6 H7 w+ h' u
' x. u- L4 f& T1 w
( v& ]0 q. a7 N7 X3 Y% O! e( n2 Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& ]$ A5 g+ b+ N; i) D4 E8 L, T
5 W) e) i' r+ o5 N# a
( b4 U \( P0 q- k
& W/ O" ?! b# U( x7 Q) V0 q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4