嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; I$ F, {, r) ]6 z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( L0 y- d* z7 |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ x' |' @/ F- ^4 u( G! y3 z
+ _2 h1 p2 n) R! }( u- G0 W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 ]2 s, V: |4 }- D1 E# H
# ^ h0 Y6 I8 o7 o, x. Z, m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 F- u4 i& g9 b, R/ E4 ~
/*
/ {6 A- w' Q. L4 s/ Q( ]2 c9 n/ G
* Check memory range for valid RAM. A simple memory test determines
9 p, W. }4 [4 u9 B' `
* the actually available RAM size between addresses `base' and
3 |7 ]" H* M' a5 w, V1 y0 _) H
* `base + maxsize'.
# p0 {' J4 x+ ^$ T3 B; |& k3 g
*/
, U! |9 @5 t5 ^" _0 T
long get_ram_size(long *base, long maxsize)
+ b; X$ j% i/ ]1 X g
{
7 D% A' I& X9 D9 w+ m
volatile long *addr;
" p, {6 x% {0 |- W* r' E
long save[32];
1 L6 M: G7 y, m
long cnt;
( u. f b: R. h. r$ u4 C
long val;
& u7 |8 `: |& R# D4 J* p
long size;
2 j X' E: D6 Z7 N
int i = 0;
0 [; G7 U2 ^5 {
( _0 @0 y0 z, Z' Q8 v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# J( L, N& Q4 z4 _/ C( ^4 j
addr = base + cnt; /* pointer arith! */
3 [9 J( |! Y+ z
sync ();
+ j1 \2 J5 s& p1 E0 R6 Z" n$ Y
save[i++] = *addr;
$ ~4 q% }8 m7 c' z8 p+ H6 Q, @! I
sync ();
- u1 e& v# `+ a
*addr = ~cnt;
% e: }- [1 M" I; D1 z
}
$ g5 h' f0 _& w) ^# X. O& \
9 F0 J( M6 [5 w& z
addr = base;
, W; r; {3 X0 U9 x2 v; c2 A/ v! T
sync ();
8 V2 o b3 x: ]/ t# q! \: c
save
= *addr;
/ U* X4 L2 Z2 Z+ x
sync ();
O8 D3 D- |; ]! c5 i8 F7 k
*addr = 0;
( @0 L/ A) \: s" ] R- \( ^& s5 ^: J
5 N5 }0 j* }* Z: e/ n/ A I
sync ();
' j1 F$ K; n0 z2 l. d
if ((val = *addr) != 0) {
( D' W4 Y" L6 |. K5 E
/* Restore the original data before leaving the function.
/ r+ \1 c, o, L4 Y4 M3 k
*/
! ]9 y( ~; } p% A; V
sync ();
/ H# _5 f$ w. M/ D2 w* d# Z
*addr = save
;
, A$ N' p+ T W9 H( b& d
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 z, x9 Q! G2 `% K6 w6 M4 U
addr = base + cnt;
8 ]4 `3 \* q* a* d
sync ();
+ ]/ y% n7 Z: B! J0 E
*addr = save[--i];
& _" d9 P) H, R; U1 Z7 x2 }7 S0 @! T
}
0 c" w \9 L2 d# G( N
return (0);
, F* b# d6 r0 f
}
* j( s/ b" K+ G8 p' @0 t. o H1 R
+ p+ c5 S) m. u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& [% ?- I1 [+ |' Z# S2 p8 a: M
addr = base + cnt; /* pointer arith! */
' K: T2 r! L. E
val = *addr;
w/ ^2 F; c- N+ R
*addr = save[--i];
- }1 G9 Y2 l; M: x1 N
if (val != ~cnt) {
4 Y7 M$ y9 N# E
size = cnt * sizeof (long);
( s+ B: p. p/ g9 g0 b. i9 s
/* Restore the original data before leaving the function.
; F; K+ H l: }, f% l
*/
5 P9 n. p8 t2 U4 F% _* S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ K+ o; M! m$ M! F4 g
addr = base + cnt;
) o8 L, ~5 X8 y
*addr = save[--i];
+ T! j; R: |9 t0 n" ]- }7 F
}
6 i% I9 x7 K; _$ l* U2 Z
return (size);
1 Z' R" U" w0 A) T, X
}
$ `4 F$ ?4 p) a8 J- n
}
) d0 b c0 A" Y! ^2 P! S
1 r6 C+ e" J% h
return (maxsize);
' ]6 s3 Z4 t/ @: Q9 a2 {
}
, v; U$ k2 X' N" K: j3 f; ]2 q7 z
int dram_init(void)
5 T! W& k* v$ Q$ L
{
5 @. r; a- }$ ]
/* dram_init must store complete ramsize in gd->ram_size */
C8 m7 Q! e. _8 F
gd->ram_size = get_ram_size(
/ s& |' r! u/ B# z, e
(void *)CONFIG_SYS_SDRAM_BASE,
& B: K5 e& ?3 C7 B, G! L
CONFIG_MAX_RAM_BANK_SIZE);
. I) A* i v! d+ D9 r
return 0;
2 `( [: c% T) [) Q+ D3 q3 s+ d. `
}
+ B- b( {4 b' [ ^3 g C% p0 W
6 _* C1 z- R% V1 m
0 s6 L$ G) q+ E
* B) V0 N) M$ P' K* e( z
- m. Q s7 i9 R' U6 ^ u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, u7 U E9 ^/ G [0 {5 A+ {
. H2 _% W% |3 A2 K3 p. \! ~4 O
) D2 ]- d7 z1 o1 Y0 M; t
+ d& S j, \% K7 u/ ?2 y1 C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4