嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) L' Q4 V8 S% K& Y; k0 f* R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* ]8 C- S+ h# E+ n5 E; @: R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) _* V! l" h3 Z
7 F o) g" Q1 P$ H) W: ]& U, p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 [6 F a, D7 A1 n
4 S7 I' x9 r, C- Q; K+ z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 b9 w9 V( a# W1 O2 p
/*
/ Z$ C) r' U, e6 G- o7 W
* Check memory range for valid RAM. A simple memory test determines
5 Y7 q( ] g. J- k
* the actually available RAM size between addresses `base' and
1 ? I! w9 T1 ^- o1 j
* `base + maxsize'.
; J, o" H& M* H$ E2 F3 X
*/
. C2 d" m; K7 J
long get_ram_size(long *base, long maxsize)
. Z1 q2 D4 Z1 P- @
{
4 e" D7 L6 ?- w3 K3 }
volatile long *addr;
. b* \1 l* @# L
long save[32];
7 r: _) |5 N9 r5 l7 [
long cnt;
* j2 f! `( f& O+ _" q
long val;
$ ~9 I+ E" }% ]$ O$ H8 {, \
long size;
5 h$ s3 a0 a: r Q3 Q4 K- [/ g0 A
int i = 0;
# ^3 B$ j x% F. n9 e
5 `# t7 T. m J7 y& o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* _$ b* T6 o$ Y
addr = base + cnt; /* pointer arith! */
; U |- F4 u2 q, G
sync ();
/ \( i( V, U8 D/ t3 [
save[i++] = *addr;
+ G+ i% n1 X' E! P4 R) O/ j
sync ();
& ?1 b1 X+ A% y8 y6 f% o7 D
*addr = ~cnt;
0 D0 D+ \: ^6 J2 U5 w" T
}
* E, V8 A& j \3 O
( p1 O) m2 i) F# w
addr = base;
% ~- k0 C4 X+ o$ P2 Q6 l4 [
sync ();
3 @/ X* o2 Z/ R# s& ~; _3 b" M+ [
save
= *addr;
$ G4 `8 ~8 o+ _7 T$ _: D( C6 ~
sync ();
) H, D5 w. F6 s- v! ]
*addr = 0;
- L3 D4 W4 [, N' o
6 M4 D8 q! ]9 o" o' Z6 s3 v
sync ();
: ]# d6 U7 K u/ @ |
if ((val = *addr) != 0) {
6 ~. _% n4 F2 n5 c2 E! V, F# s
/* Restore the original data before leaving the function.
* \# I' \5 r4 Y: | [
*/
( O2 j- b9 p1 Y& B4 d0 `
sync ();
' A2 c, P9 E% W% }- s7 }3 A
*addr = save
;
/ R4 [& e U8 ^# C6 e; \, A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 E5 f; C2 i) |" \& n
addr = base + cnt;
" ~4 L5 W$ ~; P+ h7 B! Z( o
sync ();
; |. i- O" F' \0 |) |# X& E
*addr = save[--i];
% ]/ r( R: @3 Y6 G( F2 Y3 Z$ I& P
}
# h, ]/ I# Z, N6 e1 r
return (0);
2 ~; Q2 W9 U7 @8 x* q
}
: b3 v" t9 P' F" e5 A: S! J( [7 m
% r4 Q" J1 @" ^3 x5 G5 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 n5 V; f g! v' J g
addr = base + cnt; /* pointer arith! */
6 f; \* i- R8 \. I/ S2 M, V
val = *addr;
5 H9 _; v2 Z3 u# Z$ L
*addr = save[--i];
1 R! u$ g% J3 E
if (val != ~cnt) {
" _7 c. C* f" @. X" M! g) Z- H
size = cnt * sizeof (long);
. {$ |+ o2 d5 o, L0 F1 o$ N1 W
/* Restore the original data before leaving the function.
3 w6 b/ f+ R6 X. |, P
*/
_9 V5 M) R8 |* x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# Y( u& p* Z4 k
addr = base + cnt;
( A& ^+ \( F: p' A
*addr = save[--i];
' ?7 d! {3 i& a( e
}
7 K- {! ]7 e) C
return (size);
8 J5 Y2 y+ X* W i2 j% L! M5 ^
}
3 ~, k0 H% ?6 C
}
3 C2 V% Y! M0 j( |
$ X1 E! b/ D7 D
return (maxsize);
. m" ^3 g' M& H& X8 `, o! q
}
( B6 G T1 K( T; L
int dram_init(void)
( K( I8 j7 z: [, Z" \
{
. E* m8 n @% V$ ]! z+ v8 I1 [ T: j2 n
/* dram_init must store complete ramsize in gd->ram_size */
0 T& b9 n9 m' P) V& E: W
gd->ram_size = get_ram_size(
& @; S W5 ~$ P. S
(void *)CONFIG_SYS_SDRAM_BASE,
( K$ D9 U3 {: k7 P% t
CONFIG_MAX_RAM_BANK_SIZE);
# X( N, e$ D9 m3 `2 X9 m
return 0;
) `) T$ H# e% Z: q
}
$ \; A9 Z* [9 G! X/ Z0 E) O0 O
+ Q8 ^$ A K, g# Z2 A' e% p
5 J( g/ N* _2 Y \/ I7 n
! T0 I) P, ]0 s6 U# E
0 f( y. n4 S& Q) S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) L0 ?( q2 f* X1 g0 e
( z9 ~, e# p" L6 M* k. t% Z
7 R2 X- h+ T( E1 _7 `3 T
1 P8 x+ i" C9 H/ L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4