嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 _" U8 K( U9 w/ X9 S1 o+ p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 q- O% O$ j5 ~+ z; f# }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* L' ^& C4 H/ i2 {" M2 G4 _
$ n L3 R3 K8 P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ h2 k- Q( A$ d4 T' Z5 n/ x
1 e( K( l9 R4 f, ]4 E4 L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: B( E/ o1 o: Y# b
/*
' z3 P9 ?8 v" T7 [9 ^3 ?, E* |+ N
* Check memory range for valid RAM. A simple memory test determines
( F0 @5 I, @$ }1 r7 i1 \# ]) i7 Y
* the actually available RAM size between addresses `base' and
5 u7 H: i$ L- Q7 B( O, r- e
* `base + maxsize'.
# i# m' |" B; P
*/
g5 S" c6 C/ t2 |/ M" @0 O
long get_ram_size(long *base, long maxsize)
. o7 ]: v V @8 ^
{
- m5 p# n$ ^4 z1 O0 z8 B j
volatile long *addr;
3 b }1 w% L! o. i" j, o' I
long save[32];
6 E0 R( ^. J6 x
long cnt;
9 N* t0 |/ q2 g. L; _
long val;
% P" i/ _! z) R
long size;
/ [3 @( D" C3 m# p
int i = 0;
1 k! W. B+ H6 W$ B, r- c
: Y* {/ z u% h) d! p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# V7 n, P- s8 F1 F6 |
addr = base + cnt; /* pointer arith! */
+ ?, u) j9 }" t
sync ();
- l/ ?5 w1 Z& M0 ?9 R( E, }# i; R
save[i++] = *addr;
) v9 [& C2 s0 L
sync ();
# ^/ U! k9 V# G9 m( \
*addr = ~cnt;
* H% g* J) `8 L7 G* P
}
: \. X8 l. r& ~1 q; i
+ \ c) n! M% l+ E/ t5 F
addr = base;
0 z; m( c4 q+ e0 `; h
sync ();
/ l. y' r& x: Z; p: h
save
= *addr;
) W" v w. b8 l9 S" _; k ^
sync ();
) V" A! D; w: w
*addr = 0;
& Q* q* p0 R) N& D
' w1 o4 X% g2 n b6 d) i
sync ();
\( K7 `0 A- t4 f, q. K
if ((val = *addr) != 0) {
$ k" n( B1 n: U) e+ h
/* Restore the original data before leaving the function.
& u, p! A( Q5 K! V5 ^5 e( j
*/
2 u5 ~: E! l) f( ]; r: K: `0 S* O
sync ();
& i& `- C" Y/ T% @" y7 S
*addr = save
;
. U3 Q& U4 h; C8 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# e5 F; g1 [) b+ ^; C4 q0 C
addr = base + cnt;
- g" S" {- B; D7 `$ o- e' v6 Q
sync ();
2 w; \% n, @: e- y: S" K W. }
*addr = save[--i];
6 Q- o' D$ j+ o3 x
}
+ U% _' H2 F3 b2 L3 {; d0 v
return (0);
& b9 z# S3 `, [0 w
}
3 h0 Z: H9 F3 A* z2 P
5 p! z6 W8 `' N& P8 [4 ^6 M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 E6 | q. g) b0 z( ~) A6 \* S% {+ l
addr = base + cnt; /* pointer arith! */
; V }5 w' m8 ]1 Q$ z' S
val = *addr;
4 v+ E; g8 {) K
*addr = save[--i];
7 e0 S$ @7 H2 a) L& M
if (val != ~cnt) {
% w3 x1 L) {7 ^1 f {0 @5 e
size = cnt * sizeof (long);
1 L6 L8 i( J) z k; U( L7 u
/* Restore the original data before leaving the function.
. s; h8 f! Y" N, C
*/
4 O9 i( U; l- Z6 p/ D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h( f7 |+ J- `# Q# ?
addr = base + cnt;
& m5 Q' T2 {( @
*addr = save[--i];
/ f0 F* W5 K3 X8 m0 x) f" E* @( U
}
_3 z& _- K+ P$ x& }3 e9 ]
return (size);
# J9 m+ @& ^( t( u$ A1 v/ f+ m
}
) \, C/ j1 M5 D9 h* H
}
/ {3 e' y* ~2 u+ S/ j* b. S
2 b4 J+ }8 B1 y' E! U
return (maxsize);
6 J! a$ e1 H8 Q
}
( a" B( a' `9 j1 H% g: i5 c' l
int dram_init(void)
9 T- Q# Y2 Y( a; X j: j2 X
{
7 z- r9 I& G: k ], P& y- K( `& P
/* dram_init must store complete ramsize in gd->ram_size */
. [6 I! s2 |8 z+ C5 o
gd->ram_size = get_ram_size(
1 j/ l# R: c" o. ]- Y
(void *)CONFIG_SYS_SDRAM_BASE,
9 F# q& h* G$ M' A% I
CONFIG_MAX_RAM_BANK_SIZE);
( p( s4 e& c, P% d+ ]$ ?
return 0;
5 i Y4 N/ t, f
}
9 Y- Q4 l9 ~) `, O3 U' V* b
) ~3 H& T8 J; ~; t- a5 R
9 O8 s# q' j4 Y/ {9 w
1 N! g. t( | h0 y+ A
/ x$ Q6 z. j( {/ o; d X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; a$ a3 p, U& K6 Q9 \6 o
9 B4 @8 p$ G7 P* S& D/ ^9 a
: Q7 i3 Q+ A$ e/ \3 K& j
# [% Z% T3 f+ r0 T) Y+ ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4