嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 Q5 y+ |7 J$ j+ R0 ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, O G) I9 j# e9 A: G3 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 N5 ]: o" ~+ g8 B1 i" B g
; H9 e4 \$ p" e" a5 j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 f* u; ?& G; V5 ?+ B
2 W* {9 T# ~' q3 I, Y/ T) t; U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, m3 j. B% t7 p1 T5 f! u
/*
. \; X0 M& ^# b$ b1 b4 D7 f
* Check memory range for valid RAM. A simple memory test determines
0 R) v! z2 ~/ A! r G
* the actually available RAM size between addresses `base' and
& `' m b# S' ?4 e+ m( X* I
* `base + maxsize'.
1 W( ?* |6 s9 Q; ]: ^
*/
* ^' u, r; T/ ~; h( t4 z) \
long get_ram_size(long *base, long maxsize)
' |" i. u1 _" G W" i# Y& ^
{
8 o: [) E1 j: f: ?- o2 Q3 x+ e
volatile long *addr;
9 g2 N0 s$ p' v3 t8 m1 X
long save[32];
& k, Z2 E5 G) q9 \& W
long cnt;
. O* k0 }1 z+ @. b
long val;
: |) Q' {! k* C
long size;
N: U) V9 }' @" ]/ N% E
int i = 0;
4 e+ F8 u8 D' z; _
. h T, C7 A! [# s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' X' S4 w+ @2 G% f8 x+ b; K
addr = base + cnt; /* pointer arith! */
/ d" [1 C( ]- l1 m0 B" k1 F) p
sync ();
% B; H2 C6 l" k* e3 i5 T. Q
save[i++] = *addr;
5 Q# B- f( y% }6 d" {% i5 j
sync ();
: e* s t1 j. J: N
*addr = ~cnt;
, x9 l$ Q5 ^5 s1 T! v* I& U+ l
}
/ s0 i0 }+ C* H4 `! P- I* H
' O6 D ]8 R( _+ T! S& W
addr = base;
3 z/ R1 M& \; z' y" E
sync ();
2 T# B. K/ E3 K, X8 X5 |" \
save
= *addr;
! T7 w0 R( q8 Q+ X( a
sync ();
2 n/ N! y- [ r2 d% d; \
*addr = 0;
- F K' _3 b- Z8 Y. C& c, c* s; s
8 ^# A$ l* Y4 E. p) Y3 ~7 [
sync ();
$ H1 M; D5 T+ P7 U- g9 a4 L
if ((val = *addr) != 0) {
) a- e& y4 {" i" [
/* Restore the original data before leaving the function.
% ?) G4 ?3 k- [1 i- K& F
*/
+ ]6 d; `9 e! T3 n0 Z
sync ();
! O6 c3 y* L: Z4 P- [1 C# H
*addr = save
;
0 k5 J9 w% K: }$ Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& a. S+ E% B% h- I i' F4 w
addr = base + cnt;
4 _( X. e6 M( R" `' j0 W/ a5 i
sync ();
9 L/ y4 L \+ }0 n# s/ o# B
*addr = save[--i];
; l; b3 g+ o3 j
}
3 E: h* b# J! H+ @# O, u
return (0);
! P5 p. y" ^& c
}
; R5 R9 i: h! L2 L) A7 q
( |4 s" A; N" c/ P5 p
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 Z M7 g: d4 U3 R. d: |- ]5 P! @
addr = base + cnt; /* pointer arith! */
* a3 b. O' U! q* o* W' I) @" D
val = *addr;
2 M8 l# X* h# u# F5 A# m
*addr = save[--i];
8 h3 A; L. I$ T5 M5 b0 \
if (val != ~cnt) {
% J: N% ^0 Z) j% }4 c. B
size = cnt * sizeof (long);
! J: E' K% p- ^& R
/* Restore the original data before leaving the function.
4 @9 {4 F. K$ o& r& r
*/
9 I" |7 L" T% u
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 U; B! P: E! ^9 z7 s, v5 s* T
addr = base + cnt;
, w3 X0 N. k) u- \) ?
*addr = save[--i];
% I, }2 Y- D% u+ J" O) P( I
}
5 r/ D% U9 n/ d( Y1 c
return (size);
# h; ~, S; ^- I$ Y z
}
! p; p0 q, P B& J! y6 i
}
! m, ^# H0 G4 J5 z
k- A+ ]* t4 e1 W8 c7 T
return (maxsize);
( j8 ^/ C- q/ f6 E9 ~ I$ u' h3 _
}
& k9 X# q/ \5 C Q1 \
int dram_init(void)
/ U8 m' W/ o( d7 r3 N. [6 t
{
( e* U2 ^: ?) G! c8 Z7 ?9 p
/* dram_init must store complete ramsize in gd->ram_size */
. T+ j8 ]# G0 y1 @" K0 ~% G
gd->ram_size = get_ram_size(
8 Y7 \7 c7 t$ z& }$ x; U4 l
(void *)CONFIG_SYS_SDRAM_BASE,
; _0 u4 N# R* O& [4 r
CONFIG_MAX_RAM_BANK_SIZE);
; G$ r6 U6 ?. _: t( h- G. u& ?
return 0;
, L, G9 `0 y3 E& v6 V% b
}
* _9 n7 G/ I6 M& c1 {
8 l/ K1 T/ E& s" i0 V
% ~7 W& F; ^3 I) }7 V2 J) v
- L, j9 J% a+ u- C' N; v+ G
1 a- @3 O) M% J+ ]8 Q" u* g2 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 z9 h* |4 L- N6 a7 R% r* {
1 E2 m- O1 x5 v2 V, ]+ U0 _& H+ b) N6 S
& @5 Q# w: i; W/ w3 K2 p( P
9 |7 g/ b; r6 T0 o; W I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4