嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 u5 _0 l! t: p, v$ I; K
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# \, b" v% r2 {3 k9 C( _* h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 ^4 v, }; M( ]# K
2 B) A0 E" W- A! a$ H) j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# s1 }" n. s/ h1 C9 m, \" u
( {5 ^. W& s5 v: a* o* ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) W! O. V% D* ~8 O4 w5 C5 d9 `. b! W$ ~
/*
) m8 Y1 Y! {7 H* |" y. M
* Check memory range for valid RAM. A simple memory test determines
2 D1 c4 q& }2 K* N1 Y! M
* the actually available RAM size between addresses `base' and
8 P# e6 Z( n0 F; B
* `base + maxsize'.
2 ~1 t- `5 [' {, [3 W% G; U1 i
*/
2 }* |$ Y/ o: o7 R
long get_ram_size(long *base, long maxsize)
) t7 W9 i! {" }
{
b( n+ j- |9 w6 N
volatile long *addr;
( g( E; \2 U$ ?, @+ t
long save[32];
5 [. W+ d+ e f% d, w
long cnt;
& Z: G; B+ `* `5 g& ]. `
long val;
0 u+ U- P& a, Q5 U
long size;
/ P+ F6 z" L: t7 n2 M- q# O+ M
int i = 0;
8 A6 y9 }' p1 {" _; R* e1 u
: l0 z9 Z ~2 L+ v( C6 G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' ~7 I' g) |2 i: l! J+ M% h
addr = base + cnt; /* pointer arith! */
, r! F4 y p% w: W- e' I7 f
sync ();
8 J2 i4 t2 X: C: z! h- A& R
save[i++] = *addr;
( j. a) ?/ I/ j, z2 B- P$ C9 h! z
sync ();
$ ~* q! Q6 _, _
*addr = ~cnt;
% g& ~8 m6 P) F- ^1 _" u Q
}
1 _$ x+ h$ A o$ [& p
: _% B/ C4 a3 q
addr = base;
3 } C3 q8 i& R6 C
sync ();
1 ^( |4 h( x( ^- \$ H
save
= *addr;
W& R9 @3 ?8 n: D, I
sync ();
( _$ A) {. _1 Z) U' J1 h
*addr = 0;
1 i( I9 d2 K& k
; f5 d& f; D, l( p( X7 ~
sync ();
0 S9 y0 O4 L; p Y. \6 r0 X* H
if ((val = *addr) != 0) {
' g+ \5 A( }1 Z1 J) U# {- B! U
/* Restore the original data before leaving the function.
* F- R* ^, V- \$ ]( Q* C: j
*/
0 P' H+ P$ m& a: i1 `
sync ();
" J' Y: A1 s' O% U4 P; B5 p
*addr = save
;
0 ~3 x+ [% O, G2 u7 ]* ~% T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; @0 _% W$ J& w' o' m
addr = base + cnt;
* l8 C: v% p: i" m" b# _) U
sync ();
9 q/ A! @& w0 x+ e. x
*addr = save[--i];
) w3 t6 U# G9 `' x) Z6 ]5 F3 ]
}
& O- y5 V3 U6 X n: w
return (0);
, o4 @) v. [* Y1 n
}
/ S: V# @! \% a0 h: J/ `
$ f9 i) [3 V& A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ S5 g9 Z, N* ], u7 ]) n( R
addr = base + cnt; /* pointer arith! */
7 y6 d" J9 F2 \: m' N
val = *addr;
$ I9 y7 T0 K; a" x3 i
*addr = save[--i];
M I' D9 ^, x# p
if (val != ~cnt) {
; g4 ]# r6 O1 q
size = cnt * sizeof (long);
1 F$ B- ?( Q& {2 `2 Q
/* Restore the original data before leaving the function.
0 G% J1 Y9 f: F) R" i$ N! C
*/
+ X! N1 y; K0 o: u5 Y+ b. _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( b& b1 \, x5 \+ r4 z
addr = base + cnt;
5 _& \1 k! r0 a) K+ ^1 v# p# E& Z
*addr = save[--i];
, E( j9 L" T0 i3 ]. a: c
}
9 n4 \* u$ L- s, e& R2 ?
return (size);
, H( ~1 Y8 ^0 w+ y
}
% T% v1 i$ q. b/ }; Q
}
3 t0 A* V7 F: R) N2 v; y: z
2 Y$ J2 p; O) s; M" f
return (maxsize);
, ]0 P6 O) ]" i. A
}
! E8 m& s5 C9 o, O i
int dram_init(void)
* R4 h0 _( w' M
{
) B+ ^1 l% H! d
/* dram_init must store complete ramsize in gd->ram_size */
1 e* l% v8 M! ?5 c' Y+ N; C& ]7 f
gd->ram_size = get_ram_size(
' O o! n% U7 h, `1 O4 l
(void *)CONFIG_SYS_SDRAM_BASE,
8 L/ _' d5 m2 Q x; ?
CONFIG_MAX_RAM_BANK_SIZE);
. f* n7 w1 K& {* Z: {% O7 s# S
return 0;
4 @5 W- h5 D. P% _ o
}
; R1 E S7 U0 r
9 Q' S' R' h) R' H7 }( k# s+ N( Y
0 f/ K0 m, ]- A4 l
, N. j8 H/ h4 X# a k
' t' T4 R# ]8 [# P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
a! r6 [6 O( \8 a- I; P
, B6 {6 [- S5 w# ~7 K
! r+ S- T; C( J! ?4 Q% `
# ~( w0 s1 a, f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4