嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 Q- z) Y0 ]% w. i& O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 N1 m. j6 O4 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- X2 i3 x- D6 m' d# s8 `
5 e b1 g1 O* g# s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 W4 U3 `- r1 Y# z
8 N) m% \; d1 P( Q1 H8 V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
x5 Z/ Q) o9 ~" ~$ \
/*
1 H8 R$ V5 K% J+ e) h% i
* Check memory range for valid RAM. A simple memory test determines
: s6 k. J- Z$ g- B% g3 T" }; x
* the actually available RAM size between addresses `base' and
% D2 ^7 H# b3 G& G9 B0 A$ r6 H
* `base + maxsize'.
, M) a% D3 y4 G/ U1 a
*/
" O+ \6 h/ t0 h
long get_ram_size(long *base, long maxsize)
- X {" R1 Q; O2 j
{
& ?4 m8 t! p. I, J+ A! q7 ], e
volatile long *addr;
! t# u* O; l2 o* E- |/ ]8 K
long save[32];
2 O. u6 V6 Q- w4 [( b
long cnt;
# Q! p7 F% @- p; ?- w
long val;
0 m2 `8 x5 m; O4 c% M% Q! r
long size;
. v0 S; N" T [# W
int i = 0;
: e% g9 J8 X1 V5 S
" B' C- G9 k+ X* Y+ s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! H& f4 s% E! s. n$ R5 q: m7 R# E
addr = base + cnt; /* pointer arith! */
$ Q0 D: _. p J# E' {/ F
sync ();
9 K; }: W4 K. }4 }
save[i++] = *addr;
) P1 X6 k9 w) j" c/ B) _2 R6 ^2 ^7 i
sync ();
$ k7 ?# B$ O( S6 o# ?7 [+ o5 |
*addr = ~cnt;
% x9 N! Y! W4 m/ ~$ q! {% d
}
% r( J, [" R- [5 a) o6 _
& L, @+ d' X* ~- U& @# {
addr = base;
W$ e$ ~) ^1 d" a- D4 m
sync ();
5 Z( j4 z2 Q* N4 U( P+ i! ]4 n' A
save
= *addr;
3 F5 t% S. s. N' o* B5 n: ^
sync ();
- n- j* e6 ]" j# s* v/ c/ @
*addr = 0;
8 Q7 M7 T F- ~% D2 Y
: `7 g- w; Y+ _2 q* W
sync ();
/ T: \4 d( I, A
if ((val = *addr) != 0) {
W5 w* Y2 T' Q
/* Restore the original data before leaving the function.
! b) @: m. J) d6 V( I
*/
' S: ^+ P2 ?7 G X9 O+ Q
sync ();
% E! _7 N# X1 H, b" R- k
*addr = save
;
& u. H: _4 P+ K2 c2 ]" q; i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ j5 W6 ?# M0 c
addr = base + cnt;
4 `, o; {" C: E: R* E) H0 g
sync ();
/ ^( q3 p E4 |
*addr = save[--i];
- g8 h1 a. R: u' r
}
2 @+ h& H& R) U- f0 N0 w5 y4 G
return (0);
$ {1 |: ^" v: L
}
7 s9 \2 b. G/ F) t! J2 }
; ~0 d' \9 {7 k) ^0 Q; F& N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! T0 x0 n8 W6 b4 y% J, _2 Q
addr = base + cnt; /* pointer arith! */
5 ]* N' X# z2 L1 K9 V8 r
val = *addr;
6 T/ [# W$ N, z- m! A# ~
*addr = save[--i];
# u( Y! Z/ }' I" o( \
if (val != ~cnt) {
* E1 f# ^( o( k4 b) v" C
size = cnt * sizeof (long);
( j1 p9 V3 G$ W$ W# K2 p
/* Restore the original data before leaving the function.
5 {" T2 h5 D# }
*/
6 y+ B/ v- J! i* D) W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 K, B4 @% q" V& F m, @0 I/ C
addr = base + cnt;
; h o' Y, M; z/ W5 Z( a( s. n/ Q
*addr = save[--i];
. N0 l+ Q/ m Z' ~$ O2 P
}
# g- k# U6 b7 f8 c2 d
return (size);
) {5 C8 [& A' {1 z7 F1 L
}
7 E4 ]% m/ a6 Z5 I; P
}
! U8 \- u, e2 R
# s4 u/ ~( o9 t
return (maxsize);
4 c) N/ L1 I, f! L
}
~; `/ P& ?9 X+ y; S' B8 |- Y
int dram_init(void)
4 ]3 K9 ^/ L N, h3 U
{
/ O! V# c. ^7 _1 T) c9 x/ ]
/* dram_init must store complete ramsize in gd->ram_size */
, z9 Z `) S# p, u# l
gd->ram_size = get_ram_size(
. R4 _+ o: A3 G7 ~% ^ x$ {! \
(void *)CONFIG_SYS_SDRAM_BASE,
S0 p+ S* k& i+ A5 Q
CONFIG_MAX_RAM_BANK_SIZE);
/ E+ s0 U) h8 X7 R2 W5 i" }. R
return 0;
6 O9 P. U3 j6 d5 t: A6 |+ `
}
1 u; }+ h; H# v3 Z
/ F D3 I) [/ E. R& c. W
8 J3 ^8 V; {3 s7 V
4 g0 u) j4 {, a0 J4 u$ j' V; i
( Y& H& i3 J$ ~4 |5 `' ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- {: w! i. R8 B9 @8 T
5 ~& S& ~9 W$ a( B% h5 v% I
% j. O' g$ e! N% o2 y
; X) }6 w. A$ @% a% k' R" y! j1 }! t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4