嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ x! w" |/ e0 d7 S
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 F; k* s. y. N( m1 L g& F- }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 _0 B; @3 g+ A0 I# m
8 r z1 G% ~. B0 t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% O3 H" W& E5 [+ t8 k& }8 x
' f6 M0 C% A* N0 ]. P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, t/ N H& o' } ~- C
/*
! K; k" K0 s. R5 \& t8 ?+ _
* Check memory range for valid RAM. A simple memory test determines
: P( ]! C2 p) Q& n# U
* the actually available RAM size between addresses `base' and
0 E: E0 `( i5 a5 J* t$ T0 P! T4 p. o
* `base + maxsize'.
! \# ^2 n- j! e1 w) d; r
*/
% T# _8 t+ @" I9 B2 }9 F
long get_ram_size(long *base, long maxsize)
2 G" T! w$ S0 O
{
( ?' f$ x, O4 a4 U% }/ G* m7 W
volatile long *addr;
! l* W4 i9 X5 X: G3 S/ U
long save[32];
9 q9 R% R1 N" t& A+ e% ?' o
long cnt;
1 [! ^- i- Q8 y4 H3 U
long val;
1 K" s6 e6 }0 C1 A
long size;
# M' |8 c1 I7 u' I
int i = 0;
/ C; Q! Z, H$ L& Y
. O! ^/ } m3 w$ k9 c% }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- `* ~+ a1 W: s i& X2 B3 d, ]
addr = base + cnt; /* pointer arith! */
- H! M! \. l: W- e" o5 {6 T
sync ();
* p' J" t# O' U; D A: U8 I/ K
save[i++] = *addr;
$ o- z$ Y$ }* U' _
sync ();
, o2 q. q( i" {6 O7 u& p
*addr = ~cnt;
/ i# ?3 Z& {1 H! y. t
}
) t9 S# S+ l. O% l+ P, W
' S4 Q! L, }) z$ x; `: a/ B
addr = base;
- B2 n$ b6 J9 e; v
sync ();
1 m. w; M/ Z* S6 e& H2 H
save
= *addr;
- y: r4 I- O. c% F8 P
sync ();
3 @# i7 V4 ~$ n3 [& z' K
*addr = 0;
6 \2 \( A& b: U+ K: T
( a% m0 }5 z) j$ B$ N
sync ();
0 y! N8 ~7 Z \# w' g0 r2 r' U
if ((val = *addr) != 0) {
5 s; v2 `5 U3 p7 r
/* Restore the original data before leaving the function.
! p8 ^3 M4 E3 `% k5 c
*/
2 S. b7 S& Z# d1 Z3 x+ N: M( w. g6 F! |
sync ();
: h# F0 u+ ]- H, Q
*addr = save
;
/ ?5 x* l: J6 J7 a3 i; m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ A$ ^' M2 p( l9 U6 K0 p' c
addr = base + cnt;
! ?" M/ w( H& I _& B7 o; B
sync ();
/ u8 K3 `! @- k$ o
*addr = save[--i];
' t5 H N4 q8 A: T
}
$ h7 X; N6 [8 W0 e5 _. d4 R
return (0);
: I5 m5 _, ?) G! `4 E; G" i
}
7 Z6 E, y$ u) o& j
7 B' `8 W4 m& e2 y: m" X! f! u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% N0 V8 U3 m- C- N! w( P1 Z% ~
addr = base + cnt; /* pointer arith! */
: c; Z4 E7 W7 [( Q! c* G$ A
val = *addr;
4 Y7 H/ N( P( D$ X ]7 X, l
*addr = save[--i];
1 F& E4 b3 ?3 m8 j
if (val != ~cnt) {
* u" V- f: q: f4 e: v
size = cnt * sizeof (long);
" L7 g5 U/ z* {; n/ V; x
/* Restore the original data before leaving the function.
' x8 ?5 r; [* I/ }9 I8 R- T
*/
+ J) O* `. r6 N' z' T4 n m- E; B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, ^6 l6 u" A" p
addr = base + cnt;
4 _9 ?' G; J4 N4 T5 j) D
*addr = save[--i];
) r# u- z/ o: z7 z0 F" G" n. T
}
9 ]# v6 k. }+ F1 z& b
return (size);
/ O. V& D% i1 d9 t9 H" `
}
; x+ K; `! X M8 y: D5 T
}
* h) W9 U' e0 c8 }
, a/ u# _$ e$ ]" R* F& i1 e& F
return (maxsize);
# k6 o. k- T( O4 C& X
}
) w# w( f% j, B' `# `6 p. K
int dram_init(void)
3 _; ]/ m/ a- a1 ^' K
{
; I6 \8 r4 C4 ~ b. S
/* dram_init must store complete ramsize in gd->ram_size */
) n7 g5 S1 B' e# U
gd->ram_size = get_ram_size(
/ a" T1 ~& m" ~: b. o$ B
(void *)CONFIG_SYS_SDRAM_BASE,
; C; T% B( a0 e
CONFIG_MAX_RAM_BANK_SIZE);
, g# V% b) x# z) v: o y/ W' w
return 0;
3 J( x, ~. s/ w ~4 I
}
: g5 Z# F! W# h4 |: c# B7 s' r6 e
* e2 r5 e9 O/ V0 k
1 D% ^" Q7 j, @) S
" Y7 w- v9 ?! q* l1 w' n! L
" _8 A$ Y I* @. l5 p. {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& P; S g5 X, b
3 k9 o4 Q0 h* R
4 E7 W' T, ~0 c7 x3 t% ]
4 ~% {! e! Y9 N; `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4