嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 W7 V. M2 B9 g. v% Z, s
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' H0 i: v& m* T. w6 k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ d- O" w# d1 i1 _0 u
3 d- J, E9 \' J4 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 B$ X/ E' g4 j
- l) l2 ]9 G! n$ a* r( u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ g% X! R( b; }) o+ M: N) B+ f
/*
/ R2 w' ?4 o/ W" t# v t" p
* Check memory range for valid RAM. A simple memory test determines
, ~ }- ?4 q4 ~$ F+ D
* the actually available RAM size between addresses `base' and
( Q$ C4 D* H& c2 h5 k
* `base + maxsize'.
: ]( S$ k/ @9 R7 K6 G3 `) P3 J
*/
4 a) S4 m; v; M; a) y
long get_ram_size(long *base, long maxsize)
8 }. w9 G# V9 m" w% b! _
{
; V! x% r( s. M, j
volatile long *addr;
: S7 h/ f9 d6 O; i# I
long save[32];
6 ?' X9 |7 [: y& W8 f
long cnt;
( V6 l9 ?& o8 i5 y v. Y
long val;
. |) g5 `: t/ Y$ d& X
long size;
' m5 K+ E$ O8 D. i+ l7 a/ a
int i = 0;
- u; {7 B) Y# E- X6 E+ Z9 B
" T# O. N+ x- ^0 q& L0 g" ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& z8 E' w( q6 W) {' q. f+ W
addr = base + cnt; /* pointer arith! */
: v5 j% w( F/ m, F
sync ();
2 Y" W8 @. g1 R- c O" S
save[i++] = *addr;
4 j }; j7 M, I8 P) L
sync ();
: h5 D# E- Q2 Y# m% `9 H
*addr = ~cnt;
) S# s% M* r# q+ G$ y+ ?
}
4 ]# v( {' S6 |
. k! a; T/ p$ e2 a) C
addr = base;
) H& A3 {$ [$ @1 ?) }
sync ();
5 S; g4 o: K( ]0 d% @, h
save
= *addr;
- }- f- U0 m7 w, t. Q0 w' W
sync ();
" |$ x' Q' g0 S% u( t3 \6 A
*addr = 0;
* D& P; U( \& h
/ c: W8 }) O2 S# X; l
sync ();
9 T9 i2 M: t: v) G
if ((val = *addr) != 0) {
6 _6 ]' `* A1 H, B1 Y) c% ]$ X$ o$ @0 h
/* Restore the original data before leaving the function.
6 m1 `2 |' S s2 ?8 W, ]
*/
3 M! p0 ]+ W6 l' g
sync ();
( W7 Q; L) _7 Q% Y3 R& G
*addr = save
;
' J; m* v+ O- P# I: D* z( l" I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 O9 Y) E) c* U) ~1 p/ O& P
addr = base + cnt;
5 ?& F6 l) _" ^! L+ w2 l% z1 O$ M* B$ l
sync ();
& S! \9 c0 m& M6 O
*addr = save[--i];
- ]8 r3 l5 B, `% p/ i% L5 j( s
}
! G! C2 C. ]0 J( K7 A3 \, \( T
return (0);
5 S! i& g* d" K
}
- f6 g9 G8 X( `+ w# f+ r7 H
+ h9 |- Q$ W! |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; v- ? A0 W* z9 p7 i2 C
addr = base + cnt; /* pointer arith! */
* y' b, x5 l4 }
val = *addr;
9 _# w! \3 |$ H1 w0 C2 Q q9 O# o! {
*addr = save[--i];
% \1 B, O. W- O$ }( ?
if (val != ~cnt) {
" n4 [6 D- i5 ?; u
size = cnt * sizeof (long);
& Q4 j* G5 u$ Y6 Y+ [
/* Restore the original data before leaving the function.
m) k+ `+ J- _
*/
- B. L @+ J, n- r% E! j
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 t/ A( Y# E ?% y9 K, I. _& R
addr = base + cnt;
- N4 V# L: A3 Q) g$ [
*addr = save[--i];
- h+ p( r# ~; r7 v
}
1 W6 Q+ q3 F x8 ?9 _
return (size);
/ J: C; G5 M( B8 Z# P* @/ ^
}
) s+ V7 H. Q: S w& _. p9 R
}
; w2 z( n; b* n# U, e) V# I
$ E: ^5 e- j8 y c6 y5 R
return (maxsize);
/ _+ S+ G! q9 n& Y
}
$ \3 R; @: a- ?3 E/ ]3 Q, H& [
int dram_init(void)
+ J3 R! @4 E! t% A" S
{
( W; A, B) M7 v! A
/* dram_init must store complete ramsize in gd->ram_size */
/ ^: s% M$ w7 y% ?1 x
gd->ram_size = get_ram_size(
y/ V( d; p: A7 D, ^' o
(void *)CONFIG_SYS_SDRAM_BASE,
' R t$ e# y" ~3 t. `
CONFIG_MAX_RAM_BANK_SIZE);
% x" q8 Y; m8 x, F1 C: |6 o6 g
return 0;
' s0 h# F( C' n( J1 D$ Y
}
/ i h. Q6 P4 A" l5 o4 }7 Z# G4 q
- ]0 B# k; o: o4 d) b
* C1 u) A7 J) H1 J
, W5 J* t) J/ ~
8 j5 d Q. B; r3 r* J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ k6 x, z7 i- L: b9 J, ^ V. v1 Y
0 U$ c* `+ D8 ^1 g
; ~* t; o! i8 L; n! a9 O& \" g
2 k p9 u) m5 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4