嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: q; R8 u8 V1 r O% x# {4 H9 a
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# S* j) x: D/ H1 z4 g; L8 a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
_) A+ [9 [ t% L$ x: ~2 b
5 y5 p4 w/ D5 ?. E) i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 @6 a+ B( K$ w- u4 F0 ?
' h3 c# \2 P* V' E6 `, k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' `% [7 {) f4 l) I6 Q1 l" y& M+ _
/*
/ B3 H0 [% r5 t K. x
* Check memory range for valid RAM. A simple memory test determines
I! w2 h; R# h9 O e
* the actually available RAM size between addresses `base' and
2 |9 d% g% e+ z/ i$ D' ]
* `base + maxsize'.
& |# G1 f8 [9 M4 Y- O( t O' U: x
*/
; y7 m' Q& u G5 M
long get_ram_size(long *base, long maxsize)
& _/ Q* R& w- M6 w) B$ g5 V
{
3 g* l! u, N% ^+ t
volatile long *addr;
- r/ a) d: q0 p B, Z( b. t3 C N
long save[32];
7 H" `0 ?2 c! r* h! L0 T
long cnt;
5 r* j! Z0 F4 H( l y
long val;
- V. v# x9 R; t% d9 V6 T' Z4 q
long size;
& z2 B) t) W* p6 |, l4 S$ R
int i = 0;
/ k& j6 L5 g; J
) c! k/ C2 y+ e- l+ \$ i, }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
e8 o. u! T; X1 p+ @, H8 t$ M5 e
addr = base + cnt; /* pointer arith! */
1 Q) j# r! E9 {* L; d I" K* x
sync ();
* A$ k6 A/ M9 [. ^8 A5 G, p
save[i++] = *addr;
; e: U# X2 ` `0 Q- r% P
sync ();
- H5 e1 @8 r# P5 S( b
*addr = ~cnt;
& t% Y! q# ~; X. L3 `
}
+ T. {8 |! ?! U; O$ i6 l
1 u* ^! O) H' h% ]# k- d- J' O
addr = base;
0 V& b; D/ l" p# [
sync ();
$ u( c& h# k6 C; }- m) ~1 ~
save
= *addr;
- g) N. x9 y* x9 K( Q1 b, _# z s
sync ();
( h, O ]1 y p) V+ q5 d
*addr = 0;
: x" k7 ~) k+ \7 Q: l z
" B4 x2 V. G9 |* S3 V3 H, Y
sync ();
% }/ a& d0 `3 x" T' M
if ((val = *addr) != 0) {
; v( P8 A2 _9 Z [ b
/* Restore the original data before leaving the function.
: J7 s$ D" p! q& @& B" B
*/
3 V4 d; G, v/ \4 r- ^* B& G E
sync ();
`* n8 P& d+ g. L4 r. z
*addr = save
;
7 d7 B. C. g; N5 [/ P% u4 y( b/ s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 \, P+ i. v) k
addr = base + cnt;
$ ^; T; ]5 ^( D7 }$ J" V5 m
sync ();
- m E4 C% T5 ?: H( V2 w
*addr = save[--i];
4 B! N: j. P; B
}
* e( @6 |! {- `$ s
return (0);
g( M' Y. X8 c
}
* E( o3 U- e0 f: L# I- d7 p
. v# u, g( j, U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! ~6 i$ g: c3 |" J
addr = base + cnt; /* pointer arith! */
& _3 g; X5 m( `. {( k! Z: j( a
val = *addr;
' K4 J3 L8 W3 A: A# `5 [7 a$ {6 I
*addr = save[--i];
7 h: j) A1 [" ]( }2 h7 K( L
if (val != ~cnt) {
: A* [& @3 s/ y( n
size = cnt * sizeof (long);
$ h& x; ]/ Z" Z* B6 d1 Q; |
/* Restore the original data before leaving the function.
! F. P' i2 O5 f' Z/ I
*/
. Q- ?3 [" |) c6 U4 j9 M% \1 b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- g4 f- \# Z! W! N% W3 K; U" T
addr = base + cnt;
/ s4 W } f3 ~
*addr = save[--i];
, v; ^/ v# N8 H: {, a9 I3 s( n3 o3 [
}
4 F% b1 r# E9 J0 K/ D
return (size);
- ]- Q6 l. \/ \$ e2 `: u
}
J) h4 \" l3 B- _
}
& ^- \$ C* F0 b
. i& J7 m8 m9 h Q
return (maxsize);
9 l4 F8 V6 L# p: B8 u+ L
}
: s8 c1 ^ v/ W2 M" D$ t% ?' m* h* V
int dram_init(void)
% U) p2 J$ Q9 l3 e6 f: ^ o: e1 e
{
% d a3 k" D# u# m7 S" V
/* dram_init must store complete ramsize in gd->ram_size */
7 j: ~: R0 y0 S6 k
gd->ram_size = get_ram_size(
- W, X; f' y! }7 Q8 G$ }2 E
(void *)CONFIG_SYS_SDRAM_BASE,
; M% D, H7 ~+ I) x
CONFIG_MAX_RAM_BANK_SIZE);
- h7 Z; f/ k' I J/ ~/ Q
return 0;
$ O/ y( I# w) q% |
}
" V+ f) W. @" B3 U; _8 J) {
& \5 D" B0 j: A# ~/ y, T' c8 I
% e4 M9 a7 J1 h$ V
# P/ M1 Z" s, m; t" i8 j
7 A% f3 W' o, w, t) V' L3 w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& Y+ B2 K/ b. a# ]* t$ I$ [, b: ~$ I
: y& n' y: V7 R2 o
1 F: ]2 ?: @: ~; X/ F* w" L
" M5 g- p( g/ j+ o& I+ v3 t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4