嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- M- E6 ? a% ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ r, B; i" V$ }: W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 S" G2 \/ n! I) K1 C
5 p5 f4 ]8 @% y0 I) P% n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& q0 s8 ~, v# E8 n0 p, G
- u# @) J: |9 Z1 `- Y9 G3 h3 k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) y4 }% Q3 e! B% ^. i
/*
, I6 f. Z5 o+ ^- G7 |- x4 V
* Check memory range for valid RAM. A simple memory test determines
3 Z( x* _* R7 J5 g1 w
* the actually available RAM size between addresses `base' and
! s4 L' W; G4 A% f2 b; R' C# o
* `base + maxsize'.
) U V7 J$ N, t7 V' Q& Q2 l( W' `
*/
$ M2 ]$ Q; @/ P5 r2 n
long get_ram_size(long *base, long maxsize)
& x @2 A4 n1 B! j
{
) M* C/ @' |' }# w! c) L
volatile long *addr;
2 D' \6 } B: _+ h4 h9 x0 e X
long save[32];
' L! r) b0 J6 G! O
long cnt;
2 N9 b4 T6 t* s; u5 F- ?
long val;
% ~& G1 I% p/ k# J; m( e" \' G1 T9 E
long size;
) h8 F" i; h) ~6 A" ~0 G7 W
int i = 0;
& a/ u |, F P( v" O
2 d' x/ j$ ~5 g8 [3 i" C) b; u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ K# k3 Z9 x F+ K D
addr = base + cnt; /* pointer arith! */
' y' n% D3 y) e5 B3 c
sync ();
0 Z, ]: B! I9 i) A# x' } `
save[i++] = *addr;
% L$ P# Q+ t9 n4 q5 ?
sync ();
# p3 r, P0 T0 Y7 j
*addr = ~cnt;
/ p% `# S; a8 }2 w! q* L! E
}
# p* i/ _( s+ Q) O i6 U
8 @5 W. z w: w* F- F
addr = base;
( {4 m) L _/ j L: H
sync ();
3 q8 m7 z6 r! D C& q/ ]1 j' I
save
= *addr;
4 K, {" J* y2 V
sync ();
# j% N( y F1 t" A9 l4 z
*addr = 0;
6 b" U( b$ Z8 s2 g6 p2 N/ w
5 h. j/ L, r e/ I0 a
sync ();
4 [0 T6 }* l" A7 |* d6 B
if ((val = *addr) != 0) {
% |) C0 X! }/ Q+ _6 u. G
/* Restore the original data before leaving the function.
) `# \: ~3 l) K5 ]
*/
8 _# F4 o- v: \1 _/ s. u( Y( s# N' J$ c
sync ();
+ u( i& I3 ] J
*addr = save
;
" n3 r% f( X" j4 Y9 k1 S2 |
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 h: _) D( Q! g+ A2 m
addr = base + cnt;
& _# e* |3 I: z X( T; R' J
sync ();
6 I, u0 B) f1 x- p6 u3 Y0 ^
*addr = save[--i];
! d0 ^! c$ s7 U1 n
}
8 q- m- r; N% \) u& h; ]
return (0);
: |4 Y% D0 P& V; Q# J
}
( e. g( B! H9 J0 p) Z' P; `
- K" ~: H: t7 |+ t6 W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( A5 q( n/ A# [' M$ g/ ~
addr = base + cnt; /* pointer arith! */
3 o# [( ~1 c; u; N6 L8 E
val = *addr;
$ R$ H O& y/ C4 `
*addr = save[--i];
( C5 V0 L- E5 F
if (val != ~cnt) {
. z) V, L% }( `: p/ }
size = cnt * sizeof (long);
5 B, L' v+ h0 Y8 u; U
/* Restore the original data before leaving the function.
& T' e& j- {) ]
*/
: {' T/ \4 _- v; t, k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. k* K: ^* N$ i1 e
addr = base + cnt;
5 @5 l k+ {6 x" q @
*addr = save[--i];
; T1 d; g! ~- z3 h- @* v* V$ O; T
}
0 L' E L$ O* g( Y8 G, ?! {5 n; G# _: {
return (size);
6 z" a/ R8 r2 P
}
+ B! k; @* R0 n5 H
}
9 d) b1 b6 c- c6 }! x* A% G9 e
& W; d0 U' A3 Z' P
return (maxsize);
8 P" M/ o1 S- `4 ^5 V$ L/ ]
}
; `2 C* J5 e. c) e& ]
int dram_init(void)
: i" G4 V" |5 o, h6 o0 r' {4 z
{
$ m1 g0 R8 Y! y% P; y
/* dram_init must store complete ramsize in gd->ram_size */
1 L' H3 J/ |' `( t$ C3 A' Z
gd->ram_size = get_ram_size(
1 `% }* O' l' S5 d, U0 Y6 F6 o7 U
(void *)CONFIG_SYS_SDRAM_BASE,
7 V& q0 J- D4 V! W; Y9 |
CONFIG_MAX_RAM_BANK_SIZE);
! c5 h7 X) { w% K
return 0;
& {. A) G }* B* P9 O, Y
}
/ L, s$ |: Y$ v6 E$ a
! F! f \* G4 x1 F
8 s5 ^/ t* O& s5 w; F2 [* }* d1 ?- A
+ T7 ?- K7 l' R; y
) T5 c$ [1 c) q0 @9 f) @0 Y' ` A* L, u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# F% o5 f0 e u
. G; t* v% ?1 q
: Z) m# a/ I. o2 s4 O& n0 o, o& c& q
( z* X9 C+ N9 _$ @, z! A
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4