嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ ?1 f) ^0 c5 R! D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 t/ N9 f5 L$ M6 S0 n# X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' {% c0 b+ N5 @" Y
% Y. U$ ~& B$ p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* M0 \: q9 G# d) p
$ _8 a! l6 [, J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% [2 i* B' W9 G" i8 D' H' x Z
/*
a6 h- j8 m, Y1 \. P* _) A
* Check memory range for valid RAM. A simple memory test determines
5 u, `9 e- T5 `9 n# ]. n
* the actually available RAM size between addresses `base' and
5 d6 m; q6 O) ^$ k
* `base + maxsize'.
, y+ U4 i; Z4 F& g) O
*/
- z: v: q* o5 |& L9 l# j" B. x1 J% D
long get_ram_size(long *base, long maxsize)
. Y6 t! W: C7 {
{
# h w! x. L: K8 Z
volatile long *addr;
5 X0 y! V. r- f4 J/ ]5 J' S0 c: C
long save[32];
- ~' p1 s- N9 ?8 }; v
long cnt;
6 b& ~% B6 S! U0 L5 j" U
long val;
* i% z, K# o- r( m3 h; Q0 F
long size;
% t4 K; ^% c! A' D
int i = 0;
z. v6 Y, p/ |5 L8 \0 o$ [
: O% G: r |! [6 D8 ^% @+ O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! @& J" q0 @5 B% r' i
addr = base + cnt; /* pointer arith! */
+ v9 P7 P6 G3 v7 p
sync ();
5 T% r9 a- V: m' o2 p
save[i++] = *addr;
7 ]4 u9 n8 q+ m
sync ();
6 \% ^* T j5 z8 ` N
*addr = ~cnt;
+ J5 ?( M6 f0 c# _
}
$ n( A+ e( Y- j
9 R% H3 F; v4 w. L' O9 L+ N" T
addr = base;
. t! d3 D$ c3 O4 R4 ]0 ]
sync ();
6 _$ n- P2 C# }
save
= *addr;
1 v: U* _9 s4 K6 |/ W
sync ();
% n8 ?( v/ @+ {# B" n$ [
*addr = 0;
; g7 y6 a+ x2 J; F# l) |
3 A- @+ x# B3 X% ^% @9 D
sync ();
9 m* k: @+ W" F& G3 P/ H% d9 N
if ((val = *addr) != 0) {
! s- f' j6 s) l- c I4 D( P
/* Restore the original data before leaving the function.
/ V3 R; x$ a0 X, U0 J x, Y" ~
*/
. s+ Y% P3 G" d
sync ();
* U: N% Q! c7 V. m/ V, a6 h5 C
*addr = save
;
) k: t7 n9 }" r* ?& {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) |5 W1 R$ O$ s, J' b
addr = base + cnt;
8 ]( M) g! g4 w4 v
sync ();
0 Y m0 r* G: v1 {- H
*addr = save[--i];
1 e6 g; q) q6 Y% m% I, F; D
}
g+ B2 y9 e: { l
return (0);
) s4 ^5 d R! X7 E2 l p
}
) v/ _* c) ]! Q
4 ]2 \7 J/ ?5 @1 i R7 p, Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! K1 q( e" \8 P) j$ o M8 f' n
addr = base + cnt; /* pointer arith! */
" S; n) c6 J4 e( b& y/ A
val = *addr;
# J4 W1 S; C/ c9 N s
*addr = save[--i];
: Z: M$ s4 ?; H6 d) ]. x; a3 _2 {! Y
if (val != ~cnt) {
2 b+ i8 ^- V5 z6 K$ L
size = cnt * sizeof (long);
% R2 ?$ {9 ?+ f4 f3 g$ n
/* Restore the original data before leaving the function.
9 G/ K6 d% b8 N+ [/ V9 P
*/
- Q, B+ e/ L1 b: p& c, y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ` `; n1 e O
addr = base + cnt;
1 x B) m- x) d) L O# F+ L
*addr = save[--i];
( P/ G/ i( u% M- ?
}
# i3 R; v; Z( ^% Z6 }1 f
return (size);
5 W1 c, S$ [7 |/ X8 h# X; s
}
2 G1 L, R$ B2 _1 O8 C9 j7 I
}
1 |1 v7 w% d) l
3 z/ s+ { F) q5 L
return (maxsize);
% j) ^: C, D4 ?4 G
}
3 ?# H: n/ `3 M/ u/ Z9 A
int dram_init(void)
6 c/ I K0 T3 T# |
{
6 b t; V: l# ]
/* dram_init must store complete ramsize in gd->ram_size */
& q+ A6 ^: o' y. I H |0 p7 C
gd->ram_size = get_ram_size(
2 O1 G' I2 f+ j: {! ^ h" q
(void *)CONFIG_SYS_SDRAM_BASE,
; `9 W v( ]/ a2 Y+ y- I9 j
CONFIG_MAX_RAM_BANK_SIZE);
/ Q, a/ [ h6 N* v7 [* W. b, o1 A
return 0;
4 b! W2 }2 A0 y$ t8 v `3 K4 U
}
6 s9 j# ^# d7 J; U& [$ k
+ Q6 A; S7 B4 O0 @. l
3 T* a" q2 r: E9 g# x
: a% w7 U% X9 E$ _8 M
* h: h9 V- ~/ {8 Y2 L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 `# |! |' G I; u) w( ?
; d0 A" b6 K. z0 l0 k r
! a: s+ T0 B5 h" o
5 g: N( y( h; q2 R4 e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4