嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 G+ W7 Y; P7 [$ B. o, h4 o$ C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 A$ T& ~! d# g1 a% k, }; K
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 k% C, a+ [* K) ~
1 _ y8 w7 [" [' X# J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 n, [* S9 p" W/ l. E
7 A6 f6 t9 T) W" i, j: j }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: g# R& p4 g% c0 u1 a7 |1 F1 Q9 L& H
/*
0 n7 n' J0 V! ?
* Check memory range for valid RAM. A simple memory test determines
+ r& a& n1 m& V! ?+ k; L- {
* the actually available RAM size between addresses `base' and
% a- y+ R; V7 n
* `base + maxsize'.
& ]; h/ Q( A1 Z; Z
*/
! Q- S) C: z% S4 }$ R- D+ o4 A* `
long get_ram_size(long *base, long maxsize)
- a, T" V. v8 m, s7 i7 d; W
{
! z& M8 @2 P0 u( k
volatile long *addr;
0 v" ~, x$ o/ r( j, R9 U
long save[32];
: [* Z, @+ ?8 v" A( x' H2 v
long cnt;
0 Z( E0 K- c4 O) I' K3 o' R
long val;
) O0 ~4 F7 D" _; n
long size;
" g: [; R& S2 J9 H4 w- F" v+ F
int i = 0;
1 b* Z" r" Z7 k
, ^0 ?& Q( C' s: w2 o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; t! M8 V6 X1 P& n
addr = base + cnt; /* pointer arith! */
. X0 t7 s0 K H2 G
sync ();
* u) \ Y/ K$ y' ?1 H
save[i++] = *addr;
% N7 h. O$ {; \& _9 w. {
sync ();
; U# d0 [: d; R& t/ V' F
*addr = ~cnt;
; [* H. I3 T n% S# W' m7 W
}
: V+ N4 j7 H/ @/ T# t; ~0 g5 z
2 F J$ S2 s# I, F; D
addr = base;
# }! C& A# W, F) d0 X* @% n& Q& W
sync ();
' m, X. b7 C# s! d! _% S, F
save
= *addr;
$ K. F! t* Z$ l7 b, s
sync ();
8 K& z: Y% t+ T0 ^, ?- r1 m
*addr = 0;
$ _# y0 {! T* ~5 J
- w6 F" O- Z, H* k: w) E
sync ();
: _/ P' B3 }$ p. A7 @' w, x
if ((val = *addr) != 0) {
- M6 P" u9 r" g+ X! K% R
/* Restore the original data before leaving the function.
6 C2 N4 D" U4 @ u2 j
*/
: n3 G6 D+ N; {) A2 _
sync ();
& c1 q) `: D4 w& _1 Z% v. g# y
*addr = save
;
+ V8 {2 Y1 z5 y% b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" }% A# T( F9 ]' h& p6 W. }+ ~
addr = base + cnt;
$ n( k/ M" j, N9 Z; B- i1 @4 _
sync ();
* }6 ~0 y$ k; Z! ?6 M& s+ t
*addr = save[--i];
2 X& |+ o# X/ w; I
}
7 k2 v0 d' f/ e, S7 g4 L; m+ e2 N
return (0);
/ a8 Y6 e, _2 }. v* J
}
4 A8 |6 {7 ^5 o5 ?6 V' `- }
1 \+ D M4 T4 C% `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ k+ {9 y; V' f: }+ q+ Z, G5 \
addr = base + cnt; /* pointer arith! */
5 D4 H' c3 R$ w8 S; c, f
val = *addr;
1 s& o& N7 l9 ]
*addr = save[--i];
% R9 t; F6 Z. e' x
if (val != ~cnt) {
: [, o! v3 v* G1 i) n
size = cnt * sizeof (long);
- S2 i% }8 R, c6 x
/* Restore the original data before leaving the function.
& P6 ]; X6 y" J6 c k% f/ G
*/
2 P( M5 J: z& a6 L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( n9 Z& I# E( T0 k: v: G
addr = base + cnt;
' U: ^3 z3 k9 p7 g" ~) G# c
*addr = save[--i];
! N. i" e" E5 U7 h% ?; [6 v
}
+ C$ E& [9 }( J6 [0 V
return (size);
1 s5 p! H! h% X. I9 S
}
) n! H" j1 I. z4 r2 K5 P5 J8 m
}
+ `3 B8 h2 M' |3 f' ^) Y
' ], J0 k+ s" M" h/ B& X% H' w5 x
return (maxsize);
. F1 Q2 O( ~" _$ r% G4 `
}
9 L1 v% S* U/ E0 m( Y8 @7 Q
int dram_init(void)
x% H/ @5 W* E A
{
8 Y8 |" h8 s, x* R1 Z! r8 c
/* dram_init must store complete ramsize in gd->ram_size */
) d! Y' {$ C+ i* ~) _ S
gd->ram_size = get_ram_size(
& r) y5 ]. i, x6 n# q D0 ^; S
(void *)CONFIG_SYS_SDRAM_BASE,
& R, O% K; S+ k9 v2 |- Z- V
CONFIG_MAX_RAM_BANK_SIZE);
- I8 f" y% `/ g
return 0;
, m* {3 L/ P& k. L! r, `+ Z( K
}
3 C" K% \9 Y" d, F- U
2 U8 x+ x. @& h! k
& e2 h- z+ q! D/ V6 x- d, Q" t& |
4 u4 b6 y' F1 l
6 ] a9 B) g! Z* n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% ]' `8 U; a) f2 R0 I
! b: V# {9 J4 ]3 o5 D" H* n/ U
" X5 r' y9 @' s" i) R) {. X9 P" Z2 }
5 i) F. }$ M& f& c5 ?8 F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4