嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 {3 r$ L+ C* ?; t/ M5 K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& O. D; ], v# l6 K, p) |6 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. c0 E# h7 e; z) v7 V' K
( Z$ U5 M% O! P3 g$ M y9 _0 @, j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( G7 \7 X2 B+ L( [* `6 B
; l& K$ ]7 t, C$ n1 O1 s
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( i1 k" b P. `* ^- w8 s- v
/*
: H- {1 _5 B# i& [8 F8 l
* Check memory range for valid RAM. A simple memory test determines
9 f8 A) e+ W! I* O+ _6 r. O
* the actually available RAM size between addresses `base' and
B; `$ c8 s" e$ b
* `base + maxsize'.
+ ^1 k" ^, u. X7 C
*/
u0 Q( [; D& }' j. c/ l
long get_ram_size(long *base, long maxsize)
. X, @9 _' g: V" u4 j
{
% b; Y7 E7 _' q4 ^! f9 r! `
volatile long *addr;
* R3 |$ ]8 N; Q. l; Q
long save[32];
2 b' [' z/ [- G2 e F1 J
long cnt;
- j5 f" Z! c& e9 Q/ J
long val;
: F! C0 M' h Y) ~( E- D1 b
long size;
* j0 j+ |- E9 G+ |/ |0 J/ S
int i = 0;
5 U7 J* L& d0 J- B
& L m4 C7 D8 d1 Y) x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ ]8 J& U- ]+ r# X
addr = base + cnt; /* pointer arith! */
T+ s1 h2 F5 M
sync ();
1 C5 q/ |$ V# C& d: d. i2 S1 O
save[i++] = *addr;
, a2 ]- F/ \; ?% y+ ], @0 P
sync ();
; L/ c. u$ c2 W x7 ?- ~1 N( Q! ]
*addr = ~cnt;
# R+ {, m) A, ]8 D' K
}
9 l) ?$ V6 g) ~% T7 b; _0 y
% j" t h8 s# O; P! r
addr = base;
& [! z: L9 p5 ~5 t6 C& D
sync ();
4 V0 `" R9 h- G" W! a; i, z) Z, G
save
= *addr;
# w; V) o, a' S
sync ();
. w" g3 y* ]. P3 t
*addr = 0;
: h F" S% w6 H( h
* n# }1 G2 ?: q; u+ k- X3 d1 l! j
sync ();
. |2 ?$ N) _+ j! \, q# o/ r3 D( }
if ((val = *addr) != 0) {
$ m. A# d2 M% r, B3 n- \
/* Restore the original data before leaving the function.
! b* ^: \; J$ W
*/
: X) ?! Y' U; B; k" I
sync ();
5 G. e# e1 O5 n. V( i7 A- e, |) t. E
*addr = save
;
& ^0 l% d1 \3 M6 D1 L/ j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( u- K" G' c5 P" C# ~1 v2 J; x% i3 J
addr = base + cnt;
3 \, g* n5 ` q0 R7 o3 j
sync ();
/ R; Q' Q2 h0 A" ?6 T v" O
*addr = save[--i];
0 w$ d0 f; p A( y( _. J# u
}
: V9 m7 t3 T/ a7 e- [6 w; h
return (0);
' Q1 p9 ^3 J6 w) X, n+ ~
}
! O; [5 E/ @9 N3 b& P
, X0 L% _" [) v$ g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; {# O q9 |; b9 ~; { H7 x
addr = base + cnt; /* pointer arith! */
' x. ~- `( G' l/ D
val = *addr;
M9 q; b0 U. ]& g6 G2 q, Y( L: f
*addr = save[--i];
2 @" R5 \! C! G
if (val != ~cnt) {
2 F1 _5 F' n- @0 [
size = cnt * sizeof (long);
0 }9 }& N! K: X+ O+ _# e7 P
/* Restore the original data before leaving the function.
8 Z, N# D) r% r, N2 p3 a
*/
0 E4 ]3 [% T# A9 s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 @$ R+ g& d2 C4 f5 X
addr = base + cnt;
( I3 r8 g1 x3 ^
*addr = save[--i];
1 |$ ~" h' W5 m) ?' }$ Q* T
}
) @+ h: k0 A3 G
return (size);
5 Y; i0 {* H! j
}
( t# x1 i1 i: @! }( @) E- e! j
}
8 D1 B: `% u+ S8 F q+ ?% E
5 l% V+ z; p6 i/ `( u& d( s
return (maxsize);
+ |) y6 r3 P2 V: g+ Q; l
}
$ z5 I7 I1 X( M4 L- U- A
int dram_init(void)
: c: P4 ^! q2 I' {2 h. F7 ?
{
, W9 i4 Q* G# T# h
/* dram_init must store complete ramsize in gd->ram_size */
( i, Z4 X5 w0 |
gd->ram_size = get_ram_size(
) }% p$ u, A- `' T: x4 W' X
(void *)CONFIG_SYS_SDRAM_BASE,
* _' z& G& Y4 M$ I- A
CONFIG_MAX_RAM_BANK_SIZE);
* y* U" `0 a$ F6 S
return 0;
) Z8 J" r% o% q8 R( U1 [
}
9 J( N: m6 _" \; e3 j2 \
& f1 q, F4 L* ~& @" x9 v% g
4 J1 D6 j5 ?* J+ _1 \
+ k5 ^* v' ~' d* k2 ]/ o) u
3 D2 t* @' ^2 R. g( ]* }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 R7 m; `% x( N0 h9 h& s
& ] W2 g% F) I5 ]/ F! ?
; i1 _2 J2 |! w- |2 \- N
7 I3 G. }$ f% M7 |- ^6 f+ s [: }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4