嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- z& ~1 `' Y Y& r7 g2 @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; @8 x0 f7 d e0 Z8 @& u0 N: S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 l6 J8 Q& @0 t7 O$ n. c5 C/ U8 z( v( e
" D0 Z0 ~ D* O8 J( j- e" ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; m% r, c D3 c$ G+ ^7 I/ q0 F
. _+ Y5 N1 s1 f9 M
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) p$ H! H( A. j/ c7 u% ^: p
/*
5 w) U3 B, b4 S% h2 z" b9 z
* Check memory range for valid RAM. A simple memory test determines
$ c; @: M2 ` v, `" t4 l
* the actually available RAM size between addresses `base' and
( q6 |+ ^* S7 b& `$ b3 E2 @% z' o
* `base + maxsize'.
% p$ w& b' o f$ V/ r8 z
*/
0 e" P( X! G5 n
long get_ram_size(long *base, long maxsize)
% ~; }' R5 `% f7 m
{
2 {. H5 ^% T: q1 J! T" j0 O7 u
volatile long *addr;
7 W& p; J4 t" h. }- O
long save[32];
9 u" a |4 f1 N+ J" K+ t* _
long cnt;
% P2 s" O! @$ W. T+ k
long val;
/ e2 q7 }" v6 y+ T1 Y, x. {
long size;
( t& R* R* c' c
int i = 0;
1 ^" d r3 J7 h1 N; n
+ ^, H8 o: c1 }5 V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ B8 @; c1 w" W0 P
addr = base + cnt; /* pointer arith! */
- V6 f( R, Q) B2 s
sync ();
5 \$ ]" D2 B5 h2 c9 i2 `9 R
save[i++] = *addr;
2 k& g! ~+ f b6 v; n5 N/ I0 R; B
sync ();
' g% j! e" |: L0 `( I+ m
*addr = ~cnt;
0 B' Y3 O& T- k$ O
}
% y9 O; ?% S! w" V
# ]5 V' {% e% |- I4 p4 J. U
addr = base;
6 q% ]' K$ }1 `* w- q
sync ();
" l7 I6 |. @; b U- x3 c5 q
save
= *addr;
& [/ o3 t$ ] O9 |5 r5 c( D
sync ();
$ x' K3 P t% F6 L+ L* z8 B! A
*addr = 0;
* K0 y: H2 ~. t* y7 `% |; p
) _3 k$ R% q$ O
sync ();
) d2 d; [$ y- @1 C" [& ]
if ((val = *addr) != 0) {
) n( l3 Z U0 i( Q6 |+ h! ?5 O
/* Restore the original data before leaving the function.
x8 M9 ?! ^: Q0 k# ?
*/
: Z% r9 w& F( }$ P! I
sync ();
% o: f9 o) R# L- b; I2 v# l& A, L
*addr = save
;
9 Y n' F" e8 H( K7 _: b' T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ P. |" b6 K$ [6 H, L6 R
addr = base + cnt;
]: e; b; T; E Q, G+ j
sync ();
6 z( E. U4 |3 Z5 O; Z
*addr = save[--i];
7 h4 s9 w/ H8 B
}
, J* n8 X% s( _
return (0);
: }% n/ {( }7 b& O4 _/ r
}
) O8 O4 g: `+ L' y2 L5 H. d
6 A7 w6 R) o! t" [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 \" Q) o: _9 y N% w$ B$ d' i
addr = base + cnt; /* pointer arith! */
: o9 B5 V C9 L- M
val = *addr;
0 q; o/ O' T+ W" ]5 Z' L
*addr = save[--i];
' k/ y* W( J5 d/ R1 p& v9 @$ _' U
if (val != ~cnt) {
0 [' n/ y2 p' e% [; c6 c
size = cnt * sizeof (long);
. n+ L" L9 `/ Y8 v3 G
/* Restore the original data before leaving the function.
& w2 E5 Z) ]: V: [4 c
*/
; Y) m3 l! \6 |
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) U) l8 X( ^8 G3 N* v6 U1 C" e
addr = base + cnt;
2 [) o8 B# e {' L, w( a
*addr = save[--i];
4 t9 l8 m) }! E
}
- ]& l2 ^9 k7 y4 J4 I( W
return (size);
! c2 C" N6 {8 n9 B, e* a7 d
}
. H$ Y5 K. P& F! E* }1 L
}
$ e) d+ r+ h r
9 c( E2 C: ^- L9 H
return (maxsize);
! {# ^) u) T( G5 m3 d& U
}
# N% ]( t% E9 |( i7 D: Y: t) Y
int dram_init(void)
; N0 k2 X% ?/ s$ T8 q( ` O6 M% m
{
# Q$ ?; w. ?: R) Q/ ], _7 |! O; }
/* dram_init must store complete ramsize in gd->ram_size */
% e$ A1 Y! b4 Y; D
gd->ram_size = get_ram_size(
& p4 [* Q% z) j& p
(void *)CONFIG_SYS_SDRAM_BASE,
* f9 `% D; n0 j B: C' t+ u
CONFIG_MAX_RAM_BANK_SIZE);
# Z8 ^, U d' _- i9 D3 T
return 0;
- @; B7 [% J- p- j, `! t. e
}
, j0 O5 D7 {# W3 }( d
, Y4 f+ Q0 K1 {' F9 I E# {
, @' F5 a/ \ o/ k% T0 N
" h# b- B _% ~4 a
1 N; `3 d, b) j& u. i$ T; u3 c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. b* l) p# x0 i4 X5 u
2 T1 V, N3 S! {: M& H2 Y
; F6 y) o* C6 B3 V: f* G1 b" |) X
+ ]/ B) I& e B! V) h# r8 p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4