嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* O* ~5 @: |- ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 _! m3 p9 I; _3 S* x! _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 p/ P" j3 z; p0 _1 [
) z# Y/ R" Y- V6 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: m) E: u C) c" Q1 m( Y2 q& |
/ S) f+ ?/ s* J9 H& J* `1 T# y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' b) c& P) S, R, Z, ^, S
/*
* L" r- U& V; e! p, W8 |
* Check memory range for valid RAM. A simple memory test determines
B( t( c4 U0 Q y& s" b
* the actually available RAM size between addresses `base' and
4 ]" z! e8 x3 `0 @: |/ a
* `base + maxsize'.
. l3 _% \( l- @1 J4 n! R
*/
4 \. Q# |! u8 s9 A1 ^
long get_ram_size(long *base, long maxsize)
% f N9 Q' d* O" O9 J H
{
_( X( b4 m( ^+ t, @
volatile long *addr;
/ Z7 D4 k, t) M
long save[32];
. X! R1 k- H. d4 B
long cnt;
3 ?0 T" h3 R: N: Q& e9 L
long val;
2 J8 c. |; n1 c1 J
long size;
, g( H& d8 _7 P; w8 {
int i = 0;
5 ^, y, V& P1 W
4 F4 H2 C: d9 O! y- U. K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 Q+ r# @7 g4 c
addr = base + cnt; /* pointer arith! */
! Q* w% ^# @" q' d0 ?, ?" O
sync ();
$ P% L( Y4 G: u- [7 u( J( W" @4 K
save[i++] = *addr;
" s5 E, ~+ G$ D( {$ }! H8 Y
sync ();
9 b) J0 H" H8 z2 x. ]% F" K# u
*addr = ~cnt;
7 u( y* p ]) h8 U) F8 f" z& y
}
, }1 P1 X/ ^/ V, x
+ x, o6 c. U, E: S) b' G ]
addr = base;
9 p4 Y% B! k r, j) B: n& E
sync ();
# m$ [5 J# |6 Z+ [5 W% Q
save
= *addr;
% K0 Q# \0 O: {2 B0 ?/ ?
sync ();
. I" i: ~5 n7 t8 G2 j
*addr = 0;
, Z3 @- G, J O7 q6 U5 r9 [$ V% E
# a! [! `4 A0 {' v" q9 V
sync ();
- |# S! U0 R. T+ | @' f% r
if ((val = *addr) != 0) {
* ~! q5 X; z) ~( b& e5 s" Y
/* Restore the original data before leaving the function.
1 L3 }- q1 _2 ^- G
*/
( m6 r9 _2 J* [) |
sync ();
3 k3 u- L! `2 J/ e$ P4 \
*addr = save
;
1 D0 j- u4 o7 [4 d j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ }. |. u2 A; P0 Z( ]% i+ B
addr = base + cnt;
# ?9 K9 K! ~6 g9 w* y6 R/ b. J4 o
sync ();
$ c3 Q* C; E) m: k
*addr = save[--i];
5 i g" W- T) I* N
}
* r4 {, f" [% b
return (0);
v2 S0 W2 D% S2 w
}
7 n! Y0 i1 {8 t i: ^' l
; C0 f( N8 K3 m
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' S I2 j2 q9 m- q4 H) n" v
addr = base + cnt; /* pointer arith! */
& W) t2 P/ c( t4 g- y: I' _0 u) }8 ]
val = *addr;
7 e% B( D) \( k9 y/ i
*addr = save[--i];
. h+ Y% W( C8 v6 Q$ S
if (val != ~cnt) {
# N' X& `/ ^8 E, H f
size = cnt * sizeof (long);
1 c k+ F T, p! A/ ^3 S
/* Restore the original data before leaving the function.
# l" b( q# s4 Z4 p) p# w0 Y' V
*/
; I$ H2 }; N7 p' m7 j& `" \" S- {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) O Z$ D7 W5 ^7 r5 V
addr = base + cnt;
5 o$ |7 C& R' ~! g( s/ X" T+ ?
*addr = save[--i];
4 f/ t& T7 T9 W: |, W/ I+ ]( ]/ Z* z
}
$ Q* n q: H, f4 M: A! @" f: V
return (size);
' S E' c# z- _
}
# B9 q$ H% _/ B5 }0 s4 X
}
! _, }1 M0 Q% \* M8 \9 j2 h
# q/ z6 c L( Y1 \6 k; w0 o
return (maxsize);
3 e& \0 e6 g B8 u- _& x, x' n: @
}
6 Z2 T4 N- C. a% _5 W+ j
int dram_init(void)
' Y0 u% R0 Z+ w/ ^+ u
{
% c2 R' T+ d& T( `$ A
/* dram_init must store complete ramsize in gd->ram_size */
' F* G( h0 ^5 P' ^/ S
gd->ram_size = get_ram_size(
' z, f& n* z% O: m6 i, z7 @
(void *)CONFIG_SYS_SDRAM_BASE,
/ o. {3 ^+ f4 P3 t1 h$ e0 ~! z3 |% R
CONFIG_MAX_RAM_BANK_SIZE);
- |6 D+ c' N1 ?: O9 @/ W) N
return 0;
* k( h/ U9 j. W9 _! f4 U- s, |
}
0 [1 P; H- b2 h3 R9 i' Z/ r7 C' M8 B
# i' ?) A$ p6 R+ b; K5 e
1 n+ |* u2 B7 Y( M/ T( a- S
$ E! O% I' v. m
( _. ?& d8 T- c7 Y) K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 B8 v, W F7 A( b Q
/ w8 y* j' z9 K# C: g( w) {; j
$ N1 C7 W$ _0 Z& z1 ?+ [# ?
' j5 T1 n' Q5 w/ R/ J5 N$ n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4