嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ Q, n) @: g- w# c0 j2 Y* |7 ?. V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 f! N7 `: R0 J9 D- ~& L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 O7 }6 ^! ^3 A5 |; c
' L# O0 m2 G$ |2 | J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 x3 z, N# w5 E f2 O: u# z
~8 L' j; \2 T( I
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 |( {/ S, f0 I7 ]
/*
# ?/ d; L6 @5 v. N/ k; ^
* Check memory range for valid RAM. A simple memory test determines
5 X2 y- y" e: c0 e* E# t
* the actually available RAM size between addresses `base' and
. ]# U; O0 v* A+ o% m5 c
* `base + maxsize'.
! I$ y6 m3 ^/ O: ] } ?$ L& x
*/
) k1 J( \" ]) Q. ]) @/ P
long get_ram_size(long *base, long maxsize)
9 Y' T! C2 M1 W) B! h, U- S
{
: Y. [+ N3 q; v: k
volatile long *addr;
' f- L5 g9 ]. A- X2 s1 B) O9 g
long save[32];
- }% z( S& o! m
long cnt;
$ b7 c% X* k4 s, j; L& a0 k
long val;
! u. r6 U9 ]3 k* ?
long size;
8 y$ w; B$ Y5 L4 a
int i = 0;
) T( y1 J0 `# B$ V5 W9 w& @# r0 H6 d
( w) _( V9 v0 M+ V0 z) J( ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 l% W0 Q" I9 Z9 {4 K
addr = base + cnt; /* pointer arith! */
# O! D7 S% r, f, r# L
sync ();
7 A- P `2 V. G1 |" d8 L E
save[i++] = *addr;
; `) e9 N. q/ e6 ]4 k
sync ();
9 j6 H7 F, S- ]3 D
*addr = ~cnt;
z9 S7 z4 Q$ u% C' r
}
% Q. w: v+ S% q" K4 }* n* P$ J
" D% |3 g1 B8 e/ Q( V! I; p$ U
addr = base;
5 h/ o2 |9 e. X
sync ();
3 z3 W. o! s2 @- s& u8 c" }
save
= *addr;
/ U# X+ e# Y8 G8 _5 `6 y
sync ();
$ N8 W6 p% u3 Q2 K6 t- n
*addr = 0;
; v* h" q# D2 @% G9 T- T/ e
) O8 l h% n \7 Q) w, W
sync ();
1 }$ P9 Q+ b9 Q6 }- t" s
if ((val = *addr) != 0) {
- X) _$ I& s& H1 ^/ O) u- U
/* Restore the original data before leaving the function.
8 ]1 W+ Y# r$ A! B
*/
5 {# q2 [% M0 B) V
sync ();
9 a6 J6 _' V3 o% t Q% V+ G
*addr = save
;
3 N1 t, q) B' T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* A0 u) u& m6 Z% G! ^
addr = base + cnt;
; }8 s4 J1 q7 s2 T9 J
sync ();
( q1 ?- Q+ S% _# ]% U0 v2 {
*addr = save[--i];
4 o3 g# ]7 W+ _8 K5 J! U4 b
}
& o1 p: R, E+ T8 |
return (0);
5 W+ g. @4 i: {6 c
}
, s3 [# C) X& j K6 E
* w9 g' \) y; t; m6 r, \8 l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- q! L. F1 g0 V
addr = base + cnt; /* pointer arith! */
& G' q* k& s6 z9 P0 I
val = *addr;
1 z4 E, g- g/ L7 j6 _% q t/ A# N3 ?! [
*addr = save[--i];
! N) Z0 _+ e, @7 d# Q! S
if (val != ~cnt) {
% M4 E6 n) X* x, S3 r) [
size = cnt * sizeof (long);
: H3 b* e) t+ Q
/* Restore the original data before leaving the function.
^+ Y+ r# M& B8 N" k3 K2 _
*/
! J0 r8 |- h: x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ B& e* R7 F/ m4 h
addr = base + cnt;
$ S8 v% D- o! m/ N3 i$ C
*addr = save[--i];
5 M4 M+ s, _( Q& W
}
/ ~& k. X" K: p2 I5 f
return (size);
% ]1 i: `2 s, [; X: P0 p. H
}
, H7 Q5 ?/ h1 r% O; \
}
+ W2 \' y1 I8 a
) a" ^; ]8 Z' P' i; P6 |7 h8 d
return (maxsize);
4 E/ o6 G g$ T" Y6 Z6 R
}
7 }& @3 ?9 ^3 ?$ e- ^
int dram_init(void)
% N% p" {$ q4 d: t( Y; D
{
& z% I9 f: d1 [6 I0 b, ?5 }+ K. B
/* dram_init must store complete ramsize in gd->ram_size */
" A5 i( _% N @5 D! C z. h
gd->ram_size = get_ram_size(
, K, J9 ]9 D9 @+ d4 y% A
(void *)CONFIG_SYS_SDRAM_BASE,
' L" u& { g2 g% F1 Q) }# n! {
CONFIG_MAX_RAM_BANK_SIZE);
) G3 T7 r$ p- W( J1 q$ ]2 m N2 \# h
return 0;
5 v" _" H/ F7 T
}
# U+ r, _, L" T+ C, D7 e
E& H' I; m. y% g
6 H) e* J& W2 N
4 V& Q& h9 m! i" \' _
/ A f1 p* V! F: T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 B, c6 C/ \) K% L( V8 p
u7 Z+ Z: H' C, H$ d1 C; ]: F
4 Q9 e6 P/ ]7 U" s9 {9 K# ~5 r
/ u" D& Q! i: s) O4 v; _- m, @* Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4