嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 s0 N, ~' L5 q% t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 h2 _1 t2 r" ?! M# }9 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, i$ A# B. ` r* s
. Q( ~: W8 x% f. ~0 u3 d2 F1 Q* o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 b2 s1 f* ^/ A+ Q9 x
$ K" [5 m' n9 Q, d! V0 N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* J7 {+ N j5 S2 \+ L6 c
/*
9 M* X* h8 i2 \3 g- t, y
* Check memory range for valid RAM. A simple memory test determines
/ E% U9 R. e! g# B* X4 L
* the actually available RAM size between addresses `base' and
: |9 o0 |7 D$ W3 M+ _
* `base + maxsize'.
+ x3 ^; X& p( i, H9 _
*/
- c. D7 R' O, c$ F. q) z3 {* i, l( w7 u
long get_ram_size(long *base, long maxsize)
7 l, A" h. }+ p( X
{
* e6 w8 J# W- i4 p" C$ ~+ m
volatile long *addr;
3 y! o' Z$ X$ ^5 ]+ R& [
long save[32];
- T: c: T' a+ s
long cnt;
! y' z" Y; |3 d3 z" t* g
long val;
/ v1 H+ ^( _1 |4 y# S7 Y' B1 n5 z
long size;
- l) x# y) W) c T! X
int i = 0;
! N1 o. o& k+ k+ [" H9 e; y; k
" D2 v0 B0 W3 J7 e. O% G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: n4 h4 D' G) |+ V: J# a# t
addr = base + cnt; /* pointer arith! */
5 g. g/ q- u4 n1 R
sync ();
3 x. w9 d# b0 } G+ W8 }2 S- _, W; Y
save[i++] = *addr;
# w7 o( [# |, s# i$ x' u1 H3 I
sync ();
& W! I6 D" i7 w' w: A p
*addr = ~cnt;
8 ^" k( S! E# U! c9 Y1 a$ p% k
}
% h1 v* L3 l( J: j4 Y$ {& I! k
s. N9 c' Q- i6 k* c' P
addr = base;
1 G- d' m6 X: |8 f
sync ();
, L0 ~" m! V4 Z8 @$ R5 W
save
= *addr;
* v8 v# D/ O; q, P$ _' _( K
sync ();
# d/ ^1 r$ O9 R: X7 B" Y* V
*addr = 0;
& K4 I9 h2 B2 Y' B
0 ^# R2 A! x0 f6 s$ y$ r
sync ();
+ e8 Y: w% m, }" [9 x9 Y
if ((val = *addr) != 0) {
$ ^1 B/ o4 L. Z/ o. k
/* Restore the original data before leaving the function.
3 j2 X! [/ q, ~. j, [
*/
# z+ N& K+ H; O) n# G5 i
sync ();
( q) I3 p% `: G9 u
*addr = save
;
! |7 o2 v' T9 Q* }+ s" S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: v+ l4 ~9 p4 J9 @# C0 {
addr = base + cnt;
3 }) M. Q( K( {7 r7 Q
sync ();
T2 b; ^) o) v
*addr = save[--i];
0 B! W) `# ~# _' Y2 Y5 r- w( {
}
* C3 ?# g4 q/ |/ N/ \( d
return (0);
* ]8 q3 [/ j' ^* M3 q; C& k
}
* c" m; N X$ v& ]
0 p% z2 m% V+ u) P
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% i- X2 W# e5 ?; O
addr = base + cnt; /* pointer arith! */
& X6 @: r1 c! q) Y" K# C( X4 s& n
val = *addr;
& x4 E3 f2 }( |+ g) G( A
*addr = save[--i];
4 m; R6 `- Q+ G! g# H! V& f1 v1 h2 x
if (val != ~cnt) {
( c: k' x0 u5 j% ~7 j- V' ~* z
size = cnt * sizeof (long);
! X% j: ^% k0 B& a
/* Restore the original data before leaving the function.
# L3 U" K" j# a$ d. G
*/
. w% t8 y9 C5 D) | I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# g$ g: c r% t% B* \$ W
addr = base + cnt;
* N/ V1 {2 w1 k
*addr = save[--i];
4 r2 {1 ^" C5 t1 p- i
}
3 L2 K& b: e8 j* d' p+ k* v4 _
return (size);
3 c. ?3 P' {( |& `
}
& d: B5 o- W, z5 d; Z8 | K1 c8 ^
}
& r4 Q4 k, s' x* N b: I$ l
1 a& @# ^6 e( h5 m( ?
return (maxsize);
' L- c. ~/ Z. P7 a$ d1 s
}
9 q6 u0 T/ \; d
int dram_init(void)
& j b* R8 T; \8 V/ ?
{
4 L+ ~' S. E% Q* N! M9 K
/* dram_init must store complete ramsize in gd->ram_size */
6 |' G, \- y! a: `" L" h! V, ]
gd->ram_size = get_ram_size(
1 U! p0 a; ~6 b1 @: H8 g; v/ d/ f
(void *)CONFIG_SYS_SDRAM_BASE,
: K5 ]+ ?9 T% O9 k
CONFIG_MAX_RAM_BANK_SIZE);
& Q+ M# M! d8 X; J5 W# X* q) u3 {
return 0;
8 `0 [# D4 c3 d/ H! R$ Q
}
7 N) {5 r. n* O; L4 l9 L3 }# G" f
# Q) j1 F3 X- Z% F6 f1 `
, k9 r: n; R: f; _8 b. ?, O( `
: i0 r" U5 Y" o0 ?. g, L
! F) f. O6 y* t4 B5 @7 h* T& l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 O U2 y5 d1 Q
: C% N$ ?' [: ]
4 i) R6 ^( E" Y5 p4 F
- i3 A! h8 z( q' s8 |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4