嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 }" ~ d6 y9 R0 Q. i. S$ F; l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ u' l8 h6 o7 i) A- N) F" U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 h9 U* i4 p) T, E+ i
$ S! D- ^* V% h( ~" P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ [) Z9 |. g6 Z9 s
9 B% C+ V3 L {& l
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% k, C/ d9 s" j
/*
( \6 k" E! Q* h+ U4 X$ T" F" g. X
* Check memory range for valid RAM. A simple memory test determines
1 |" i7 J* o% `9 J, y
* the actually available RAM size between addresses `base' and
! r. ^: {/ J( G5 W- T4 ~
* `base + maxsize'.
' O! |0 K8 @+ A: |3 p
*/
! I- r3 B1 Y+ ]( k9 F# a
long get_ram_size(long *base, long maxsize)
4 n/ O3 {3 s5 ^7 V5 l' _- G: ?
{
5 u9 @: _8 u2 _- M
volatile long *addr;
I/ u6 D& n( E8 A0 B
long save[32];
9 Y0 f4 Y, o8 @3 j* ^ B( i
long cnt;
, K+ l1 I; x; s* t. r3 p
long val;
: x& C" }4 q6 L0 `
long size;
3 D! c1 J; R( n2 L
int i = 0;
! i* ^) c6 K6 ]( `) j3 p- Q5 s
: a; o6 P, g& D1 c1 w" p* O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 Z" z& k! s9 U0 R1 p T2 z X
addr = base + cnt; /* pointer arith! */
1 N! b% L/ S4 V5 P* u3 K+ A$ W
sync ();
4 N" c3 [7 }! a) V8 j1 f3 @6 `" c
save[i++] = *addr;
' o9 B2 C) _! ^, ~
sync ();
& I8 G3 d9 m% j( o, q# V6 k8 I
*addr = ~cnt;
# \+ T' D+ ^& T1 P
}
( X) ^, X! L% F* O9 C: }
) J+ ?3 z" X5 g8 @- ~( f+ r5 y
addr = base;
' h1 A/ _# b7 W' \
sync ();
% t, Z5 E, A# ~! k# T' u; j7 q
save
= *addr;
3 b7 L$ w+ q% ~7 M$ N( z
sync ();
7 h; l* L* m: Q8 s, V4 C
*addr = 0;
/ ^' e* u' p. ` t) c
( O! @) I% f% l9 I
sync ();
& S a& [' L/ O! X8 M; [
if ((val = *addr) != 0) {
. V% Q4 f; F+ v. p- I
/* Restore the original data before leaving the function.
4 o: k7 u! e' B4 b8 g0 a- n+ O A
*/
- A1 |/ \2 l2 h& b) @
sync ();
9 i" P l. R' D3 M% Q7 c9 K& z6 _" I
*addr = save
;
% s; v8 U7 A+ n9 V. c1 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% y+ ?7 e. R4 @ x6 o8 G7 K
addr = base + cnt;
& Z' u8 R) N0 a( S! c2 s1 @
sync ();
) f$ ^6 x5 j' M8 F3 N7 f5 T( B2 b
*addr = save[--i];
4 s4 H) d. h' \6 }* f9 [$ o& p
}
# z4 i/ D$ k$ w1 g$ W5 N
return (0);
1 f3 ^5 o0 {& X5 g" J
}
6 q, n2 T: C2 s* O& G% t
9 | Y n' F! }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ Q3 H$ e o$ C+ R9 j
addr = base + cnt; /* pointer arith! */
& d7 {& d P+ N+ K" Y- y% }
val = *addr;
* J" j# a8 h9 C1 t% w" q3 s4 x! e
*addr = save[--i];
! m$ Y* s' J3 {" d' y
if (val != ~cnt) {
6 L( c9 d* C; ^: k
size = cnt * sizeof (long);
: v: V i$ {- y) J2 v' m
/* Restore the original data before leaving the function.
8 k. w% ?5 Z; @% J$ m
*/
9 P" _* u w9 T: H% K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 i$ G# g7 g+ f( |- q
addr = base + cnt;
, ~- H9 [, C7 V5 Y
*addr = save[--i];
% v# Q/ }) }$ Y$ J
}
! R" s$ F; `4 z' r4 `5 L
return (size);
3 h, H' A8 h; h2 ] U$ H+ m
}
& f7 {( w) L. X2 Y; S) W
}
$ k& B+ k: _8 z" b6 w
) Z- x% c$ e- }5 k
return (maxsize);
# i, Z; X; z: U1 B. h
}
& {% A& |4 f( }" p2 D5 m
int dram_init(void)
2 v) g% A! L( c2 Y4 u4 w
{
& c' O/ l7 K: {. n( `. r
/* dram_init must store complete ramsize in gd->ram_size */
: q; b7 y+ ?2 ^6 W+ K) P2 n
gd->ram_size = get_ram_size(
9 r9 z8 v. E4 Y% _% |6 A
(void *)CONFIG_SYS_SDRAM_BASE,
" L* ^/ g( G: w! c) ^
CONFIG_MAX_RAM_BANK_SIZE);
! O# e- P, _% t
return 0;
% Q2 r8 _* T8 x! f# K' G
}
7 \2 X4 ?8 z# f* k( f& M* ]$ \
8 q, c$ w# F% _8 C4 n
) X3 m( s4 s# \; y
* X; n! e! S! X2 m
2 i' |" `1 E7 J. R3 o" x3 U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( K3 ? k( _# v( Z! }
4 `, }1 Z& D, h) K# C+ t6 @; C
' I1 O" Y- q9 m; h; G R
: U% X f+ P- f, s! @ y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4