嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 m$ x. Q" p) W2 e( n5 ?- L6 \, `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% i L! m; y# y" b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- w+ g, Z4 ^; }6 L" R+ E! R9 z
0 w6 o- n1 l, C( l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: m& f( }' G5 v: j( X
. w4 V0 m' c5 o/ L* g4 p
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' r; W8 C+ E- S
/*
4 N: M! I7 b& l! j4 p; c; B5 m
* Check memory range for valid RAM. A simple memory test determines
" g% G& V4 |( A
* the actually available RAM size between addresses `base' and
& P% R+ F z( R! c
* `base + maxsize'.
% z7 M; _( K8 A5 h7 X; E, `! b
*/
8 E0 D/ L6 w( H
long get_ram_size(long *base, long maxsize)
; w1 b w$ r" G) d- H: P
{
2 j7 a' ~- u) Y1 e3 p2 `' B
volatile long *addr;
9 b5 _# D) B# k+ I+ _, C) l& W8 y
long save[32];
$ H% p$ Z' N7 S, z$ ]6 F9 z
long cnt;
" h5 `9 k- R5 o& k8 k6 v; i% ?
long val;
# U u) A% N; P) e
long size;
+ F# F* h8 p( S8 E `3 r5 `
int i = 0;
2 o% k j1 D- B# W2 v5 d
* ]5 _& s! ]( H7 E0 t9 u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 q0 X8 L( K o2 J
addr = base + cnt; /* pointer arith! */
: r; a+ b! x! j/ o0 ~# y
sync ();
; b$ s# M# _! _6 [
save[i++] = *addr;
0 T3 ^$ a: b% }- ^% [6 ^6 M
sync ();
/ s0 j4 A, @- {! X8 c& b% G
*addr = ~cnt;
6 @: h9 g6 V9 @ v4 W1 }
}
8 E* Q+ q5 S/ A* q; z C* g
. [8 g( L3 b; l$ ^! A I4 w1 d
addr = base;
1 \3 D0 {8 Q6 Q* y
sync ();
( j$ a9 Z6 t3 f/ G# B2 F
save
= *addr;
- v9 N( v2 W0 j
sync ();
' Y, ^4 i5 ^0 H9 A9 N
*addr = 0;
! [: k4 S/ {2 A0 X8 B
5 ^- D( j5 X. U% G
sync ();
) f7 S! Y' r: P' U
if ((val = *addr) != 0) {
1 k6 Q' s" i7 V# F7 j- s/ J) M
/* Restore the original data before leaving the function.
* a6 n& r( a3 [6 ~. f
*/
n- d( R1 R" W
sync ();
& d) t4 W' R! V% |9 G6 w% L- I
*addr = save
;
4 k# |2 g! d6 f. K& O7 Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 S x4 D X/ g1 z+ `0 v
addr = base + cnt;
' E/ N% p6 l" ?, R
sync ();
1 r' N0 a0 @/ ~7 a! I' ^0 Y! m
*addr = save[--i];
, R* i" P& d7 T9 w
}
$ H- K R! B' v3 @2 ]
return (0);
' o9 S& P" D6 V/ D( k2 w# {
}
+ o: T+ [+ p$ w3 b
2 ^: }2 f$ |. E. R% U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! `- C- A6 D% D. _1 L
addr = base + cnt; /* pointer arith! */
$ ?/ v, N7 E' P6 X6 a3 K9 m
val = *addr;
|! ]' o2 t J; R
*addr = save[--i];
& H" e( @- L& N4 v" \& }/ }; ]
if (val != ~cnt) {
8 j8 G S5 X; e2 p2 e" \2 h' P
size = cnt * sizeof (long);
4 X9 f$ p' q3 @: j; @$ ]
/* Restore the original data before leaving the function.
. k# ~* i# S" F5 v9 K" w8 e" K
*/
$ V4 @/ I) {7 T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 {* \5 O0 |& ]# d9 v
addr = base + cnt;
# {# E+ q a( R# W
*addr = save[--i];
; `2 |# Y5 i' r% h- |
}
% O+ X7 k3 E `* B* J+ R U
return (size);
8 I/ {( w2 F( i* l' |- W7 e
}
7 {; L/ g' V: R; W
}
5 F: f% W3 i, j' T3 n
$ t1 J/ D, D. v, e
return (maxsize);
. e& v7 `8 @/ C- y0 ^2 v8 C" u
}
4 d2 O8 B" L1 ~7 R
int dram_init(void)
+ a, T. `: |! b
{
/ b. \6 k* _ s7 Z
/* dram_init must store complete ramsize in gd->ram_size */
, ]# b6 Q8 E* @6 R D7 h/ `# ~: G
gd->ram_size = get_ram_size(
; Z0 l2 ^ h% A o$ R( c
(void *)CONFIG_SYS_SDRAM_BASE,
$ Q6 U$ e+ i: b/ A' F
CONFIG_MAX_RAM_BANK_SIZE);
1 @" E8 T, A$ b5 ]9 Q+ d) j! } a
return 0;
R& ~& u* s) ~! {3 c
}
+ ~" P5 o; d( Z; d. y4 i
. Q: W! ^% k2 ~5 _0 {: f8 b
' N( [# @' s& |4 m. Z
( d9 c$ _( Z6 ?. C$ @: F. d
# Q5 _* J, E5 w/ ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 f9 e ^' `8 y& ^: L
: k8 B' y( O2 d* x r h
% B# G4 O( ]' X! I \5 ]
7 O9 H5 p5 D0 Z' N/ d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4