嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 X/ |! A3 f9 K. P* E! s7 c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% E r z$ j0 j. y# {" s! ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( v6 Q2 Z+ e! c8 A
* @" I. j! E+ o+ h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* T) v2 i1 O" D Y. m' G6 c& V& f
( r" m, C- C d. B7 F- X" K2 b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: g# d' S8 n0 G/ v' {$ P( w
/*
- B. q. D. x7 C g3 L5 H' ~' _
* Check memory range for valid RAM. A simple memory test determines
: t% A G G1 g2 Y: d
* the actually available RAM size between addresses `base' and
4 q& r& D( [3 P1 k9 {
* `base + maxsize'.
& p- Z2 p* s0 | q" T+ u
*/
5 B0 }0 K7 m/ S/ _ I
long get_ram_size(long *base, long maxsize)
3 F7 M# A+ H1 Z; ]0 B
{
9 s' ~- y7 e C* f4 \# S
volatile long *addr;
' Q& F5 u, a% c* W3 K# ~ o
long save[32];
, d$ S1 |7 I/ S- |: L2 \
long cnt;
+ }8 h1 v. b7 ^3 `0 H+ V
long val;
, {2 F0 e) X: Q0 r6 w* r1 R
long size;
9 @* D/ h! a5 S- Y: Z4 }
int i = 0;
9 m" L0 H% }# N: n% r. s
6 p2 v2 z- Y# t2 t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( y# F6 ^0 h/ Z8 l" W- }
addr = base + cnt; /* pointer arith! */
; m; a4 o8 S5 L9 J, d7 z, Z
sync ();
" {" |: o4 q* Q
save[i++] = *addr;
" f. j u+ H @& S( J
sync ();
6 M: W- r/ V& e* |$ w" H8 V
*addr = ~cnt;
& C* i9 H% q6 f- z f0 K; r
}
. t5 l* Q3 F1 U2 ^/ ~5 p8 m; K
% V9 X4 T1 ~2 X% |9 T6 T8 n0 f
addr = base;
( p9 Q" S( s# s
sync ();
, C% i4 p9 u7 o) r9 r
save
= *addr;
! M9 }% `" U# M$ W7 }
sync ();
& x- S4 j, [8 ]4 O; j8 x7 F7 q+ O
*addr = 0;
- z( L- ]6 [ P" e
& Y* x A$ M M3 v% J8 b& T- P3 \
sync ();
5 s9 {( ^$ A7 j$ u. {" y- x: V
if ((val = *addr) != 0) {
1 D/ X! D8 u( s8 F
/* Restore the original data before leaving the function.
; }- ~( G& l1 f. H$ c
*/
. s! E, |) {8 ?6 M1 u2 I" W
sync ();
% i2 I/ o. T. ^
*addr = save
;
/ n+ x) m! R6 A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" M* Q; N4 r% F& f3 M2 H: b
addr = base + cnt;
. r. }& o- C# e* @
sync ();
! t7 d# F9 w! t& R. a. M* I* Q
*addr = save[--i];
' z* |- w h& i; Z
}
; ]! i' d0 E, Y9 t
return (0);
; l j9 H: N5 G( v
}
% Z1 e& L# T1 k. P, R, v' U; z. ?: n
) K; _' d0 v5 S9 F* Y3 }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ j, ^8 J6 e8 S1 C, ?+ u2 \
addr = base + cnt; /* pointer arith! */
! m& }$ ~; w0 \; m) d) G
val = *addr;
! J( W/ o, c- ~! d
*addr = save[--i];
" n' K0 S9 @" I# s. K$ d
if (val != ~cnt) {
9 u# ^1 t9 O5 V) D7 O% q4 _
size = cnt * sizeof (long);
; i6 y2 V# g% F
/* Restore the original data before leaving the function.
+ A% ?; G( Q6 ^* p% c* n3 Y
*/
: `9 I/ \. _$ `' F) s1 P7 \6 W; D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( P) H0 P$ m5 \
addr = base + cnt;
p- ?; ?& e9 X& y
*addr = save[--i];
7 G c3 X( k* W; \
}
" _8 X" }3 J3 M
return (size);
4 J/ g) J8 g$ d0 F4 S
}
. f1 ]! I( d$ Y0 F
}
, I4 h7 b) t, ~- Z$ H$ z
' J5 M, Y6 s$ V: r/ m. z# q
return (maxsize);
" r* y. g9 s7 s) O( R& ]
}
4 o; C0 ~. I/ T U) q' D% l( t; Y
int dram_init(void)
- C* G4 {* F% ^" l* K* B7 r
{
) U( Q3 k. ~% k8 ?4 J+ P; i
/* dram_init must store complete ramsize in gd->ram_size */
3 ?1 e3 |/ O$ l5 I- |+ u' }6 `
gd->ram_size = get_ram_size(
9 }/ A, ?2 `% i9 P8 S; _1 \
(void *)CONFIG_SYS_SDRAM_BASE,
! Y4 F+ H/ a( z# ]* }
CONFIG_MAX_RAM_BANK_SIZE);
* x3 A2 U/ ^) z9 {
return 0;
/ g8 W8 p2 K1 p
}
w/ A& T" n4 M7 b1 W
) S! g& g# _9 k! L% Q
% [% l, m* @; n3 n3 S5 K: V; E: D! P
5 u, D. k$ ?5 y4 [5 p2 S
4 \: M& b) N9 V) v" r+ ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( u9 l- R$ ?+ D @- C
: _4 z+ C2 h) I
0 Q7 H0 X0 i) E. K8 O: C+ U1 Y
. q5 `) n/ A, r4 l* w, B1 }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4