嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ N' @ Z$ w0 o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 P r" ]$ p/ I* } d7 t: c0 _8 k4 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 L% b0 A+ d6 Q5 ]$ n( g8 E" x. p
' F3 a3 x' \9 M9 |) a: {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; q, v, q; D6 ^1 j* ?7 {
. K5 N8 @+ c5 \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 e' Q% o, y% T. I& l9 h) M$ r% @
/*
& H8 \$ |( t- [( ^. {- {# f4 ~
* Check memory range for valid RAM. A simple memory test determines
V# |# n! x( ]
* the actually available RAM size between addresses `base' and
' b/ m2 q7 R6 a# n- u
* `base + maxsize'.
# C x* k( x* t
*/
/ c, u" D8 y* ^3 u, |# y
long get_ram_size(long *base, long maxsize)
1 e8 R$ F' n- g, \) s. X, ?; W" r
{
' o$ a9 ^( E5 q) u* c! p
volatile long *addr;
1 }! m. }* d% m
long save[32];
; L1 q' c7 p' O6 @: t
long cnt;
4 t8 B8 {( c y' z- E. F9 E
long val;
. o3 m/ t* x3 G( p0 C
long size;
6 f8 G4 y* c5 ^1 N+ C. y
int i = 0;
9 L- \" R A; e' H* N Y
3 q5 J* T$ q. T5 m* q K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 o3 `' k+ ~6 ~* X
addr = base + cnt; /* pointer arith! */
. P2 |9 x* A' ~( ^9 v) K
sync ();
+ k: J3 K/ H6 \: E. @
save[i++] = *addr;
$ e( n. ^, }% ~
sync ();
d3 p( ^: }* f# L p, j; l
*addr = ~cnt;
, C, u1 i% J7 Z) {3 k
}
% ~+ F3 Z4 L/ ]2 |
7 P1 n. n+ k+ G; r
addr = base;
. }6 l' N& T3 ^5 O' ]" f, U
sync ();
2 Y3 X' \2 O/ u. B$ A# F
save
= *addr;
1 h( {, i$ Z( _3 A
sync ();
. y# W7 \2 ?+ B$ f( n% ~
*addr = 0;
C/ ]8 S. y! O2 J! U1 O/ L7 o
# e( y. l6 {7 J# h# U
sync ();
! T' D1 k! Q0 _- S6 K+ C: e2 |
if ((val = *addr) != 0) {
# o3 z% n$ R/ y' U& v) p, o
/* Restore the original data before leaving the function.
' |/ M0 N- P( Y, i- N3 K5 V
*/
2 a( b' @' K" p! B& G
sync ();
( ?6 u0 i2 J9 ~1 U
*addr = save
;
5 W( E( n7 {* O% [- `% {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. }6 @9 K, B. T2 q# D9 M; N
addr = base + cnt;
; E: l/ M0 _) L3 p( q
sync ();
4 s* R! g: l3 g; n% f4 W8 D1 u- x
*addr = save[--i];
2 Q& O+ H- ^# z4 \& x- }3 ^5 M
}
& ]: b0 P/ u W
return (0);
' U0 t" m. p6 f; `
}
& _* r# c/ [- Y. H" Z# d
1 p- y, u+ \9 [0 C* B
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ]; L6 l& y9 s6 N% H7 r
addr = base + cnt; /* pointer arith! */
# {9 N4 H# L @+ m1 H
val = *addr;
: F3 A- l1 m) W7 [2 e& E) g
*addr = save[--i];
7 s5 l( x0 b/ J
if (val != ~cnt) {
6 w& d: L1 r! h# c0 o& E. M
size = cnt * sizeof (long);
! t: U3 D' G$ {2 d& b: T. ]
/* Restore the original data before leaving the function.
4 l0 V$ e# x( b2 v+ O( Z
*/
* t6 V" M: f2 P: f- S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# q0 s# M" ?, J l- w
addr = base + cnt;
* I z$ S/ Z/ u, H* t
*addr = save[--i];
D0 P: j$ k" ?8 c; P7 x1 B9 N
}
; _$ u% t( `9 k. f; U8 q- q
return (size);
; U, k+ n# y! s
}
3 |" t; F% a) P6 F" u
}
3 Y# d! |3 ~, K
, j& g3 U0 k. x9 G' p3 p
return (maxsize);
! c: c6 v8 o( t1 m& W& l, F4 Y
}
" _* L5 W" f) P& @$ D9 l
int dram_init(void)
" T: C, x# \+ ^7 t8 K" h
{
$ M9 `1 l' w5 R- W ]) E$ k
/* dram_init must store complete ramsize in gd->ram_size */
. a& M) m7 |, M! F& `; y
gd->ram_size = get_ram_size(
9 O5 S0 f' @$ @4 `( u
(void *)CONFIG_SYS_SDRAM_BASE,
- {6 r/ u3 H9 R+ C+ U* p
CONFIG_MAX_RAM_BANK_SIZE);
w+ |0 G* |: j9 j5 x* \
return 0;
! I* r% D" v7 M; ~
}
& x" c9 }" ?* j
p+ f) T% v. e8 Q' G) ?
" [6 j# S9 `& @/ `! V; s) B
5 M; H3 Y8 T7 N/ j
, R! ?6 T( g: g5 ]! @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ y$ Y+ B% g% I* b( B( ~7 \' a
) a, X; V& h+ v7 @
) \; E# v* ~6 w0 _ z
& ]2 u/ E7 ]& f! ? l" p
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4