嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. {3 \ [' i/ E2 K) e! A) D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! M5 a- c/ C, E# Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
T8 E! _" w. ^0 G# u. ^$ N! B- Q
3 r: _4 X5 e% O/ j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' ~1 N3 h; K/ D. d* i
7 P" H+ V) V4 B% V8 R
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 \0 S' l4 w# T: I; H" s- u8 O
/*
/ I# W$ A( y- S+ {0 F5 F
* Check memory range for valid RAM. A simple memory test determines
7 P" Z- L8 r3 q6 z7 K- j
* the actually available RAM size between addresses `base' and
5 R3 A0 x& D, I7 c8 F
* `base + maxsize'.
) r; E( ^5 L u' t3 |% p
*/
5 r- I0 r2 W% {+ u
long get_ram_size(long *base, long maxsize)
8 J3 X6 N) j9 I3 M
{
, K2 f# j* R0 n' d: S
volatile long *addr;
. @2 [* _8 S4 }& O! o3 P
long save[32];
+ E p: ~+ R) V3 ]. C
long cnt;
$ h: l3 z' |4 X" Z) h6 \* n
long val;
" ]# K4 |" N6 ?: s4 F) i# w6 D
long size;
7 U G4 A# H, c: q( s
int i = 0;
& u4 h! G4 r& O: Z9 b F
8 u6 {6 C, H9 ^: s& c& x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- l H: ^& P* u* T8 [
addr = base + cnt; /* pointer arith! */
: [1 k$ I5 `& i
sync ();
: p0 j; z& p" S; S2 z
save[i++] = *addr;
: ^$ [' w* ~/ F
sync ();
" _0 I. k4 t" T$ T, f+ k0 m1 b
*addr = ~cnt;
0 h% T' e+ u6 K1 x& Q
}
( V3 @; o' z' f' Y) b; @6 S4 O! h0 |
! X' \4 m9 j4 P k% J! q
addr = base;
/ w, F. F# z+ W) e* s
sync ();
6 E0 Z' X- p8 b
save
= *addr;
$ {( Y$ A6 u# ~4 b% f; O
sync ();
, K1 E0 l6 Z( \( k
*addr = 0;
D& T$ i6 }6 Q& v
/ A7 g8 L' R$ S9 t2 b( N' f7 c
sync ();
6 ^& o1 \+ h" R2 @1 J4 c
if ((val = *addr) != 0) {
( t7 g0 ~( X- l" h2 v$ k. Z* K
/* Restore the original data before leaving the function.
) c$ L7 l& i7 `. z1 c3 G; W
*/
2 Z5 u9 _) _# B% W+ O9 S p
sync ();
+ U: d1 _8 |; s4 p
*addr = save
;
$ T0 ~5 b/ B7 P4 h3 W6 e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: [- |9 p+ ~+ O- v o5 [
addr = base + cnt;
7 {8 c, A9 _3 i/ [. M
sync ();
5 ?+ d6 |. ?4 v1 M1 o L Y. o" p% ?
*addr = save[--i];
3 Q/ S) K' D% Q( {9 a
}
; w" s8 ^4 F2 W: c) q
return (0);
# U7 ^9 @3 t, M8 {
}
, S5 o# i- F+ R4 k
, X# r& w0 A0 K5 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ T( h+ b* v, H5 z: D. T
addr = base + cnt; /* pointer arith! */
& h- R, t ]7 W4 }& {* ^
val = *addr;
0 _6 q/ Z4 U+ ~3 [3 D
*addr = save[--i];
5 w0 Z1 k9 |( `7 Z8 P
if (val != ~cnt) {
) y& z0 j) Y1 `3 H
size = cnt * sizeof (long);
2 I' \4 p* ]* X `5 v7 d! Z
/* Restore the original data before leaving the function.
, k! k3 f3 [2 v6 p4 |/ G7 A
*/
, G' ]% `! q0 e* M9 }+ h' A
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. N. Z5 G8 E+ Q3 b U
addr = base + cnt;
) ~0 O9 Y' y. S3 o+ P! Q$ z# \
*addr = save[--i];
\, \6 p( a8 G! ~# N0 }
}
, Z6 z& b7 d! y
return (size);
. Y8 Y. B2 I' O4 n: F, B8 z
}
+ P5 }0 ` @( D+ }
}
" e# u8 R2 | Q9 H* V6 L: k
7 j% i% h- n5 u6 g) `, L; k
return (maxsize);
$ C: Q2 N# s! w4 Q2 V0 \0 t
}
+ |" L- E8 E9 X# T' m' ^3 O
int dram_init(void)
2 c% E( _4 w. z, @* Y/ C. u% c, O
{
8 ?! I9 M+ Q7 y. h/ [& O% c
/* dram_init must store complete ramsize in gd->ram_size */
* Z) E9 U( |* b2 g- z [
gd->ram_size = get_ram_size(
- @- B" F+ F* s6 U, Z. O' v. C: C
(void *)CONFIG_SYS_SDRAM_BASE,
5 g$ h: q$ g6 a2 l4 D! H) B8 e! m
CONFIG_MAX_RAM_BANK_SIZE);
- s/ S/ c$ d* d
return 0;
, p G, G- J, e: W- N2 |: @
}
" Z% m* @6 g; C) q" H
3 Z3 e8 d1 r! M
" V( F- p1 J; z3 }, Q; h" }- w5 K
/ z5 S/ [, F( N4 {; k- u6 o
4 d" U; f$ ]2 v( E; W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d: f8 L$ B7 G5 p+ z1 ~
' ]0 X }' L- c: ~% S
; x' r9 C; q. j; w8 O% {; m: C
) X Y( C: F& ^8 U3 ]0 ]3 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4