嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 c7 d3 n0 X7 g& q L5 ?+ V1 l' ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- m% d% R- {2 m+ S1 \# g7 F C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( x, d* s. u0 u) ?; p
! i3 }5 ~. o4 f6 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. s0 c( n& h8 w" r; K; S
% ^, \% A4 n k. \7 _2 O9 b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 v4 S, {2 v" C+ u) D
/*
& c& M$ Z) Q. V! x0 X3 |
* Check memory range for valid RAM. A simple memory test determines
) E% M6 J. }% E* j. `
* the actually available RAM size between addresses `base' and
( D, j$ J1 Z1 |& `! ]3 x
* `base + maxsize'.
4 z P, M) a, K. P
*/
; _1 o0 o2 |4 b) N/ D, x
long get_ram_size(long *base, long maxsize)
8 ~6 w" d1 z( N; }
{
+ d E# n6 e/ D7 @4 L
volatile long *addr;
& w6 d- t, T0 q5 C
long save[32];
( e- Y# I" ^. p& e
long cnt;
7 S- D! a1 i4 U4 |$ M" F: Q. H
long val;
. h5 ^/ \8 S P2 M/ ~& w% G5 \
long size;
3 B4 [8 W* R) e, U8 C* ?. v
int i = 0;
; ^* O, B' u1 K1 R
3 M& D( y2 f: C! k; `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
N2 ]. V' a' U0 y' x$ t; J
addr = base + cnt; /* pointer arith! */
. p U( \# s1 T4 S) |$ x# y, F( a
sync ();
# [2 G, a6 O# o6 k5 E- T" {$ W
save[i++] = *addr;
# r" i1 v0 U3 E, X( \
sync ();
" W3 Q$ C2 _5 [, B; f3 {
*addr = ~cnt;
" m! T( t2 W* s4 J$ R( f" u$ y, b
}
1 P# r: V- H, k0 Z. }
0 W2 _7 y' z+ S' K: c
addr = base;
% u0 r! J: f3 U! ?. O, R
sync ();
# ]1 _! H i( ]) }/ j
save
= *addr;
% s; I/ Q& Y4 f y& X) V
sync ();
4 ^8 r! D4 o) y5 B
*addr = 0;
, } R2 K5 s$ T8 [3 h' ]! a
: s* i$ E! K* H, W) u" H7 u% W8 Y1 `
sync ();
( M; d; H& k# k
if ((val = *addr) != 0) {
, U" Z# @7 m5 I) J: n
/* Restore the original data before leaving the function.
2 J1 Z- i2 [4 |! i' N2 ^
*/
, W' M u3 t) v% u6 r* L
sync ();
% i+ a" \9 w" o% d6 i
*addr = save
;
2 c/ }" \' X% E% O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- X) y$ {4 C3 W- x S
addr = base + cnt;
, H$ x4 l. J: r1 a9 N
sync ();
! G p* T0 l5 R; P, U2 M" z& A
*addr = save[--i];
6 W! _5 Z6 a; r t: n; L; ]% L& g% A
}
2 P! C4 Q& X* s3 D/ G
return (0);
, h* K8 r6 e2 H1 y
}
6 {! w+ c. Z- t7 x8 K. z
& O3 }9 }3 @. _+ `7 m q: N
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 B. ?8 d& }) L+ Z( ?9 S: w
addr = base + cnt; /* pointer arith! */
8 P$ E* r# N3 ?; e" e+ ^
val = *addr;
% ]: d, i) e1 V, Y/ n. w$ X7 B5 w
*addr = save[--i];
! l1 N8 |/ |( u2 i7 N' c* J# \) @
if (val != ~cnt) {
4 {! q# R" g8 S3 V: M& q
size = cnt * sizeof (long);
) o' w( B: o! i6 U4 j& {
/* Restore the original data before leaving the function.
5 S: q; [& R& J3 [1 M* e
*/
' B: [' ?# s1 X; k, E9 P: N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( G9 ?3 ]* H) s; u( [
addr = base + cnt;
. ~- k+ X) V e8 `8 `
*addr = save[--i];
' G9 n; M+ r N- ^. n4 Y& B
}
+ a! x" `9 Q1 x* D7 n. c# x
return (size);
' x# g$ r/ a* b$ n4 E$ y0 `& N1 j
}
/ F- R1 ~1 s: ~5 P/ u
}
6 R% e* E( `" t: c% {" [, B, ~
4 z, N. q. }/ f0 X( l. u
return (maxsize);
: e# O! t( U- N O( P( W( S
}
. U5 N$ O/ T+ R
int dram_init(void)
- i$ w! v4 N7 F% R. F
{
/ k. c& }' X4 ]! |' b) u* R; k
/* dram_init must store complete ramsize in gd->ram_size */
' t$ m. p, x- ~0 W
gd->ram_size = get_ram_size(
: d2 h* U1 l7 q+ T
(void *)CONFIG_SYS_SDRAM_BASE,
2 T. P! u5 B$ @% B2 H8 l2 ~( d* Q
CONFIG_MAX_RAM_BANK_SIZE);
+ q; n: ~2 i0 i, t* G) B' O
return 0;
8 @* W2 q2 B! B& ]
}
, X7 o" S5 c5 |' ?) X
8 \& ]& |' \6 {, q: B! f4 \
, f8 _2 H, P% K' `8 e
# h0 V/ ~/ ^3 ?* V- |9 ]
. J# w3 q j& S) r
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) `5 g3 e" s- q4 |# n2 ~, a
$ X) q: m0 `( t% _
, I/ B) Q' ]4 f' ~
g% a/ |2 O2 I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4