嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ }& Y, f! y3 e' `& p+ y" O3 t6 {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 u3 Q' z( y$ e3 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ c! k8 q) c* X! I/ o5 C
9 O. {( r7 t3 T" _# G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! H, `2 w" c/ e* m: V" O/ P
7 |+ i& k) H9 A7 _* U
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: N7 E" E4 x) i: a" E
/*
% G; d% c1 A" [1 e$ i5 z
* Check memory range for valid RAM. A simple memory test determines
9 X [ @3 U) ?
* the actually available RAM size between addresses `base' and
! d0 \3 V }/ I6 g
* `base + maxsize'.
: K2 b7 `6 |# E
*/
, p, R8 W: X; j( S
long get_ram_size(long *base, long maxsize)
% R" t& i4 ~0 Y A* ~3 h, h0 n
{
% P: z- d. {; `5 l
volatile long *addr;
' e( c- G+ Q {$ v) t
long save[32];
( S( W9 E; S: o% k% N
long cnt;
" |* `8 d0 j3 N* c* e: x1 h) b
long val;
* N! M: V. E, `0 N. ]0 m
long size;
% X- z/ k# v$ b p M1 s
int i = 0;
+ {" o. O) b. o+ x' @( w
( {4 }! p8 Q' ~# p# Z1 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 I6 |+ ^* w$ Z* {+ A9 z
addr = base + cnt; /* pointer arith! */
- L! C! w ~8 e8 l ]$ ~! U0 c! a
sync ();
5 X7 z1 O" H/ U3 Y- g+ ]
save[i++] = *addr;
1 S) k) g& o( @: z1 a
sync ();
" H9 v' v% U' }4 a' D9 o8 ?$ U
*addr = ~cnt;
5 X1 G1 S0 U* X. b/ i* V2 o
}
' b5 h$ t( e+ q8 _7 Y. ~
0 Q1 n1 T$ ]. c
addr = base;
' ?, @& i9 G% h- i) G, Z
sync ();
+ a" j) e8 y; B9 M8 \3 ?
save
= *addr;
& K7 y8 j( e9 |0 _1 z
sync ();
* `: ~4 h' q0 b. h
*addr = 0;
- m( E8 A4 Q% O0 c" v
' g/ Q3 T5 n, ?) C' t' j
sync ();
7 {7 |: e3 T- F
if ((val = *addr) != 0) {
. q0 ~6 `, g: T4 h% |) q: z4 U
/* Restore the original data before leaving the function.
7 ^5 U3 {) z; H' p
*/
" |6 e/ v1 B& |' i {( I
sync ();
9 |6 D3 E$ |$ N. ~4 t9 v% C* d
*addr = save
;
9 i! N% R& F8 x- g1 H
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; |( W! m( J+ d, U: z. q
addr = base + cnt;
6 X. ?1 x+ m; J+ W- _
sync ();
# e3 v1 w/ r6 X- p# b; J, U4 Z
*addr = save[--i];
" n2 n/ ^8 u* u# _' C8 t% M, L
}
g; j4 Q% p, x( f& d0 C0 V
return (0);
- X9 G! t0 q) @+ ]
}
5 V+ J: i/ @$ B' C7 Z N9 R1 W
7 M" D) G f! n7 c+ e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 c) R( R+ q8 X- d, c
addr = base + cnt; /* pointer arith! */
0 l7 l/ Q% h; j
val = *addr;
+ ?. g' u" d% R& E. ], C1 h
*addr = save[--i];
: y j! [8 b" d1 }# l! d! ~
if (val != ~cnt) {
1 [, X1 `0 t" H5 W7 f, K- Q
size = cnt * sizeof (long);
2 C _5 j* J% k) p) e
/* Restore the original data before leaving the function.
8 z2 z8 U8 k! Q, g* c4 W
*/
2 v& u9 l/ V" o4 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
?- B# ]* q, J# S. e2 K$ C
addr = base + cnt;
! q( C6 G3 P ^" b7 g3 J' Z
*addr = save[--i];
) `% x5 \; q; {* O7 a9 T# |
}
' ?) y: b# v G: _! j$ d
return (size);
8 C3 }7 N6 S* S" @
}
! T2 N$ n$ [2 m$ [0 ^
}
7 L0 o/ S. p8 t y9 S- W( ]5 R
5 g5 P( T$ h5 l
return (maxsize);
/ l% s* _& I2 Z1 n* e) Q4 G0 K
}
, I( h) l& Q% j, v# D
int dram_init(void)
9 n* }* R" h1 X
{
8 m* w- G/ n0 N, y$ |
/* dram_init must store complete ramsize in gd->ram_size */
- s2 t/ ?- i/ O* r( Q+ b! S0 H
gd->ram_size = get_ram_size(
# ~. `; k' Q( `, _2 Z! ^- Y+ m+ @- b6 E
(void *)CONFIG_SYS_SDRAM_BASE,
+ D6 A# Q3 j2 f
CONFIG_MAX_RAM_BANK_SIZE);
8 U2 V$ ]. X) w3 T3 Z% ~8 }
return 0;
' {6 E* u9 [0 g4 N
}
" n6 c' r6 ]0 G, ^3 M
' P1 g8 n7 {; n& m3 J) P& n
7 c/ ?4 R k4 U! \; _- l1 C
8 B: d: t l* f% ~. C
& B9 R- }* O v3 _/ k% I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" H+ s" \8 x C7 o- ?# ^
/ m: o# D# ?# N8 ]
7 z0 a# A( q: ~8 \! y) s. l
$ l, |) m1 e! v% _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4