嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 K: q5 u- V1 i) g* `* x* n
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. K# p1 D' l; B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% v5 [& ^' o# ^% k
4 R' J4 s5 G& M# l$ F7 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ L' ?7 z; g x0 ]) \
9 J* ]* ?& Z. S
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* M$ t f! I- b& @) I' o; d" @
/*
9 @# H/ q& k: ~! s! ^
* Check memory range for valid RAM. A simple memory test determines
) x3 i2 S! \, v5 Y3 I4 J2 q
* the actually available RAM size between addresses `base' and
4 E; j% M- L& L) o1 Q& e" F
* `base + maxsize'.
" l O5 }% w* K; u+ M1 A
*/
+ c" K! C8 f0 c7 ]- E( g
long get_ram_size(long *base, long maxsize)
& `* _8 W/ ]8 I5 u$ b7 k! g) g
{
7 N# ~; [6 G" o' Q9 P- I
volatile long *addr;
8 f1 o V h7 V w Q$ x l1 g
long save[32];
- f' E6 O ^( y: h- \% g1 f- J8 o+ t
long cnt;
7 I3 l* s) y; o6 s* {
long val;
. P: }. f& y, S* C9 `
long size;
. q ?7 S- E: r# [/ s
int i = 0;
1 t* d* Y) z$ o" }
& W; B8 T0 g2 @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ _/ C- K. T/ ^( i/ w
addr = base + cnt; /* pointer arith! */
1 c7 A9 S. @" O4 C' z7 M! [4 @
sync ();
3 x9 U/ \) W6 R# Z& A+ J6 K8 W: L3 B
save[i++] = *addr;
; A4 H E% E0 o% _) y
sync ();
# T$ N- P" B: [! X$ ^' a" O) H
*addr = ~cnt;
( v, A* U: m' s0 b: `7 i0 t0 m
}
: s) ]8 e5 I. a y1 k
. P( G1 L# L3 S' e) o
addr = base;
@+ t" Q/ [% g, b( d9 _4 A
sync ();
, l$ _+ d) I8 I/ s6 d5 g0 c( E$ \
save
= *addr;
1 U5 Y' B8 C# o; G3 f @, ?3 O) r
sync ();
$ b4 x( t- m) I) d
*addr = 0;
0 m S& C% e/ }) p4 n( d! N
?6 |. c0 s) T1 B$ H
sync ();
5 T. e3 \3 x/ Q" i
if ((val = *addr) != 0) {
. c! |: m" X0 O9 }1 x: `' ]) [
/* Restore the original data before leaving the function.
+ \6 z! S& i) K9 ?
*/
$ p" O3 p- p& \- n5 |# f) i5 ^
sync ();
5 J y; _+ F/ _- O. _; g
*addr = save
;
' j3 @" ?% e, K$ m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 _. z% U- f. J! q) p/ i% H# s
addr = base + cnt;
# m& R5 y3 T [1 x5 a6 l0 J
sync ();
9 n* I1 G+ N6 b+ j3 v
*addr = save[--i];
% I6 {6 Y1 n: W
}
# u0 l$ @. U# F: i3 w; V; G
return (0);
9 T ]8 Z- `4 X, d9 x7 w, R
}
9 E$ V8 K) c0 t, I; v
/ x( |! G' b5 B5 C, R( a/ V
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! s6 d; i! e. S. s
addr = base + cnt; /* pointer arith! */
3 d1 _. H1 _* S7 C
val = *addr;
0 m/ V' I6 C' n: e+ Z5 m0 X/ d% C
*addr = save[--i];
) @3 O1 s( @) y0 z
if (val != ~cnt) {
" d9 B5 @: V! Y- s: e
size = cnt * sizeof (long);
( m5 b! V4 }# H( j
/* Restore the original data before leaving the function.
/ B7 L) o g( f [5 [
*/
6 N& h8 S7 W& N% K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% J5 s' j1 g7 D, u+ ]7 ^& ^3 `
addr = base + cnt;
! {! D, e3 w1 ^/ H: M
*addr = save[--i];
B- w5 C; g+ ]: R1 T4 n
}
5 X* L- {* e/ ]3 ]
return (size);
7 l' d% x5 R5 p2 T/ p
}
( j" n4 H- t! q
}
( g8 D5 d/ Y( _/ Y% Q6 H( D
/ y0 ?+ O6 `! g2 [) p, Q! U( s0 c
return (maxsize);
* _' [" N( D {$ j
}
3 p- b9 `/ s5 B( L# L2 G3 x$ N3 U
int dram_init(void)
! F- v. F+ o& x/ [9 q1 F( ]$ f
{
7 V( P' }) e7 Y( I4 p4 C
/* dram_init must store complete ramsize in gd->ram_size */
8 G9 I+ d% V$ N, V) @& p b
gd->ram_size = get_ram_size(
: K6 j# g+ ^$ R H5 x& k$ |7 I+ r. J
(void *)CONFIG_SYS_SDRAM_BASE,
9 L- ~( I$ R5 @" ~2 h; U
CONFIG_MAX_RAM_BANK_SIZE);
. r- [" c8 \- L. v( B- A
return 0;
2 `& n4 ^5 i2 x7 f: x1 G) k" e
}
/ e& U2 C5 x# C1 |$ G' Q4 k
1 V( `' c: _& p8 ?. c$ ~/ w
9 |1 |2 j7 H& g1 Q J
5 r# ?7 Z" k" |6 Y/ n% Q. w) a
7 R7 ^& c) k) c5 {0 Q& Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' O5 G0 a4 p) P2 R
1 a! n$ }$ T" ]
& v, m$ U( H9 t/ y
% g/ v7 d) y: s4 ]0 k
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4