嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 v& K) m, A( u6 \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* g4 W4 t' l9 T2 B) R& S2 u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ T6 r* q& G. v2 c; C- ^/ S1 k
0 d. U& R+ c# a7 d0 p+ {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- L8 P" J T" N; z, ^# i
1 `% Z8 E" k9 o1 ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 F0 X) ~2 A) ^. \; f$ B
/*
2 v/ I! F" T5 I2 \. B6 R
* Check memory range for valid RAM. A simple memory test determines
* U/ h, X7 R1 h; i' l1 ]2 d- v
* the actually available RAM size between addresses `base' and
; W* A! v$ E: b) p, H
* `base + maxsize'.
( _( p0 E6 j, ^, \" _; E; Y
*/
. H2 k) }0 a ~; H$ i! R" K
long get_ram_size(long *base, long maxsize)
- _. }- L( V5 g+ _9 ?) k
{
# n0 O. \9 \3 E8 ]
volatile long *addr;
" g( A9 {/ [8 H, h/ q2 c; x
long save[32];
, O- S+ r. p! ?$ h8 }* F. S
long cnt;
7 } {* _4 _# z/ \9 S: ^( J- _. C; ]8 Z
long val;
4 o6 q& W8 z& j; i, ^3 E8 v3 H
long size;
5 u& Y T* ?6 f4 g2 R6 ?
int i = 0;
% G1 `5 V1 C) T/ R
% j$ ~5 E& t0 x0 T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- [9 Q* R+ Y3 Y$ Y9 ]
addr = base + cnt; /* pointer arith! */
8 E, E0 ?2 r8 Y' t" h! Q
sync ();
" g& a5 l8 D) A8 i
save[i++] = *addr;
; j4 s. E. N5 f8 h O) @
sync ();
1 ]) j. Y4 n& F- k. p; t% S
*addr = ~cnt;
- Q; d" L' B8 [/ B) Q
}
, `. D" @1 G$ g1 K
2 ?" ?- k* e5 [) [
addr = base;
0 k2 e% D8 _) Y; p2 _
sync ();
+ Y$ r& \$ D( Q- T. [
save
= *addr;
& r1 i4 `, |5 A( Y3 l) M3 A
sync ();
2 m9 \- {; t& W% K6 @9 ^9 L6 {5 G* t
*addr = 0;
5 X8 G: j& @0 v( T H7 _
- C' M4 k$ w! I6 E# e" e
sync ();
- S$ y' t. L L( D1 e" |- u
if ((val = *addr) != 0) {
6 H7 e; J( Y& Q; t
/* Restore the original data before leaving the function.
1 w6 ~. c9 G' L7 t4 v8 g3 q$ `
*/
6 j. d/ O6 o: V7 q- b$ p+ q. N8 X
sync ();
! g3 W) G( t, [! r' n
*addr = save
;
+ u6 P, U$ t1 v- |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 R4 C4 `' n" I( H4 ~8 Y
addr = base + cnt;
. {3 r) R" b3 A% Z+ a; @% J# t
sync ();
8 Q) H- L5 M8 E' B! r( @
*addr = save[--i];
$ s$ ]& N+ y' [8 ^; |
}
6 @8 u! Q( M- k6 f. K
return (0);
/ k/ a/ K7 W: r4 C' l$ N. G1 _. v
}
. h3 m) l% E0 a6 O% P) o) v
0 B2 A; q7 z1 l; D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- p0 r0 _5 }! o2 Q5 y
addr = base + cnt; /* pointer arith! */
! j$ H# M% Q) e7 X q' [
val = *addr;
|! L. \+ g. _! ]1 @9 Q7 a
*addr = save[--i];
4 \% d) c `/ m; F
if (val != ~cnt) {
- P) y$ ~! \8 h! X- t |6 b$ _; N
size = cnt * sizeof (long);
8 X5 g0 F( c, i$ u2 M
/* Restore the original data before leaving the function.
8 _5 i( k0 i5 \# q0 x) w
*/
. F, }% D% {- y! J$ I) @! @2 B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: `! m# b8 Y: M1 s# c+ }
addr = base + cnt;
2 ]/ x6 g6 u# L3 n( T& F, a; W
*addr = save[--i];
% q$ |4 @( d, I5 q- u- A
}
; J. ]* B# }2 x2 {' W
return (size);
! ]& D9 B, L5 h- S' r0 e6 C
}
4 d/ d7 Z' y, w& ^* c6 N6 o
}
8 q) v' y. I; ]$ E6 m/ N
$ n( u) {2 Z& p/ r; J
return (maxsize);
* e6 u* Y' t( @. }; `
}
) H- Q2 o. t5 J- D" `
int dram_init(void)
& O& N! c) K% s1 t
{
5 b7 C R0 w8 {# i
/* dram_init must store complete ramsize in gd->ram_size */
: g& I$ c$ g6 n& l
gd->ram_size = get_ram_size(
/ }1 M8 M- _/ c) F4 _) a8 l
(void *)CONFIG_SYS_SDRAM_BASE,
3 }1 T- s% B/ S/ k" ~2 @' n
CONFIG_MAX_RAM_BANK_SIZE);
( M, \1 w4 W5 Y1 [8 R
return 0;
) N5 n6 w: q# y& w* m4 t
}
7 \/ \5 b1 B" e, T" B M; O) ^
7 Q Q" i0 }. E7 ?9 E; f! M! p
, i0 m3 T$ o- N' w6 p9 {7 X
5 j% h% Q, ?+ }9 l& L
2 A9 A6 I) c6 b9 k0 {: Z& c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 s/ @. f# k7 L* T p
4 |7 {, S( P3 z5 {
' u V, |$ y; c! q
# {5 W+ i7 w/ a ]6 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4