嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 [- k- p7 b4 }, Z7 [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' M8 m0 P5 W/ [9 ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- h4 j5 q* I- d6 Y7 ~) |
- P$ S. v1 n, _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
I' B: o4 s8 s, |
. Z0 M1 N- ~) H0 O+ ]6 {
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* r% v8 f6 p0 \1 i. C) d
/*
' d& D$ d+ S( K0 h
* Check memory range for valid RAM. A simple memory test determines
- G% F: \% ?) B+ B+ R! B
* the actually available RAM size between addresses `base' and
b& S+ _) n& H1 g. T9 f0 o6 D6 R
* `base + maxsize'.
2 h% H$ B/ ?4 H. N7 f, T
*/
6 A% Z( a) U( c
long get_ram_size(long *base, long maxsize)
6 v2 ` X( C% L. Q
{
6 i2 E8 J1 @! |8 a2 ~6 H8 f2 T( g" X+ p0 g
volatile long *addr;
7 \5 X$ [& h% E0 k
long save[32];
) n4 u6 @8 T% P8 i) T$ s
long cnt;
3 z9 M" R, N" s+ Z( \: c
long val;
, I9 M3 z0 B$ ^7 e8 N& m6 q
long size;
* [$ S( [) A$ o8 w2 {: u
int i = 0;
* f$ v0 p) G% C6 o- L! P: S
" g( `3 X" R/ D$ t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
K5 S) b4 @0 S
addr = base + cnt; /* pointer arith! */
, l, B' B B# ~0 Z7 @! D
sync ();
8 }) e2 d. i# z' b( ?
save[i++] = *addr;
+ G, b6 h" [! s1 \& y. t! S
sync ();
. U. Y5 y6 p: |- [* d2 f
*addr = ~cnt;
. p. o* v* D6 l/ z9 R+ \7 L
}
+ W4 u9 w) Y2 i9 V
+ S) i) H6 W- g. l3 }
addr = base;
1 u$ G. r3 ?, s U+ A
sync ();
! `5 \ a) @ E2 |" B* S
save
= *addr;
" G- i2 h8 e( V
sync ();
7 {6 U! R8 p2 T7 \( w4 `7 Q" g7 |
*addr = 0;
A$ q- s i! Z2 `$ Y9 o6 t
6 y1 h, D6 ]& d7 |+ r d
sync ();
* o2 L# N* z k0 a' _7 o/ f7 C
if ((val = *addr) != 0) {
3 \; n* F- t1 q/ G0 [( n
/* Restore the original data before leaving the function.
% |& E* f6 \# w( @ E
*/
- \; Y" y( h+ U- Y+ u) | ~, I! m$ ~
sync ();
6 l w6 Z4 \+ G+ Z8 A' j; q6 n6 t
*addr = save
;
$ W; b7 r d! K. j+ }- {) s# Z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. A4 S, l" ?# M v: r2 D2 J
addr = base + cnt;
7 b1 R* ^8 V( N6 @1 O. l
sync ();
5 @# c3 D( B# c& g* K+ P* J
*addr = save[--i];
: y! t2 N" L* J+ w2 ~! G# P3 w5 _
}
3 B1 u! h3 U4 p3 h
return (0);
7 H+ \) ]; P' n$ Y. X1 B
}
: M! }2 X1 ~( r; x. ^2 l- d
+ K. G* |0 r: L8 M7 ^
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ C% l/ x/ R3 v" ?6 ~
addr = base + cnt; /* pointer arith! */
0 f" v5 C/ s' N! u( o& H8 F+ o/ F
val = *addr;
1 S. m7 h( P2 K, ~
*addr = save[--i];
' [' S _) d5 J$ V( P! h
if (val != ~cnt) {
L' \) e5 g' m
size = cnt * sizeof (long);
3 |& g d: C4 B6 [( U
/* Restore the original data before leaving the function.
! m. n( b) C8 t5 F5 U5 H- `2 N) y! t
*/
( a. \9 @& N* Y! A
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; q" X2 y! {4 ~) E K! w! C
addr = base + cnt;
) b: z' x$ @- ?4 A4 m2 h
*addr = save[--i];
! z" x, i( k( J
}
* b, I' J# t% j4 a+ p
return (size);
- w. n( ^1 u ], O3 z5 h+ C
}
# r1 O @& _9 j6 R3 D
}
1 k5 z, [. ?0 u: G3 {/ c+ \
; f* Y% o! M/ U6 I2 x
return (maxsize);
6 N: h% H0 t( |7 X2 C% d8 H" {9 l6 h
}
; i- {/ s8 ]" }
int dram_init(void)
5 c4 n( S% H% q& F& }- @- h) i
{
[) v: I% S% J) [2 n, K# M
/* dram_init must store complete ramsize in gd->ram_size */
7 H* j% X! V H8 i' ~ B+ r" B( _
gd->ram_size = get_ram_size(
7 w- a6 Q# e3 [. Q7 |: u1 b1 W
(void *)CONFIG_SYS_SDRAM_BASE,
" l4 u7 n% i! m
CONFIG_MAX_RAM_BANK_SIZE);
5 [9 O A' r4 Y; [ t% h) }4 ~
return 0;
) q g: I4 n+ B" O& s
}
3 w# V/ m0 v T0 ?, v8 Z' V9 I, Z
1 Q' m4 A) Q! n/ ~- Q% T, E9 J
* [, G: c) `; T+ x/ N* c+ |2 o7 Y
2 L; e" V1 W' D( b- Y. ~( Y
% ~2 y% j% ?6 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ F1 B9 d, E; K& y/ Y/ l
5 v5 r; e, n& x" D6 t* p
7 g$ M8 |1 f9 t6 l* l
) Z: n) `. I7 Q, V" a% a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4