嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% ~8 F' D. v. M6 x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 z* o5 w$ ? J6 N" d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* }" t( R0 ?: z% A6 q: H
d" }8 N& Z. y+ x7 d# ~; _ O" p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; b$ j |2 K3 C, Q0 f
) F- x" q) Y- ~1 K" @; R6 f+ A% A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
z' f5 K9 O5 q( x
/*
7 m: ^) y( J1 x a( p
* Check memory range for valid RAM. A simple memory test determines
' w* I% X9 s6 C% K7 u
* the actually available RAM size between addresses `base' and
" F- R5 C6 ~; E, D( h
* `base + maxsize'.
5 \8 Y' G, P" P' n$ W* L5 q
*/
$ n8 }6 D3 J$ L! N; @( ?
long get_ram_size(long *base, long maxsize)
- F& J( J( H @; h7 L; ?. P! \
{
( _, `* e% u+ _$ F' y$ Z
volatile long *addr;
1 x. f. H& Z* N: \: R
long save[32];
. d* W# W3 ]: @5 N. Z- D
long cnt;
) h" M& h/ G5 u( u4 A
long val;
% W7 R3 I+ w! I, W' v/ g
long size;
8 t M4 X! K2 @+ X) _
int i = 0;
: U1 Y" o: T' g$ r" D
; C5 s/ x+ O: c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) M3 V; k7 Y, ?
addr = base + cnt; /* pointer arith! */
! r3 b& w7 I1 K' }0 g- @6 A6 A
sync ();
: n( A f+ j7 h1 {
save[i++] = *addr;
1 C9 b0 U- s; ]8 ^3 {& r
sync ();
1 \, b: R6 d+ [
*addr = ~cnt;
6 S- J1 ^5 s7 o* ?; B! l5 D
}
$ {# j0 r$ s M/ p, V
* h$ Q6 n' |$ ^. r2 ?5 i1 B
addr = base;
4 q: R3 T" B) k5 M. J
sync ();
) M' [% [% _$ u$ e7 m
save
= *addr;
4 K8 d+ w C8 {2 Z* I
sync ();
T+ f K, k0 n6 \% t
*addr = 0;
5 u, x6 A7 {2 _+ @
5 p, w# k4 c$ t8 l; }8 L% Y
sync ();
8 I; j9 ~+ u/ j3 a- D0 s
if ((val = *addr) != 0) {
" C9 s, c. T0 k+ X! m% e4 f- g) W4 ]
/* Restore the original data before leaving the function.
+ D' L4 [8 @5 y
*/
& k+ _( C' o( b% E! g$ g$ t
sync ();
+ g; F9 I. M: z9 d4 b4 [
*addr = save
;
# @# ] ^0 l4 R- G9 Y+ s; \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( H. m4 p# d* T
addr = base + cnt;
& }, l6 a* c5 g/ ^6 ~- \7 r2 P/ H
sync ();
! F& c0 C2 Y. r/ o
*addr = save[--i];
8 f H% h" P( \/ W3 _
}
3 H1 }: A2 ~ T g& ]* p
return (0);
- _9 Z/ y8 G& c, v% ?, e0 A
}
( W9 Z" m: J2 O* u
8 I% }) n) Y* n7 h& N! U# X. W1 T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) Y8 m, f3 I/ K3 U
addr = base + cnt; /* pointer arith! */
/ ?1 _' t9 r& L2 _3 d
val = *addr;
! x4 e4 b0 A, _* _0 h
*addr = save[--i];
3 q/ l2 S# Z8 v: Y
if (val != ~cnt) {
! [ G' M7 t5 b; z6 ~) k
size = cnt * sizeof (long);
/ z# e1 X: J- _) U5 y: W' e {
/* Restore the original data before leaving the function.
$ q6 I, b3 q9 N
*/
) z& M' P7 i& {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 }* Z" ]5 O1 ^5 u3 W0 S4 ]) M
addr = base + cnt;
, U$ c4 r2 H: }) v9 d, _0 H
*addr = save[--i];
, o8 P" @. q" ~+ Z
}
( i5 s; I6 R, n; F5 f6 C1 h& U
return (size);
" v5 n# u" G4 a' u1 I
}
1 z! V4 G- V, L9 ~4 S* Q, X
}
( }! G# r& K6 n2 u' l
% N6 {8 z4 O5 c4 q1 _& n
return (maxsize);
% x0 i e9 D' _* |+ `4 L
}
! Q. K! o: I* K( P4 c
int dram_init(void)
2 w- h2 l4 j4 Y
{
( ? c, a& N3 E7 ?7 G5 O" g
/* dram_init must store complete ramsize in gd->ram_size */
8 c# D8 y, B' P k
gd->ram_size = get_ram_size(
3 q8 h" Z5 y0 i0 ^" I
(void *)CONFIG_SYS_SDRAM_BASE,
# X5 a3 r+ u& [/ S+ w9 x
CONFIG_MAX_RAM_BANK_SIZE);
& Y, e0 ~8 A* H+ d- F- v
return 0;
. m" d, p, ^# f2 }+ v0 E; v
}
) a- k. T. d3 ^
2 c% E' {' O$ Q
, l9 P: H* y' V' q: O" v
/ D) A: [: }- F8 S+ B: S6 P
; f7 Q) ?4 h+ ]! I- s+ D- F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; S9 L3 v# ?: H7 {- Z' \
+ g- T, n0 _1 q& E7 B
u$ }4 ?# I1 c
* | T: }. P! D9 s+ f- S% ]; ~
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4