嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ ?0 v3 @/ z E; c& z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 C: @: s" _! q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 b% B7 N/ l" t" o7 J" w
5 k' j% G2 ?$ t% t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, _9 ?* W# _& z4 t% e
" g* g: Q) l& r, ?7 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 L7 R0 o; i% U( h
/*
* v# i5 `; q( J
* Check memory range for valid RAM. A simple memory test determines
" E: ~, D! d/ T/ p, y8 n
* the actually available RAM size between addresses `base' and
9 l5 |4 d# w, I: f, D' l
* `base + maxsize'.
% f4 r9 q7 {8 w" b2 m' E7 ~1 O
*/
" |- a j. O o% d0 q3 |
long get_ram_size(long *base, long maxsize)
/ Z6 e. @2 [! ?% x% L$ S
{
/ Z. Z, _" c7 Y$ ?5 n Z. _6 F$ H
volatile long *addr;
# m7 \+ \4 l2 C2 Y
long save[32];
4 }3 z; X; H- ]
long cnt;
4 S( F, x6 C& f& I8 [" n
long val;
3 S+ | h- d( x. q i3 u
long size;
7 d4 J9 `; M; ~; v5 _' w
int i = 0;
# @1 s) R, B+ j
2 u1 b, Z# H# W' t7 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; Z1 K4 X- f) U
addr = base + cnt; /* pointer arith! */
6 \! ~# l" r, l. \
sync ();
6 {0 G4 t) f) M6 _: k/ |, j
save[i++] = *addr;
2 K g4 O8 J1 f
sync ();
5 o3 v7 z9 W& z, B6 G$ S. S* Y7 s
*addr = ~cnt;
7 N+ M' ?6 h- |: B
}
; ~0 r) U1 p0 ~5 K$ o4 E0 } l
+ f9 ~" Q l' X+ `* c- p3 i" j
addr = base;
& U# g9 d4 Q+ B8 E
sync ();
; \1 H4 f8 K3 w
save
= *addr;
6 |/ b1 K2 v* _3 _+ ~/ a( ]
sync ();
. x# N$ b- s5 M$ ~* V
*addr = 0;
, C$ y% o- J- v/ z( A w$ N' C
5 u+ M( | B* C8 M
sync ();
8 R# Z8 p& B+ h! q
if ((val = *addr) != 0) {
O% Z, E e' ~4 ~; ^
/* Restore the original data before leaving the function.
8 T' y9 ?8 @" c4 y+ m* x+ [
*/
, c) ^! ?6 r) d6 s+ ^9 k
sync ();
u+ J9 i0 V# {
*addr = save
;
0 N. }" N" D+ H& f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* R+ r, _8 Q9 U. M* V) p1 u
addr = base + cnt;
( D0 J( `& V! s) E& h
sync ();
/ ^8 l6 K( H1 o, o
*addr = save[--i];
: C# ^! X* ]0 l7 N, g# \
}
6 i4 X- [. O$ n/ F
return (0);
8 Y5 w" i1 g5 N
}
# W; t3 x* b; N. @1 B' K
2 C" D' e& Y! |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 K3 K5 J% u7 X6 Q2 Y+ R
addr = base + cnt; /* pointer arith! */
2 V* x! B2 [! \+ D
val = *addr;
4 U% I, V# J8 e8 n, R) |
*addr = save[--i];
h( t) q, l8 D6 \5 W& [/ ?2 w4 n
if (val != ~cnt) {
2 b# `2 i$ |$ {) }2 a/ @ E
size = cnt * sizeof (long);
7 m, x0 i# w; j* Q) F' m8 e) ]
/* Restore the original data before leaving the function.
. ?! E* W+ o4 y& I3 N' k
*/
% a) m7 X( g% ?! \0 j; F7 w; J% ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
R; }; |) I5 w/ I i$ w9 D$ U* @1 I
addr = base + cnt;
6 F+ F9 _( D, E0 E, j z. ]" x& e
*addr = save[--i];
/ ~. @4 E% D) [
}
6 J9 x/ x$ Q* X; r+ Z1 c2 m' X. L
return (size);
6 E( Q, |9 M9 j6 w
}
% e! E5 S3 [+ ]. x
}
& \4 O8 R/ l( r
& z9 P; W$ O9 X3 |" J
return (maxsize);
% t, W/ R Z+ @6 n2 g0 K. }
}
% i3 L. |# `! X e
int dram_init(void)
" C+ C% U' l8 B2 u9 g
{
# w- J% I& W c, ~1 ?
/* dram_init must store complete ramsize in gd->ram_size */
" O5 x4 \' q6 \2 y8 I3 q ?
gd->ram_size = get_ram_size(
7 |8 j! ] _2 r1 {9 [( ?8 Q
(void *)CONFIG_SYS_SDRAM_BASE,
& H! }# A4 T* t* ~/ Y1 M- h* N4 \
CONFIG_MAX_RAM_BANK_SIZE);
: {5 f7 @( l" o1 f( }
return 0;
* T! [. N# J/ ~, u* F, k9 N- S s
}
1 h: e7 [7 P ^. `$ z* D
* N( ~2 C1 [# a8 n1 Z8 ?
& p* i9 j) i9 ]- X
7 r# z, o: Y/ Z! h/ N4 T- e
3 Y$ h6 X& L) O2 m, H2 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 r" y; W! v! N
$ B. A0 E" B: T! }! L
) {+ Q' x9 u6 b6 l+ H
$ q4 ?) a+ Z$ m m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4