嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 U% ? L: w9 D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 A1 s2 \- A# ~( C. P1 I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 N+ L4 a" f2 C6 w& P7 y' y
2 F' X# q* f' \/ }1 m, |- u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; y }! p1 t" ?" n; l$ s
o+ E' l4 t& ]% N+ O$ ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% ^: N( j/ }6 l X6 A; n
/*
6 Y8 W+ _0 i" E) \' \7 I% \
* Check memory range for valid RAM. A simple memory test determines
- @1 ^6 l' }; F6 B; M
* the actually available RAM size between addresses `base' and
# _; B1 d& j8 M0 ^ C" h/ N
* `base + maxsize'.
# Y% B; r! X" W! c) z
*/
- D0 ~( L* \& |) e d4 y( q
long get_ram_size(long *base, long maxsize)
; ~8 t( Q9 R5 R2 [% @& z5 o7 {
{
( ~) R9 w8 C5 P6 M4 U( h
volatile long *addr;
: `9 u5 u1 n* b1 a- l) D
long save[32];
4 D* r2 ~$ X$ J
long cnt;
3 e! L4 _0 h5 P. e
long val;
5 |! R% x+ B: ]1 n% r0 _
long size;
, D# A8 F3 m# ?* D6 ]! s% k
int i = 0;
' H6 I4 ^+ J" z7 \
/ ?# j, I4 S! c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ [! r0 ?- ~1 A+ Z/ E9 h, u
addr = base + cnt; /* pointer arith! */
! Z# q; I" h& v! o2 a- U! n( z2 L
sync ();
6 Y+ T8 W, T( ^7 p5 e
save[i++] = *addr;
! n' c! Z2 ~1 q1 Y
sync ();
' I3 x( O$ n+ N% b
*addr = ~cnt;
4 H6 q" V+ Z5 @% J2 c+ t
}
+ i6 L- v' R9 a! a C
6 E! {# a5 n* o
addr = base;
- p- t, |% `0 ]& W M
sync ();
$ L/ i) k! x* c% }0 m; y
save
= *addr;
7 C% i0 n1 l3 G- M
sync ();
+ J k8 ^) r) X. U# r6 w5 |/ o }
*addr = 0;
$ ^1 K3 `! ~8 K: C0 L: a
' O8 K9 R9 { S
sync ();
: K7 W- H+ H8 I) D$ I; E1 v }8 \
if ((val = *addr) != 0) {
" o$ l: h) m0 f
/* Restore the original data before leaving the function.
! L) `8 }4 O$ v2 C0 j# k
*/
) x# i) A, m! t" C8 [8 I6 \- U$ Q
sync ();
$ b- X0 y2 I$ M6 T) X
*addr = save
;
# m, V- B& R# _6 A6 j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 w( R+ q. S5 F$ k3 `8 l
addr = base + cnt;
# w, h* O% O% s; N0 U1 |
sync ();
' a# C7 Y! P. C/ u1 h; b8 S% U
*addr = save[--i];
: q* H1 K* P( S% z6 b) \; c
}
/ b* q5 Z' t3 s* v' U4 p- d! G
return (0);
8 j. h: e5 F& i7 m4 y0 Y' [7 {
}
: X O+ X5 r. u
: ~/ v8 o1 j+ J# S5 t$ k7 g- D/ D3 }, i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( s9 ]! X3 Z% Y1 g/ p7 r
addr = base + cnt; /* pointer arith! */
3 D: `( T$ ?. p0 b1 x4 L C
val = *addr;
% K3 z3 t. S9 ^4 M+ M) u' m
*addr = save[--i];
: k9 H! N9 q [' D; _
if (val != ~cnt) {
# o, ]8 [( \# S: k+ t6 V3 Q
size = cnt * sizeof (long);
% P; I, r" g; z% z" s
/* Restore the original data before leaving the function.
$ M7 B/ E. t* D5 Z
*/
# d4 R5 l7 P4 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! i0 S, x4 x5 V& d, {5 N
addr = base + cnt;
& S- H# `' A8 F0 e" O: C' T
*addr = save[--i];
6 s% e! n, Q# H" q; C: E* L
}
Q1 R8 h* i- L6 g$ j# k
return (size);
" d* K/ }2 ?4 c& S( Y/ k2 M5 X, l; N
}
" \5 M; h0 l4 P0 F& T7 ?
}
- ?/ A6 f0 d/ K0 \7 ?2 g! A
4 y" S( _& j1 I) y% ]* V4 o3 j
return (maxsize);
& _0 G0 d' I9 V z6 k
}
$ i% G" i* e1 C; {6 J' Q
int dram_init(void)
Z M9 e; Y+ R: t4 E
{
2 J& w# b, s8 b. O, e% p
/* dram_init must store complete ramsize in gd->ram_size */
5 y2 C& ^" L) N/ f" _
gd->ram_size = get_ram_size(
& p5 C4 e- K$ y+ Y- S! J3 s/ Y
(void *)CONFIG_SYS_SDRAM_BASE,
1 S# L4 q( N( m0 Z
CONFIG_MAX_RAM_BANK_SIZE);
2 G+ m6 d! ~ t& f
return 0;
d* ?; n4 H! K! r
}
0 B* k. v, o3 v4 o# |/ d2 l
/ z7 }4 K( K/ c: s; _8 T, n, X' s* {
; A$ S/ R1 U# M r+ R6 N
9 g* O3 A3 ^0 ?' ?! ]- F
H% n$ h& p. b' M+ {) ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 b# ^! @" c, E0 y
. _% A5 D( U* K5 b) m2 R v
& H2 C( k8 f2 n& Y; A2 [
+ U/ |( K0 F2 B3 N: G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4