嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. S) `5 i/ z# o# r- N# c, J+ i
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ I) W2 q: @( L% X2 k. O8 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; P7 Y- y5 z8 u7 h2 Z2 I5 j6 m. g6 {
+ `# M, }1 s% t, j }' n5 `; Z! C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: }. {2 }, o$ G
) I9 w, ^, S& G" p( j
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 I L3 X! M1 s) B
/*
5 _2 Y! R# {$ i; h X9 m$ P- K
* Check memory range for valid RAM. A simple memory test determines
6 |: `, X! x2 {) k8 ]
* the actually available RAM size between addresses `base' and
3 ?9 ~) t+ }/ ~
* `base + maxsize'.
+ ?' P5 L, d8 B9 z: Y% D
*/
' v+ ]! B% P1 K1 c1 R0 Y% A4 j1 c& n
long get_ram_size(long *base, long maxsize)
7 s- ]4 v, \5 T: h0 R
{
" K8 v( S+ `# f1 Q. m
volatile long *addr;
+ j% {0 n* V) n1 T( y
long save[32];
- R+ K* s# [* ?0 L t
long cnt;
" Y' K. _3 N/ u2 j
long val;
* l+ G$ i5 J' m, u+ B( a R
long size;
) G9 _0 v& d2 p. R
int i = 0;
: h" d" {; ?; ?3 z* F3 X8 }5 K
8 D6 r- E5 g0 o7 z `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 r8 f) I& V6 ^* U- F
addr = base + cnt; /* pointer arith! */
7 A1 B# {# E' f% c- B6 a2 ?" ?& }
sync ();
# g9 }3 y% Z9 a2 L
save[i++] = *addr;
: T0 a. S7 p K6 O1 L. M
sync ();
8 W1 N6 k9 `% E9 n4 Z8 U
*addr = ~cnt;
\4 Y4 T6 a# k+ b, U! p8 j x V
}
1 n% n4 r' V% p9 ]7 w9 L% M
1 K: d, I4 [- r+ ]/ c+ V: }) q9 D
addr = base;
0 h5 [" E: ~1 r: M( r) T( X
sync ();
$ d0 {" I% h2 K# F
save
= *addr;
! W# x! f/ u1 x0 z9 b4 T6 ^: b
sync ();
. Q2 S7 U+ u. w. T: H" f9 Z
*addr = 0;
8 I A" X8 s0 X% d( x, F* h, }8 k
6 w) D* r8 i% J1 [! J4 I7 {
sync ();
, W% d, L: e0 N8 t2 I
if ((val = *addr) != 0) {
% b: v8 R; D/ S& t
/* Restore the original data before leaving the function.
: N* J8 G; c3 Y' G
*/
; G& [$ m% R& E% r
sync ();
4 G- W% w, ]' k1 r
*addr = save
;
* A$ I8 C5 N5 ? @; A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) I# X$ U) A G( k5 @: `# v: H, N
addr = base + cnt;
& S! p& l; `0 f) q+ Z- {
sync ();
+ p' E: D. c$ x: n- m- o
*addr = save[--i];
) y- _! s$ o+ y( J% |$ R% k
}
8 X# N0 f0 A" q0 }& p, ?. j r+ _
return (0);
" H$ D0 Q& J! U O6 t& u& ]
}
! j/ f* X3 K _7 R$ L: {
Z1 C! e9 c; P5 @& G* S$ _+ i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ l6 i& N9 ^% I6 A W
addr = base + cnt; /* pointer arith! */
5 h$ D" c7 C" D& v& c( e' [! Q
val = *addr;
" `! y8 N$ h' F; J
*addr = save[--i];
8 ]. T# ?. J7 A3 ]9 V$ z
if (val != ~cnt) {
3 w4 Z% P8 a& L& u! M
size = cnt * sizeof (long);
" R5 F/ d$ `0 ^2 F: @# Q5 {
/* Restore the original data before leaving the function.
: S$ K# Q, r" \- O: t: T; L
*/
5 A1 c7 x8 H2 X' s7 h' @- g! k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) g6 v% R' R4 |2 \; m
addr = base + cnt;
5 g. U5 G. _4 U- u
*addr = save[--i];
: _: c6 O* ~. i F0 g) d
}
9 u$ B: \* d) a# O y
return (size);
1 L+ f) D! d" _" `; ]; A+ j& }+ v
}
+ d4 G( T1 a# Q- r- G! E1 t
}
* r# r% ~4 [- R
6 O% D+ H# `# ~; N" ]
return (maxsize);
C+ i) e! x1 ^) x
}
% p! P! A ^: r4 F8 ] c
int dram_init(void)
/ ?$ {1 S: G, k) h+ N& T& f
{
! r8 S+ o, M/ M7 s
/* dram_init must store complete ramsize in gd->ram_size */
5 k/ e4 N# x& X+ L
gd->ram_size = get_ram_size(
4 |0 g! p0 Q9 J) U
(void *)CONFIG_SYS_SDRAM_BASE,
/ O& f- b' u; C8 l2 Y" Q* R
CONFIG_MAX_RAM_BANK_SIZE);
4 D, W t0 W) U) ^3 c. q
return 0;
0 ]4 F5 S& c5 k' m& Q/ q3 T
}
2 R* f) Z) [% o+ Q
% s3 X C, c- N4 n+ O( [3 _
E6 v( \- r9 S1 J9 S: T% {! {; {
' k. O) N6 w! K6 l, G# {# }# J
% J, J7 A% j/ y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* [: b1 V3 w8 Z N0 E
& I! I/ |$ b+ \6 K# {4 t$ l5 D
' S% |1 b2 J' \6 v* J& K
% l% M' N0 Z3 y- C2 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4