嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! r( L- l8 \3 d- r( T* ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- t1 n+ H9 N; Z- J8 e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' B) i: O7 e: O& X
' `3 U' h' s/ F) u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- V0 P. ?. V1 S: ?+ L; ]# e
) k# N3 X2 K u5 f' t! V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 P/ x. {0 r) H! F/ ]
/*
4 [# Q+ [; y( C/ F8 y
* Check memory range for valid RAM. A simple memory test determines
0 M2 S; M* l! m1 n
* the actually available RAM size between addresses `base' and
" m! u1 j: l8 Q3 F
* `base + maxsize'.
- ]3 u! {6 g4 C" l$ \
*/
( F+ l# x% b) h% c0 O% v) ~
long get_ram_size(long *base, long maxsize)
0 x2 g$ ^; T* O* B1 {1 N9 |
{
- O/ Y: V ^1 K6 U7 ^) S; e, T# \
volatile long *addr;
: E$ g# u2 Q; B i
long save[32];
. S- l2 O; ^$ N) |( M
long cnt;
7 u5 K4 o8 T Q; h1 a
long val;
: ?: ]( ~" N8 ~+ L" _6 x% ~
long size;
0 A) e, h5 ?5 v }$ h! g, X
int i = 0;
+ R4 T. z; K: s8 y
7 [3 o, U* }/ X
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 B# s( y3 o' D( P! S
addr = base + cnt; /* pointer arith! */
4 j& s$ E2 u( m8 ]$ m
sync ();
8 A% s; P6 G- O6 t1 G5 r* H0 J* z
save[i++] = *addr;
' [& G; b: n# ]! x
sync ();
3 }$ h( q# L5 |
*addr = ~cnt;
% E. q% Z: s0 Q( B
}
: q/ J; } J \4 ]
5 ^# J1 m4 ]& O
addr = base;
! t1 I! {# L0 ^
sync ();
- n+ X4 H- n4 g1 A% B
save
= *addr;
- @. ?" W* ]! n
sync ();
1 X5 Z2 V S0 z1 K) }0 s
*addr = 0;
+ P' ?5 M" {; p9 v( _8 I. M
( u, _# j, ?: R
sync ();
8 o1 x( Y' p; z" X1 Q1 X( t8 T
if ((val = *addr) != 0) {
- s2 z3 `/ A- o ~
/* Restore the original data before leaving the function.
m3 B# m: q! A3 N3 G
*/
& v0 a, l, k* D _: Y' o
sync ();
6 l9 V+ h" i, @: d% n a
*addr = save
;
) ~0 ?" V# N/ z7 o& z& \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& s* y8 i) l" B; c/ y: X; ^4 h
addr = base + cnt;
3 g; K' d" b5 f1 m6 d, {3 N
sync ();
* p# R4 i9 [. L( I% J2 k! B8 W
*addr = save[--i];
9 {" L+ ]- g( z5 T1 V# d, v3 A: {* k
}
. Q+ j, ?8 O: {
return (0);
$ R% O8 J) P6 }' C l5 @
}
; u+ |3 ^9 V# J' \9 p r
$ O1 c4 t2 O1 i; l# J
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; ~8 H! A# {2 f7 T
addr = base + cnt; /* pointer arith! */
2 Z5 f% y& C* s2 ?' g' _
val = *addr;
% B3 n- P( X ]9 ^& y
*addr = save[--i];
: v- [, ], L9 P8 I
if (val != ~cnt) {
* e* D2 S4 z1 ]4 Y" p
size = cnt * sizeof (long);
) Y* M8 V" ^6 R! z8 ^: m$ D- t5 r# Q8 _
/* Restore the original data before leaving the function.
# Q6 Y2 F) ~+ _" |8 k! l
*/
( l% O a6 u! L" \) a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ^7 x' |8 M+ Z
addr = base + cnt;
4 b" r/ x& i4 v6 A$ A1 o* Z* V* m- y D
*addr = save[--i];
& q# m. x4 f* @/ j C. w6 ]7 ?. m+ F
}
& w$ @8 n. V g2 X$ c
return (size);
/ l# X+ B! S% v& f' ?% ~
}
2 F. ^4 Y) v* r+ j' h& [
}
/ B/ c) @. u% X: A% w
- }- C! K) j) V+ ^, g+ c7 @
return (maxsize);
6 T9 b4 h$ g! Z: o+ J1 ]
}
7 k3 U9 ~& V3 @+ H: P# u: M/ e
int dram_init(void)
2 K8 |. u/ f$ x0 Z/ z* q
{
, i4 c( L, C0 h7 f
/* dram_init must store complete ramsize in gd->ram_size */
1 n3 q: n3 E5 b! i9 i6 |
gd->ram_size = get_ram_size(
; a8 U0 J% x% V6 X5 A, L
(void *)CONFIG_SYS_SDRAM_BASE,
5 }; p1 K( G( J5 c8 w, w4 S
CONFIG_MAX_RAM_BANK_SIZE);
V% ^7 N) P+ O2 N% b* f. b
return 0;
* r/ N3 t1 v, J6 f( @. T; a7 H
}
$ P+ T9 w3 @1 @0 l+ `
U4 G; |0 \3 C
6 G) {7 s' r n' s$ Z2 L
) J9 h# h3 S4 w$ |& S8 b3 P1 |4 _
- P. J+ i, S7 a- M3 \# F% V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; l4 Z) \* H3 P! C4 _+ u: l' N1 M
2 o% {! c1 r. T8 } M7 x z+ ]/ O0 `
# B) H+ p' Q4 a: Y! k4 T
- d! g4 B) S, P, q( _& M
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4