嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 ~$ r8 ^; q- T1 v+ F6 C$ z( b! V$ M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; Y( P% }7 y0 U0 S6 l2 c* q- l2 n4 Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
F9 O% h* z. x4 k$ i
( H8 f. ]) d4 Q+ ?2 P* E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! j. p* I! L3 _2 V2 ^
, h: d. M2 z% x" a- F( D' p, B6 ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) |, D1 _" H) f6 V( R2 }
/*
1 k; P9 w+ f6 A/ {. ^1 y6 ]
* Check memory range for valid RAM. A simple memory test determines
& G& ]- T: ?" p
* the actually available RAM size between addresses `base' and
0 w$ u v6 M6 @3 R; p: J
* `base + maxsize'.
) i/ i! P9 g/ C6 x" A( o3 g0 _
*/
% {* U# \- `# C5 p1 j
long get_ram_size(long *base, long maxsize)
( o4 j2 A" e8 c2 d
{
. h8 h1 W9 w) s) j$ ^7 k1 b* k) i
volatile long *addr;
% j, Q1 q4 o" I. O
long save[32];
2 P5 S) u; X) W2 S
long cnt;
5 a. U4 ?! ]9 b. {! w
long val;
. j' Y% f; x! S8 q
long size;
/ R0 ] B. [% {8 o- {. u7 G
int i = 0;
k0 b8 P3 m2 C! E, |" \- c
3 r: p7 z% `7 I- O0 w# h. Y: r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* O9 j; b, t9 W% V$ q( y
addr = base + cnt; /* pointer arith! */
+ W' H. N" h+ Q3 a( Y: I7 b
sync ();
~5 Y4 F% ^$ r' F
save[i++] = *addr;
/ Z2 U/ l! Z! M
sync ();
# I: x+ L. e9 E% Q
*addr = ~cnt;
3 P# ^3 H5 L% f' k$ \ w- m* |
}
: m) B; i R7 {- o; h! m
1 \* O5 F5 s) l% c7 w
addr = base;
; C4 l+ R6 U% `. F" V% a
sync ();
( a2 R- d, }0 I
save
= *addr;
" s+ O/ d& z0 t9 Q9 c% G: U
sync ();
' x# e9 c/ O' r, R( Z# R3 B
*addr = 0;
% K0 B P0 d& x9 h& _+ @1 @: s
, K; |* w& ~7 h# p6 r4 F3 M# A
sync ();
: U7 ~0 H7 {& z1 O0 \ U `
if ((val = *addr) != 0) {
, G1 m4 T3 q1 ?' s5 v4 }1 _( T
/* Restore the original data before leaving the function.
4 T D0 J+ W0 W) z) f- ?3 \
*/
: I7 N5 C7 ~! W7 k- Z3 `
sync ();
6 }: Z5 ^; t! k& L2 w
*addr = save
;
8 i' T; ^: N/ T9 l# y) `6 B+ f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 @1 h) {& u/ P; E z$ Q
addr = base + cnt;
1 l+ J% Z. e* i, H6 L3 d' i7 L
sync ();
5 n0 n" @ L) n& ^! y
*addr = save[--i];
1 C' M0 A( e: O$ @1 ], x W
}
- e" A- |) a2 R. F; x- c
return (0);
5 N, d* D% L% U4 z9 q( A! p
}
( _ x+ y8 ]+ t+ ~
8 f/ q: }. p0 k6 d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 @$ q4 t- `) M3 H9 h) w
addr = base + cnt; /* pointer arith! */
5 p' ?! {5 P: l$ f2 l& R( q
val = *addr;
9 z" `4 M& c6 |# P1 h
*addr = save[--i];
( G; T4 \6 I4 k4 Y1 r2 g( g( b
if (val != ~cnt) {
# f& A/ L& ?0 S/ q, \3 {- O
size = cnt * sizeof (long);
$ ?) S; l% P) o. q* p0 D/ S
/* Restore the original data before leaving the function.
6 t0 s$ O' n. s- R( A, H
*/
: k7 u/ b# R6 w) y0 J8 q
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 |$ d; J `% V; M O$ ? p
addr = base + cnt;
! K. k4 b9 n0 v3 j" f! {
*addr = save[--i];
0 h: _5 I2 `& a
}
9 ^# \5 D$ w7 E+ p2 T+ S% w
return (size);
/ z$ M8 ]0 J; @% ~+ s, }+ O
}
7 ~" ]+ {6 K! r4 n
}
, r% k, ~8 Y8 x9 g6 S/ L" u
1 `$ z2 ]* w& R. L$ t( d
return (maxsize);
# T2 g1 \+ j4 g1 q0 l2 s
}
. B8 A5 f. i" d4 i
int dram_init(void)
1 h( E) F+ e: W% p1 Q9 Z6 E
{
0 J+ \% e3 }0 U- W3 p4 e& G
/* dram_init must store complete ramsize in gd->ram_size */
5 N; {/ [4 o- d+ ]* d* ^" P
gd->ram_size = get_ram_size(
" M2 ^9 M6 m a3 i& |
(void *)CONFIG_SYS_SDRAM_BASE,
/ B) C. t) n$ X
CONFIG_MAX_RAM_BANK_SIZE);
6 p$ f. T! K5 Q( N/ v
return 0;
0 d6 A5 Y/ v4 p& B- u
}
" q3 L! [4 w4 C, x" z
7 h6 X" K. O: k7 t' c
6 I9 C5 T3 M( J R; E: j S
/ q, z+ W9 q! u w2 n% t
. g! \3 i+ q& e/ R2 T! m; ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: x6 G ]9 O$ r0 _/ h' y
0 \- ~/ l. W+ Y) D, R: R, m
6 a( U+ B) \6 D* x0 W* F R
7 O+ p) C8 N3 e2 Z3 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4