嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 }* ], {+ o4 U; ^* U
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 Y8 z: c' D5 G2 ^. t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% I" v; H6 E. O6 N/ u6 B i# Y
2 h5 l( _ ?7 h. e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- ~6 H' m, V- w: f( m* _- j
$ }3 d6 V! D& ~6 r, u
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- F6 D8 I6 A) g4 u
/*
# R8 R! y# r7 }/ r" \
* Check memory range for valid RAM. A simple memory test determines
$ _! t9 P) v T
* the actually available RAM size between addresses `base' and
5 J Y+ K' H7 z2 R4 ] ` g) b! d1 W2 Z0 H
* `base + maxsize'.
8 T9 r' t) F4 t/ d7 A
*/
4 G# r& N2 N4 _7 W
long get_ram_size(long *base, long maxsize)
6 r" l; z1 q) G6 h7 ]. e
{
4 ?3 d* B0 D7 r7 W. @5 m7 T
volatile long *addr;
2 w" {6 M1 ], e& w9 t5 S
long save[32];
+ N" F5 b/ w% t; |5 A- z! f
long cnt;
3 j; z( Y7 t5 }' W
long val;
1 B: P7 O1 t" |
long size;
( m4 m# v& T0 C; y
int i = 0;
& d, }, T; s, A5 H+ e, V7 f
- O2 e7 ]- @1 t3 _0 p" |% M) W# F
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 _1 q; {; Z: e- A) m% j K2 ~: E
addr = base + cnt; /* pointer arith! */
9 x9 |$ T# N" Y8 h8 _, I
sync ();
+ f% T3 D$ x% l# l
save[i++] = *addr;
/ D7 ^% ]! W/ r- V% R
sync ();
( s; `% d# y0 T$ x& c" \: F
*addr = ~cnt;
' k6 @1 C+ K( {3 l8 p7 M- }
}
( E8 B* R! `8 N
7 o1 [6 m7 Q7 `
addr = base;
b7 w% P/ ^) A5 e! K- R3 c- \
sync ();
, d( {$ K* e1 s; _
save
= *addr;
$ l, m& V$ u, W% H% q
sync ();
' L" ] F0 e4 c3 r; ]+ i
*addr = 0;
- t" ~' Y( ]$ s; T8 {
8 v/ H5 a6 S0 G8 s& S" ?1 L
sync ();
5 [% f% u! {/ q3 `/ |. ]
if ((val = *addr) != 0) {
9 T' T' ?3 C9 C" H# T
/* Restore the original data before leaving the function.
- S, R2 k- u+ I# u& {
*/
: L b' W' s" D- e4 L& o6 K
sync ();
; a2 R3 O& Z! w( @) W
*addr = save
;
. C" d* U: u5 [! Q$ @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! k4 g* } K7 `- ^6 L# } i! c h: K
addr = base + cnt;
/ }. @7 e) P" f' b& ~
sync ();
( |/ Q. A0 C! X9 o2 f
*addr = save[--i];
: W" _ S: j# x% I$ V# `/ ~* n* h
}
" M/ h" b0 [- J
return (0);
2 ?: k! p/ o; R8 q; Q( w
}
: [* Q0 \4 U/ w
7 L& Z7 `; e/ e. k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 Q5 L- q& o: L
addr = base + cnt; /* pointer arith! */
/ B- \$ q4 e: T* a
val = *addr;
' ?& t7 P) r, q) u
*addr = save[--i];
4 k# a0 c2 l* d; g" W
if (val != ~cnt) {
# w4 I2 X+ m2 v
size = cnt * sizeof (long);
2 M: M: d$ F! T0 ]+ f
/* Restore the original data before leaving the function.
4 }3 t$ ^- C- T1 p: |
*/
; a) u8 ]0 K- v& x" a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* j; m7 ^/ c4 w& r4 E. [) e/ }' ^$ D
addr = base + cnt;
+ x1 |8 D% u8 z3 d: n
*addr = save[--i];
$ |9 }, n3 O; h- `
}
- J9 y4 V$ D* c. t8 `( k
return (size);
/ e( I; X5 ]8 x: `% O
}
4 [$ r- v, b2 i( s# ]
}
- G& |; P& M n- B% }5 L% Y5 S
+ Q- J; f" A9 @ l% D' u [8 K" Q- C
return (maxsize);
; a: L2 C. K5 Q( t) C
}
& @4 Y- m. Y0 c6 Y3 E# h W' k
int dram_init(void)
( N2 c" }; V( z9 X
{
/ A: I( w: Z9 f
/* dram_init must store complete ramsize in gd->ram_size */
& k) P4 a4 ~) @/ G1 f. B
gd->ram_size = get_ram_size(
0 A5 N& V9 i4 y; {
(void *)CONFIG_SYS_SDRAM_BASE,
* G, d' {0 J1 o8 A& p! g
CONFIG_MAX_RAM_BANK_SIZE);
. T1 |% ~# g% D
return 0;
; L( S d Q& v
}
* F' H( ?4 b( c" x. i
. k+ l7 ]: R3 f2 G
. b& O$ H# U9 G& `# N4 T
) P/ U8 O( J3 I4 \, z, e; N- v
9 x* Q' j/ b1 H8 K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 k" m# [# F* e* M* L
- s4 G% u, m. D) H
# J/ u: i' Y* `* v4 o# j5 ^
7 R7 X9 d( L/ z6 ]$ N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4