嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. R% Q2 v. r* A1 x/ w, m% N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; @+ T& S5 R4 ~7 t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 z5 }$ c- n$ M6 Z6 \- B5 @8 l
6 o5 [/ S3 k8 k4 t3 M) L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
~' B) R% g& e6 Z
% q/ [: C6 r9 P( K2 K$ C/ T) i. T4 [: ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 `6 Q4 b' s6 O1 f$ w3 t& Z) D
/*
: e" L5 i1 T2 e! g0 `0 J
* Check memory range for valid RAM. A simple memory test determines
0 O; c2 Z L) j/ N8 q8 l: c9 p
* the actually available RAM size between addresses `base' and
}. Y6 n- D, H
* `base + maxsize'.
6 l/ c: `& g1 K* }' a
*/
+ B. G: U$ U" w1 x# z& r
long get_ram_size(long *base, long maxsize)
5 ~ Q8 \' E# @# j
{
8 X/ u4 |# U% [4 |9 |5 U5 S0 n# T
volatile long *addr;
! x4 |; f& m/ `* Y! N8 R
long save[32];
+ r& |3 ]* {+ h E7 k) w. Z0 J
long cnt;
6 A+ O% y7 o+ g4 ?
long val;
" V- W/ `8 o+ R; e2 t
long size;
& o" ?# L5 \! z" Q1 A
int i = 0;
0 c# v0 N7 Z% m3 K% U O
* ~( v4 n" U3 F9 s; d Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
~$ j* Z& {* p* w9 o
addr = base + cnt; /* pointer arith! */
; j- k' n% w w+ |
sync ();
: a ]& Y G: B0 x5 ]
save[i++] = *addr;
9 C4 o- j- ?, l; {! r0 u6 U" h
sync ();
( p A2 C' t) I
*addr = ~cnt;
: K1 }5 O! a; U0 c; d' b
}
( W) O/ e: X6 W1 T+ D
9 K. i- p4 S. {6 X. j, j
addr = base;
; @1 g2 N, {; C6 V! q
sync ();
( z* a/ z/ L# T- k9 W& z
save
= *addr;
* c$ {) v% S9 {8 k. d% ?
sync ();
! j$ f2 U" P: U5 I2 M9 V
*addr = 0;
+ [ K6 l7 m) O5 T0 v4 Y4 A
; d9 j/ Z- j- R7 d' A6 N% v
sync ();
+ \) w9 z+ R+ K7 O# Z
if ((val = *addr) != 0) {
& p9 ?( ^ n9 P5 q) w. k, s
/* Restore the original data before leaving the function.
- I1 d7 n( A7 h& J
*/
/ `! s: d' f, ?' X7 \
sync ();
( A8 l9 W. u+ E' G' n E
*addr = save
;
2 H% o l7 M3 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) I9 y/ m# v1 o; p L P
addr = base + cnt;
# j) a6 ]8 W% u( K
sync ();
7 q) j) b7 r+ Y/ ?: f/ P
*addr = save[--i];
' z5 U$ n4 t9 B
}
5 L3 o+ [4 h8 S7 G r
return (0);
; j) }8 I. h2 g; z
}
2 U" D( i# u! K, v
5 p4 ?! y2 c/ i5 ^$ Y2 Q
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ L; A' U8 }) T; d( k, [1 V
addr = base + cnt; /* pointer arith! */
: V+ O) f! d% N% L' D3 S: n9 M
val = *addr;
+ b4 ~! I7 J- E5 F7 @. I
*addr = save[--i];
" ^1 d Y& V0 {+ N, [( ~3 I
if (val != ~cnt) {
+ q% f# \8 e/ w" k
size = cnt * sizeof (long);
% g, M/ {% T8 Y2 w; O' [
/* Restore the original data before leaving the function.
5 q7 P! @1 Z6 p9 ^
*/
* j' v, J5 h2 q+ q- o! |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- G3 J2 q! a! r E$ ~' d
addr = base + cnt;
* K, H/ i6 D# g& L0 W$ G% S
*addr = save[--i];
$ X0 G* z. ~' E# \! T1 }3 Y5 x6 B
}
, Z5 w0 b5 a% B4 f
return (size);
5 Y n$ M" N2 e$ i
}
5 N6 |- d! q" f6 q; k/ }+ r* T/ h
}
, _& v! X! a2 ^1 G7 X
) ]0 Y# |7 G1 _6 q" p) ?
return (maxsize);
4 |# T, W( S7 `( q
}
5 _8 G9 x9 p1 c! I% ]2 K/ E0 t
int dram_init(void)
w$ @1 k' P7 Y/ a* X' H
{
! j, u* B) R6 W' x
/* dram_init must store complete ramsize in gd->ram_size */
/ S' o5 M V& c9 \# u
gd->ram_size = get_ram_size(
" o3 K; }% z5 \+ _4 R; p
(void *)CONFIG_SYS_SDRAM_BASE,
" n4 ^9 B5 H/ N% ~9 M& S
CONFIG_MAX_RAM_BANK_SIZE);
* v. ?/ n @+ Z
return 0;
6 X! t w5 N, `) L) z: u* s
}
- r1 X! ]6 l1 [9 w
( S% |& }; c# ?2 _ [
/ x$ z" G0 `5 C; D+ x# [5 Z
. z8 m( V2 a1 Y( @4 P& d
# x3 t- y. X8 X& {+ E9 Z# J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
Q) q; i. D3 x
& X! v8 T! Z3 j4 d2 `0 J' q
. ^4 R4 U% |9 C+ K+ a4 g5 {; a. K
8 } o5 ]: j2 Y1 _% K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4