嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 o6 x2 O/ G5 l1 j5 R2 _6 C; Q9 {+ @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# X/ h. R4 u+ [; c/ j9 Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# f( i. R" x+ y# d. Z
/ Y2 o5 T/ U9 {1 D& r s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 p4 F* U9 Z) g6 q
0 T3 }. S: D% o3 A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 i W+ L( x6 Y- t! J% X9 ]; ]
/*
( s# A+ U' d; |
* Check memory range for valid RAM. A simple memory test determines
* H- _+ d% f& u, S2 @
* the actually available RAM size between addresses `base' and
* U+ u3 q m: I z8 p
* `base + maxsize'.
, p) L- }% f# Z, x2 k+ P
*/
7 c* k/ u# X- F* L/ J
long get_ram_size(long *base, long maxsize)
& ~8 ~9 F7 j; o/ l+ a
{
; n# |1 R; M, s. z
volatile long *addr;
, l: H- h$ n0 E' d9 `! K; f$ x1 w
long save[32];
' G# q \8 C/ D' R& X8 d
long cnt;
w) a K" b# o, N% n0 L6 }
long val;
' t4 e+ O U( O6 K' n7 u: ?
long size;
, s% n4 a0 J1 `$ A6 B$ @
int i = 0;
( ~: g4 ~" D% K, V# H; M
* B- h1 U6 h1 `2 h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 T) I, A" A# }$ @
addr = base + cnt; /* pointer arith! */
+ J! @; ?$ R& Y( [8 J6 V
sync ();
/ I7 e( N9 N0 Y: `' W
save[i++] = *addr;
& T8 d# ~, @2 x- b3 j
sync ();
1 k1 o9 |6 |* f( L- ?: s
*addr = ~cnt;
5 n2 Q2 U) Y" Z9 b
}
d" B/ [& [% D! @6 I) o8 Y2 F/ F C
" q* q5 u4 p3 {" v* V( Y
addr = base;
8 ], ^" W+ b. E/ @' B( d9 [; g$ V
sync ();
8 B" S+ D. b* Y0 A, v
save
= *addr;
2 h+ {+ ^" J* P# N
sync ();
* Y3 J9 ~/ @, } B& N3 x6 @/ ^
*addr = 0;
0 r; _# ~: \: M$ ?& T
+ U) Y; a( x5 u1 Y: ~: O+ ?. q
sync ();
% y2 ^" Y. L" K9 w6 L
if ((val = *addr) != 0) {
9 G: X- X! E" h" L
/* Restore the original data before leaving the function.
. L9 k8 i) e. c Y4 `
*/
* u; c, ~) Y9 y
sync ();
7 [) H2 [; \: u4 n- ^
*addr = save
;
4 A8 Q# y* z( g( e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 Q/ B6 @/ w' h: W+ b( t
addr = base + cnt;
8 k6 M" a' t) ` g2 q
sync ();
8 k0 x5 b1 K- @# ] ^3 C& j- B
*addr = save[--i];
+ g( U% [# m' U4 \: s
}
' d0 m. M( Z) G7 s9 s* Y
return (0);
3 G' ^: c# x: M/ `5 b" i5 k: c
}
$ V; v* [7 W* l
# z) T5 J% \! q. c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. w) l0 {0 R K: c- q# ?6 n
addr = base + cnt; /* pointer arith! */
}% U# E2 o6 q1 l5 N4 B4 b' ~
val = *addr;
+ y* d6 J X3 s7 u& F! t
*addr = save[--i];
, p/ R+ Q; @/ T, }" p% J2 k% ~/ S
if (val != ~cnt) {
1 i: w' x+ }0 Z2 n" D$ \- L, }
size = cnt * sizeof (long);
e1 v+ K3 c6 p! a' ]2 R" C$ a
/* Restore the original data before leaving the function.
- F) m' d0 O6 Q# ]; i( |& t
*/
* p( V4 @1 M% i( d! i" o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. n5 n- F4 Y; O: o% \
addr = base + cnt;
3 c! z: [$ b6 S4 s5 z9 Q5 ]: y
*addr = save[--i];
3 E( M6 f8 l+ [" I7 E# ~
}
$ O; E2 ~4 Y( `! @) u0 R* U
return (size);
0 t. U! y5 |- Q: P" k! c- f% N( p# e
}
8 o, t: H2 }" H
}
/ W- q5 r x, P2 x. z
0 f3 J" A: ~! m. L# ^: q4 r
return (maxsize);
4 E/ _: i" O: P" I9 G* q( D
}
. |0 w- D' y3 [. r; s, a0 I
int dram_init(void)
8 e7 D+ J3 }% T+ c; M
{
- k% i+ x1 a/ f4 H" z5 a% a
/* dram_init must store complete ramsize in gd->ram_size */
: r6 L# B+ T1 ^. X
gd->ram_size = get_ram_size(
# y Q9 p, q5 @
(void *)CONFIG_SYS_SDRAM_BASE,
# E1 y; ^1 M& y- G2 c* E) [
CONFIG_MAX_RAM_BANK_SIZE);
$ f5 K- D6 W3 i8 b) t& U
return 0;
W6 S$ ~: f7 {) O
}
( |7 r% y# o) [' q: A) E/ c* Y. ~
3 `( \- T- |" ^
! b9 H/ z2 e& i7 A8 f2 F% v
9 i9 z# J- a+ [7 W
' y+ q2 R! \% \% V% O7 ~3 O6 F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 E9 g5 \2 t( E$ a5 [: [! ^ f
9 O6 q1 g T \1 h
0 O3 D4 c/ r8 U
9 S- G0 X3 Y1 c( G! v8 }: V+ }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4