嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 G5 F; y8 N# T% c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, i! F. y( Q v4 J* h* A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 n3 b, k6 u6 @+ G
/ \2 I j) h0 d* D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" j3 h) P+ o5 ]1 H( a( \& O
' t1 D& G, {: Y2 v! P5 Q6 Z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ ^: U$ x: k& o( o3 K, J7 X+ }$ t8 a4 ]
/*
) E) r7 j B) x4 G; p+ E9 t
* Check memory range for valid RAM. A simple memory test determines
# V4 m8 G# E$ B5 ~
* the actually available RAM size between addresses `base' and
. q$ R2 E4 e* |9 j9 t- o8 [& x8 M
* `base + maxsize'.
9 F+ l/ W# L, N& V
*/
5 _* B# W8 j/ ~: j N2 G
long get_ram_size(long *base, long maxsize)
' Q* q8 K7 L) O/ x# W/ e/ C
{
7 j; z9 D W g* Z7 K* V
volatile long *addr;
, X# ~. A0 ^, z
long save[32];
l1 s) D' J: Q
long cnt;
, x7 @6 r/ V( n; X7 A8 r# V; L3 N9 s3 K
long val;
9 l/ X/ \5 ^5 n. l* f+ T* ^
long size;
* C* q" L' U7 |2 p6 O+ c
int i = 0;
! S3 g7 M" ~, Q% S
7 l8 @3 X+ h: X5 R6 a
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 b5 s Y* T% R# q9 b
addr = base + cnt; /* pointer arith! */
0 H' m6 } S8 u4 m
sync ();
' J2 @0 [/ n5 H6 Z [1 C
save[i++] = *addr;
1 a* v! c+ e) l( F: T5 _. n- I
sync ();
+ {( A8 M0 p! ~( B$ M: q3 A( g
*addr = ~cnt;
! Z0 F% W* ~" B: v- n+ c7 O
}
/ J0 k) T# I8 R* h7 P( R$ E
" Y+ E8 h* n" O5 ~/ K5 @+ ?$ P
addr = base;
* {) K# q8 {3 F6 t5 V7 N
sync ();
: F5 O3 Q& t e; Y6 v5 k) T5 q( }
save
= *addr;
0 s S4 ?( G* O. F4 \
sync ();
- K( C; c" ?/ C3 Y) P# U2 Q) f
*addr = 0;
- M! p2 X1 n, m+ o: d
9 K& V, P( S+ D
sync ();
8 G3 C( N9 `1 p9 u+ T, n
if ((val = *addr) != 0) {
" Q1 _+ K1 `; J2 k D
/* Restore the original data before leaving the function.
# O. { }- W( g5 q" F1 k3 z, L
*/
i8 N. Z( }: L& m* B, \
sync ();
" p% P# e' y0 y/ W/ O" r& j
*addr = save
;
! s1 h) Z% a* l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& l+ a; f+ v9 f8 H2 |
addr = base + cnt;
4 g8 W7 ~+ G. t
sync ();
+ y8 p2 W1 t% H) k1 z- `& _) x
*addr = save[--i];
7 k: A0 Y" q7 f2 ]" `: M
}
3 @3 C7 c; ?! g$ d+ N* \- s- a
return (0);
1 p% r: C( r" P
}
3 c3 Y' n$ Y* f0 ^
4 n; s# W1 Y+ A) \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' J/ R0 x3 I3 C
addr = base + cnt; /* pointer arith! */
' r+ c c1 R9 i1 F% a
val = *addr;
1 G5 P% V! v& g0 l: Q
*addr = save[--i];
, r, ^ R: U; M3 x8 Y
if (val != ~cnt) {
% W2 } z; F% k' w v
size = cnt * sizeof (long);
- ^1 ]4 C1 V4 Y2 d; H) H; f" ?
/* Restore the original data before leaving the function.
$ {* I) Q) c$ @ d2 e
*/
" C$ Q6 d) P/ e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% x8 E4 [9 p; t% z& } }/ x
addr = base + cnt;
2 X# B N/ Z1 J) y
*addr = save[--i];
( x# x* |0 c4 Y1 p0 \# I
}
; B0 z/ } F& U7 G7 \+ m m0 h
return (size);
* j( A/ a1 R- Q& A: I
}
! s4 I) W B, V1 ?6 x- N: f
}
# u9 f1 |6 s# l4 C
& v& ]: z: a, n. a
return (maxsize);
7 l; t \0 k. G0 f/ l1 b
}
4 z2 p- ~& c6 O
int dram_init(void)
! Z0 n* L- z2 }, i
{
7 |( q! S0 y' g5 V7 j
/* dram_init must store complete ramsize in gd->ram_size */
9 a5 H* j) J# z) n0 m
gd->ram_size = get_ram_size(
3 U, ]" I' [2 g
(void *)CONFIG_SYS_SDRAM_BASE,
& [+ v1 K2 O) _( D9 V
CONFIG_MAX_RAM_BANK_SIZE);
& {# {9 e$ z% o8 |" U
return 0;
. m" J! y% `1 ~! K7 e
}
* E" M, {) J7 |/ w3 l4 E$ }
6 i6 c, Q. I* \
) ~4 C' r$ n1 ]
) I6 O$ R; u1 \7 l3 x# H4 e
! X5 I7 I9 }0 G) H, T! d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 \0 p' m2 j* i4 Y$ R y
+ x! P& B! |* V9 y% F! _
& W& u7 q' S1 L" G" Q! d
' |. s! n- Q6 H4 L- G7 t+ J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4