嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) H1 y# }+ [/ B! g9 P
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 h( K* w1 O3 m3 g; o" H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ d( I0 M p4 g9 Q
7 g2 i" ^2 k* k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& \1 l3 P1 {& | ~$ \
% y' C! D3 q- d0 k; K8 X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 q2 p @0 @5 L2 e" a( q
/*
4 @3 p" D* V6 _4 f
* Check memory range for valid RAM. A simple memory test determines
6 T0 j1 l1 w1 f( l3 d" O ]
* the actually available RAM size between addresses `base' and
# H- b3 K7 r h1 q: v
* `base + maxsize'.
$ s( H# b" j/ G" m( ]- ?# \ v
*/
. L0 U7 r" j+ d
long get_ram_size(long *base, long maxsize)
. Y" g7 O$ u* a% M- n1 Z/ x
{
+ z$ r! v" P; O3 s3 W0 O& \
volatile long *addr;
1 A) o4 |* B7 z! N! Q) m
long save[32];
$ r5 h/ N, B0 Y; b7 B
long cnt;
8 B( {$ _# i9 l
long val;
/ Z, U: W0 p+ K
long size;
7 J0 s' q. |8 @% C2 h
int i = 0;
9 Q: W5 t% k: a k$ Y/ m1 t6 m2 `) d
' H! V1 e1 i v8 g9 G( z3 s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 G7 M5 k! T5 D& _2 v* }
addr = base + cnt; /* pointer arith! */
% u" f. E2 N+ Y
sync ();
8 e! m i" r7 |+ H
save[i++] = *addr;
Z1 l4 e2 U4 ^3 |
sync ();
- ?: |# S8 A7 t5 R
*addr = ~cnt;
5 o$ j C+ y1 Z' F6 b( U& f1 c/ Q
}
* a4 ~& _. ?5 a4 X2 g/ ?9 ]- k
! j0 P+ ^7 ^8 J7 o" F. K2 ~' M
addr = base;
% F5 s( F% d7 n8 j
sync ();
9 H2 U, e: ~( z
save
= *addr;
- X% o% _1 @$ n# n& }& t
sync ();
9 }4 s, Y6 ?7 f: g. l! Q" j' M2 C
*addr = 0;
! c1 C0 X- M$ M, q
4 M3 [+ V( l1 ?7 o
sync ();
7 U/ Z8 s2 ]5 f6 l% Q2 x
if ((val = *addr) != 0) {
- ~' {* T$ ~/ L( Y
/* Restore the original data before leaving the function.
- |& ?% w6 Z: S* {3 G( `+ I( W9 F
*/
* J; r& M3 i& i* F
sync ();
% t" x* C& \! ^; q* U
*addr = save
;
0 X# g5 o2 Y( T" x6 \( {( ?
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
Y! [5 I2 |: {3 ~1 J6 e
addr = base + cnt;
7 r' l" w$ h8 d& ^/ t4 _8 f/ k
sync ();
& ?0 M0 I: z% Y) \/ m" h3 j
*addr = save[--i];
2 l) h3 w& c6 p8 `2 m( s
}
! z* s) r% n9 q, T- o8 r
return (0);
/ f) t& B: }0 C
}
; l% G5 q6 l1 J6 e: k
" H, G7 }9 A+ s% q. k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* S1 B$ K8 S u6 R
addr = base + cnt; /* pointer arith! */
+ N# i* @6 ?8 s2 [( J
val = *addr;
: k, D$ M9 x6 K- D0 ?8 O& g
*addr = save[--i];
6 Z; K2 h; H/ \* D* t* d) x2 _, u
if (val != ~cnt) {
. K+ }. f j ?
size = cnt * sizeof (long);
, n/ M$ i5 ?8 Q% J2 k9 u! t; G
/* Restore the original data before leaving the function.
3 `, \+ R1 [1 C& v% `
*/
& D7 F% i6 {0 U j3 {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# s! m( D& R- J/ c" Y0 i4 t# s
addr = base + cnt;
' [* {# l" {6 `' n. u6 ?) ?
*addr = save[--i];
( A3 ]3 B/ m7 N3 G' B) S) q6 d
}
1 T9 W& S% f3 D8 ?8 A5 H' [0 F/ _
return (size);
0 c* K/ y% g. u. W; e* t
}
) ~, d# {1 M+ q" f! u6 q
}
8 F3 D8 j3 ~# N
+ F7 U& Y. x2 ?) w7 d- e
return (maxsize);
[6 `$ i9 e. B2 v: i/ D% ~
}
4 E6 z, U( d. y) B
int dram_init(void)
! z: X$ k! J; S! ?: ]" O1 W% u
{
# e* K" Q5 w" ]5 D
/* dram_init must store complete ramsize in gd->ram_size */
; ^6 w/ Z5 L' g) ^7 ^ n- |
gd->ram_size = get_ram_size(
; l4 \) u! J& v4 Z' K) D
(void *)CONFIG_SYS_SDRAM_BASE,
" }; S/ \: A5 T d$ S& n
CONFIG_MAX_RAM_BANK_SIZE);
2 e e" z, o8 J4 @
return 0;
- w8 [' D) i1 z5 L8 p& i/ v- R
}
6 ?/ i0 H# s4 t
6 W- ]+ ^- V& Y/ v$ M. L
" Q3 e; z- s3 b6 c* L2 v& ?/ T7 |9 S
2 m3 e* p! T+ A( W$ M/ l
: o4 B9 g5 t' `" [$ x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 x/ l; ] P6 [' q
# J7 S" w! L" ~: e
( d! U& _; l! _7 T2 N3 W, W
2 t0 R) j% s3 U$ i* c V4 @6 x
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4