嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 Y/ I( r& O4 m) |( e& m# {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 B! o3 L: g" G0 v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ w4 J4 w1 w/ ]* ]
7 V2 Q# ?) @( e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 o% c p; j( u; _; x
# \8 x2 u+ {/ i: V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( A/ h+ r+ q% S c& ~
/*
+ r4 D" k; L, ?1 ?! G
* Check memory range for valid RAM. A simple memory test determines
3 S4 t2 \9 G1 N+ p% m+ ]
* the actually available RAM size between addresses `base' and
& w. U+ p. ~* o& L6 s
* `base + maxsize'.
: N( x$ t t' v& e' s6 @
*/
) d0 H2 V) N5 t, o: _5 Y
long get_ram_size(long *base, long maxsize)
/ v: a* _7 r# j& j0 Y' |0 P) C
{
; @2 C' d* k- k4 j0 l
volatile long *addr;
3 M5 P$ Y s4 s# H0 x
long save[32];
( C0 s1 O+ G5 n# ~% L. U$ ]' I, \4 x
long cnt;
~7 K7 Y* U# R0 c
long val;
2 F8 j" G: O7 J7 j
long size;
V9 ^' G O: n! E/ r- |1 ^
int i = 0;
5 _3 e0 k" U: o d3 Q' P) B
: C% `% A" y6 g4 ?0 @
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ p) I9 V; x2 J% L
addr = base + cnt; /* pointer arith! */
/ [- A1 [1 ^4 o" u+ W* D
sync ();
9 Z4 Q4 J' n8 z
save[i++] = *addr;
$ @# D; I4 }! [# B' I0 n: @
sync ();
9 a4 i! h9 N. n0 K E
*addr = ~cnt;
3 P2 ?+ o; i% h: K
}
E4 T D, q5 e! n
" ?% V, e. _3 e$ |1 `6 r0 z
addr = base;
1 t. s$ a. ^ _7 ~/ G: s. h7 s
sync ();
4 g8 X; k; H9 I3 [9 i. ]
save
= *addr;
% Z' ]* x# I- G9 o1 t" B
sync ();
1 {3 i0 L: B9 w& @' _
*addr = 0;
) k) X! f4 g, L! i7 N. M) F
# d( y) u" r9 S
sync ();
. T5 ?: W' o% z0 U
if ((val = *addr) != 0) {
4 m; `* G: X0 D/ q& h! U8 l) u M- X
/* Restore the original data before leaving the function.
5 r- U* Y4 \4 {( \# d
*/
7 v: i. l' Y6 U! `
sync ();
, V6 g M j; X! ^
*addr = save
;
) x! y9 F; G$ E& K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) y% ] r/ k7 P, L
addr = base + cnt;
# n8 |. m* v6 g% \9 V0 n
sync ();
4 ~. B5 w$ P$ v* Q8 W) P' O
*addr = save[--i];
, H7 p E! T* {) g) f% R
}
- S6 {* R3 @7 w! G) \+ A$ R8 g
return (0);
( T. y( ]. r9 P7 v Q v
}
' @! [" @( E) u; n H5 q3 s
T2 s" a- A3 X- a# ?+ \+ a' z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" e! X5 \, y" A9 \* _: x7 l
addr = base + cnt; /* pointer arith! */
# j& S. p+ e* }, x c/ M
val = *addr;
9 ~" _! H8 i1 A
*addr = save[--i];
) l* U4 j) W. j o3 O, K7 j
if (val != ~cnt) {
+ [+ Y2 M) l* G$ z
size = cnt * sizeof (long);
" { A" b3 Y" b" S
/* Restore the original data before leaving the function.
9 c; M2 j" } r* [0 n3 o1 E
*/
; H: \4 g( I6 `. p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 f' u( c% G3 o. g5 V+ ^- `
addr = base + cnt;
$ B& s0 f* R0 C7 R: G
*addr = save[--i];
7 l- M$ D2 ]- c$ I
}
/ r- a3 {8 w" {- J. A0 r
return (size);
0 T# ?! U9 y8 Y b( s" d8 O/ n4 s! Q
}
( X/ Z/ z1 a% _; n2 ^
}
- V' A: F7 y D! K% r2 T
/ O$ w' F3 l: O" M5 I9 Y5 w
return (maxsize);
( L$ H0 P# `- Y2 _( ?) T
}
! J2 H$ i1 N |6 M5 w, O7 | ?
int dram_init(void)
; Q7 u1 r* C. n0 `3 O- y
{
& d/ I' }2 `: |- h2 B* L1 x9 ?: ~6 w
/* dram_init must store complete ramsize in gd->ram_size */
- E- r: W% D/ L
gd->ram_size = get_ram_size(
- K9 e& ]6 T9 O( ` V: G7 T
(void *)CONFIG_SYS_SDRAM_BASE,
' M: a/ O' G1 K/ n. f- N
CONFIG_MAX_RAM_BANK_SIZE);
8 @. \1 R1 q7 A6 N
return 0;
. a! O5 A6 x7 M9 [
}
) C' T: r- S9 [- w/ l' d8 d
; [6 D+ b4 g3 h& ]8 V) Q; t1 d6 ]
4 i1 Z' b! V9 ]5 Z/ l0 P
/ { }" u. u$ o
0 O4 V' P, |3 e+ U3 Q; s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; X* i+ J9 ?: h: P" |: P' N7 D
" q; t/ F1 @. r7 x' `
6 S/ \' f" r; S5 O- U
b# Y8 C0 V% |( G' {( ]2 q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4