嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 p: W& K4 @/ u. n
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: o6 Z9 m& q# K( n+ T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 y1 `* N. s$ r3 Q" l
# |" B% t( R: k# S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ O$ H) x0 L- ^) ^
" O0 c+ T0 F7 e" ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 [7 l; u3 D& u' \4 ?
/*
5 H/ b! H. i1 }; l
* Check memory range for valid RAM. A simple memory test determines
# j+ q0 r, j4 C& U" A; _# ]
* the actually available RAM size between addresses `base' and
9 p, h' m- \" n* G. A/ W# T' a$ `
* `base + maxsize'.
7 c4 Q; l5 \( n* W& s6 I2 k
*/
' R8 i0 w( a& D* D, D
long get_ram_size(long *base, long maxsize)
' J4 e1 }6 s; l. y9 a; A/ h5 n7 `
{
! q+ p' [9 Z* C. N# d. |1 u
volatile long *addr;
" Z8 }1 E* c" Z; z# K- `
long save[32];
; v8 I& o2 c" U# A9 l+ n) B
long cnt;
- Z9 n; L# ]$ [/ ?& t
long val;
8 @3 B& \8 r& B6 J
long size;
3 n8 t" F& W* X9 B) ?# K
int i = 0;
+ _3 _, W( ^& ?" N
$ Z: @# ]/ r5 A7 J. Y& I3 I# X+ x+ |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% A; t. T$ P! H5 `, [/ j
addr = base + cnt; /* pointer arith! */
4 u, ^$ W0 N8 T; i6 d) }3 t
sync ();
- h2 R' J, Y( a; T( N) z
save[i++] = *addr;
- `( r- N3 Q% Z3 B" r4 [% y- }6 I6 A( G
sync ();
# f8 W( E( G0 L [3 J& J
*addr = ~cnt;
% x' U" V% H3 @& E2 w& X% d1 X7 v2 t
}
+ w, k7 G# Y7 H% }3 Z" L
+ H/ j( O* X: P8 `
addr = base;
) M4 G( ?: I; B+ N. e0 p' [
sync ();
, Z2 z; S- H8 u8 M# g
save
= *addr;
# I+ \+ c+ \$ {
sync ();
! J; S' o, }! k4 l) n
*addr = 0;
/ E% n8 t# I( W! k1 U- \# l
: X6 g6 p7 a8 N9 k4 p( ]: N, k' D
sync ();
3 k. h/ V$ X1 v8 u8 W+ t
if ((val = *addr) != 0) {
3 }& @& @9 L/ [$ q0 s
/* Restore the original data before leaving the function.
& _8 x' \$ k' t- Z' h% L, W3 g
*/
% `# @% @ o3 \
sync ();
$ O; @3 d* U2 v2 F& a
*addr = save
;
9 A* j$ j# _8 T6 M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, _, Y2 m) o0 }7 I; m
addr = base + cnt;
* m! E8 C. J; e9 [! S
sync ();
0 x" A/ B$ }& }4 O
*addr = save[--i];
6 f1 Z* T8 Q3 H/ Q& N
}
, |. M4 S: Q4 O. A1 N6 W
return (0);
0 R! H2 B* Y. D6 m5 a4 {; W* r6 r
}
( L: l7 k" D+ q" X3 x! ]. d
3 l; n/ A4 v0 X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 h0 z$ _) u$ t5 E
addr = base + cnt; /* pointer arith! */
. M5 v8 o; k, R
val = *addr;
! X9 v3 @7 ^: H9 _
*addr = save[--i];
) T4 p- k& X* K7 l
if (val != ~cnt) {
( U& w7 p: C" @3 T
size = cnt * sizeof (long);
$ t; @- T! x1 ?! I2 p
/* Restore the original data before leaving the function.
, _+ o6 T/ A, B) a. o$ E- D
*/
) q. B6 T" m5 L: L* U# F2 y8 Z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Y: [6 b) d; i4 u5 j+ f
addr = base + cnt;
. y2 E; ^. ?: k+ w# ?2 h- R
*addr = save[--i];
4 p( \' H. ?3 Q0 w8 F: ?9 H4 C" l
}
, C" C J9 d# b
return (size);
6 W0 \2 t8 {) B( q& [; F
}
2 S/ _$ _2 R2 p# c; Z
}
" T: F9 r3 R' |0 j) Z; M; \
* \3 `! e0 e x; B+ ^
return (maxsize);
7 y, w; Q& H& Y" ^) C$ w- X
}
& t) v; B8 C: _ G
int dram_init(void)
8 d5 F/ a' t! w D- r+ ?' B
{
! t9 X( a2 Y3 _* n: g
/* dram_init must store complete ramsize in gd->ram_size */
4 ~9 [% ~! H" G
gd->ram_size = get_ram_size(
; t! i! \3 { O) A8 E. g
(void *)CONFIG_SYS_SDRAM_BASE,
: Z/ a, e, i( ?4 T- k
CONFIG_MAX_RAM_BANK_SIZE);
' T) D1 U! M! b, _. b. i
return 0;
4 d5 G+ Y/ u! s o8 j8 F. f
}
A5 q& H; _+ ]! ^" [
- T- z* u! I1 F- |
) Z0 W8 Z N5 `/ t7 O6 N5 i: i
# R8 {! j7 t8 r- J9 X* d
+ J/ Z3 S2 v0 T. z3 L$ M" ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 S6 Y2 E2 J! s5 d2 Y7 {
; Q# _9 z, u, G, Z
( y- ` q3 _2 ?& n! a* Z8 o/ c
. P3 g( K% w9 M* `5 P8 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4