嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, v" U" k2 t3 O, y- g5 h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; R- M/ ~! d, S) G( @" Z0 U; e( P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, g9 E- q! c$ i# m
3 x% O# Y7 |" R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 p, @3 t1 s# J; Q1 c' g* P2 I+ U
( ]$ ~3 X- M6 f
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 b0 B% h& o) C# ]
/*
' K4 K% ]' R0 Z0 u, \' [
* Check memory range for valid RAM. A simple memory test determines
, E7 G4 Z! T7 u/ b7 P( _
* the actually available RAM size between addresses `base' and
2 X5 d; L# ~% x) J3 B
* `base + maxsize'.
! m4 r# [0 b" A3 H' |. {
*/
$ ~$ U& O) _0 S5 z$ O
long get_ram_size(long *base, long maxsize)
6 R% _& m1 j8 P" ^: D
{
6 S+ c6 E w! U% h
volatile long *addr;
6 J; E9 p1 }* f4 k# z
long save[32];
5 G! x4 R* [5 X6 Q+ j, A3 A
long cnt;
9 O! r. F. P5 @. X1 Q4 S
long val;
C7 b. h0 l, u7 m3 g
long size;
$ E- E( a) a! K! J
int i = 0;
- L Q/ u# q9 }' z0 ^6 t" f
8 T+ \! r) ~" f( b; G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 n! M; X( \0 @' v+ K1 S
addr = base + cnt; /* pointer arith! */
/ ^. [! D4 ~* U0 C Q) ^- h
sync ();
! `5 Y: A- C- o
save[i++] = *addr;
3 M/ V5 L! e' L+ X3 O
sync ();
4 R+ S- X7 n5 i: T
*addr = ~cnt;
5 A5 I# i5 G! T" ?
}
4 Y: V+ n# y Z( [( Q- b4 d* B4 a) m
- Q: C# T5 B3 J5 E
addr = base;
0 o. J# P, V* N4 Y0 x; W
sync ();
+ n/ t! a8 ^* g! Q1 j
save
= *addr;
. V( e# ?+ D1 d9 n8 J" H- [4 K$ ~
sync ();
" C% L. M( L Y; `" r% B
*addr = 0;
$ l3 C8 J- R3 S( Z
* Y: o* L& ^2 S3 ^( g
sync ();
& c* L a2 S% F# J
if ((val = *addr) != 0) {
% Q3 q3 K. r$ \2 C
/* Restore the original data before leaving the function.
# T' S) E% r* S7 u4 ]
*/
7 F2 s% F& ]' s
sync ();
) x- E4 }6 s, `; q0 S+ N6 a
*addr = save
;
: h' ~% M0 k3 ~# ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 O j4 Q, N! d; y$ H; i
addr = base + cnt;
3 D- c8 [1 Y5 E- h" m/ o: S
sync ();
3 J& ^2 Z& z: ~( b k
*addr = save[--i];
& E# d$ L, l. r8 T# r2 G
}
* e& @* h7 A( V, [' p6 ?4 Y$ N" M6 @
return (0);
Y- J' Y5 x; u4 D
}
7 l2 P! s( i. e/ r
+ p8 j$ T1 }/ K9 } Q" T. Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, O/ ^* ?3 J) ?( X
addr = base + cnt; /* pointer arith! */
7 ~1 \* p3 ]- z
val = *addr;
/ C7 v+ D. R6 ` f7 ]2 H# V
*addr = save[--i];
9 L& i+ Y1 ~) o! ?$ I
if (val != ~cnt) {
6 C2 i% S5 z9 C4 I/ J0 y
size = cnt * sizeof (long);
6 Y/ w9 y6 K, J; \& t
/* Restore the original data before leaving the function.
) W( r+ P6 l4 ]/ S8 R5 h$ C4 @
*/
5 z+ z& R' z% [. R0 O# Q9 q) H* }& ]- f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 U7 h1 W/ y0 g) ]9 G! A
addr = base + cnt;
$ P+ m, C3 z; P8 K) n7 T3 \
*addr = save[--i];
& C. U: F4 ?% \
}
% p/ [ z2 |4 T; s3 m. Y
return (size);
8 G) K7 J( b, i e+ C
}
" c& o! Y6 {- \, ]& O
}
" J; p3 `' R* z1 Z& O
; Y8 r! U7 r! X3 C3 B
return (maxsize);
8 a2 m, Y; l8 W$ ^/ x4 B
}
, N3 d! P! l4 d. N! z) D; |9 A
int dram_init(void)
0 m3 C5 o/ a) j9 t9 \) N
{
0 q* J+ W( i/ A1 {3 P% |
/* dram_init must store complete ramsize in gd->ram_size */
) Z9 \2 U/ ~& k7 W' T( [5 w
gd->ram_size = get_ram_size(
- M) s& l; _ e; S& w9 s* A
(void *)CONFIG_SYS_SDRAM_BASE,
7 {; o/ _# Q& ~1 f5 ?
CONFIG_MAX_RAM_BANK_SIZE);
3 e N0 W& o- B; L1 }) _& G% h9 U
return 0;
; R ~4 Y7 G0 g
}
% p$ q" g/ R2 }( b3 e- l
: e5 i( g* [6 Z3 ]4 z0 M! x
6 u0 S, [. m+ C' W* s7 U- \ A
( v$ w0 E2 s- s; }& l
& M! z. ?7 r$ ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 J! Q5 Q( R! Q, h4 A: M/ Q
$ g2 e) y9 m. i! n$ v4 L: O
/ i+ [6 v+ j, I
! w- |: ?0 v2 d- l4 g4 s L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4