嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
P$ \4 n7 p9 w; `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& h l* A% w& v. n$ s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" q2 j1 U7 }% E0 l9 v
; R9 u1 X+ |6 A0 A- O9 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- n) e7 Y w: M2 @- Z5 z# L9 B
& P$ z6 G( Q+ d/ }: r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% E( @! p7 M9 x7 t! m9 q( ^ }
/*
( U( E! x$ {( M2 S
* Check memory range for valid RAM. A simple memory test determines
# A) @8 ^$ d: ]& n' B7 q
* the actually available RAM size between addresses `base' and
/ l" v/ S/ W& J4 _& C
* `base + maxsize'.
, c7 w6 _, X9 G2 a# }+ K9 b8 ]$ |" |- E
*/
. i( Q2 O: M7 C6 h
long get_ram_size(long *base, long maxsize)
1 c9 U! @7 @2 T8 d2 ^
{
( Q3 v, P+ U2 Q) a
volatile long *addr;
" ^$ D$ C9 U8 ^! C8 S2 o U
long save[32];
n2 f4 {8 r/ Q" i% ~, b0 N: ~3 a
long cnt;
6 ?2 E4 c1 `9 y7 K( p: V3 k
long val;
& T) s( x( U+ n D. b# H6 b
long size;
% n5 @6 n1 |% L. Q& r
int i = 0;
' c; q2 j+ z$ k- Z7 D
5 A; A+ P+ E* |) i6 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 s4 C8 W" P2 N- k. {
addr = base + cnt; /* pointer arith! */
0 C0 I9 t N" T
sync ();
+ i5 m& x3 c* y. E3 P; ~( F) a* W
save[i++] = *addr;
3 K. Y/ u: s4 M2 n4 ^8 m' x
sync ();
: B' A& j& P) n" Q' B6 A( d' {) Y
*addr = ~cnt;
" G, P6 X0 v. O. A! ^2 W4 j
}
: S+ u* F9 X4 n+ ?' X8 a( D
6 o8 I/ p- T. n. P: b
addr = base;
: Y' l$ ~& z4 }; p E, W+ b8 u) P
sync ();
5 G$ C6 T: P& | V4 c% d
save
= *addr;
% N) ^" x. Q1 t( R# l0 k1 v i3 X7 v
sync ();
, ?1 Q$ Y5 o& G7 x/ {
*addr = 0;
" d8 ]8 O, U7 T1 ?- h
2 j6 C+ {6 m3 h, ~: |6 q; p
sync ();
$ \2 E9 p. x A) c# l7 u3 J: i% O
if ((val = *addr) != 0) {
6 f- {* }: g' k& @9 L! A
/* Restore the original data before leaving the function.
: l9 o' X/ n$ j, q) ~. m5 e
*/
2 S0 }; [7 j. I, A3 q
sync ();
1 X' D# m8 |4 X0 \2 ^0 P2 h( G
*addr = save
;
5 ^5 q. a: c i Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
t: Z* L9 v" Z4 k$ D8 S
addr = base + cnt;
[& M3 M2 |1 ^- m# c2 h' f8 n
sync ();
/ b2 E0 c+ h+ m
*addr = save[--i];
6 q& g, A# j. m( K% V1 r( |9 I; V- C
}
+ L" p% n$ I3 @5 W7 a7 u4 K. N' _
return (0);
& M9 z8 D4 m; R) D6 Z; J5 ~0 u
}
) | t4 c# M- C U( m
3 C y+ P( p+ c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 f* x' B7 a& p
addr = base + cnt; /* pointer arith! */
# M" Q6 y- s7 v4 o1 V
val = *addr;
: O) |& P' c0 ^% g% N- e) h3 V3 G1 X
*addr = save[--i];
5 ~0 n0 s% E; F6 P! j X
if (val != ~cnt) {
. [& j) }" e" a! b- E* |) l
size = cnt * sizeof (long);
6 q" X3 ]# ]$ o
/* Restore the original data before leaving the function.
1 G1 ~/ H+ i% R9 j! H+ R+ k+ `
*/
- ~2 M s4 m5 s# @5 D# T4 G3 r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 z3 T3 q; p& k: t1 u6 o f7 E
addr = base + cnt;
4 k8 e# F3 a3 h. z( o! Y) \% B
*addr = save[--i];
" V: `2 o) t6 W$ o
}
7 O, G. m: b2 l9 |$ v$ \
return (size);
9 G( k4 @) f4 c7 A
}
. K( Y/ c& N# ~: K% d% n
}
: | _; k$ W+ |) C
5 j B! S. P$ p8 s) u! ?
return (maxsize);
: Z/ Q9 n& a3 r& r
}
" }1 P! m( d, m0 Q/ u" Z
int dram_init(void)
: [* o3 N/ [- @
{
/ G' @1 v' ^4 l$ ~
/* dram_init must store complete ramsize in gd->ram_size */
u; e: S' E1 d! W! } I
gd->ram_size = get_ram_size(
1 }4 n& V% _3 X; c
(void *)CONFIG_SYS_SDRAM_BASE,
l% t" B$ X1 C
CONFIG_MAX_RAM_BANK_SIZE);
8 m' I# d: P# U: {' v5 M5 A2 `
return 0;
# Y! L! e, |% }% {7 ?! i+ Q
}
/ k' [1 f$ [( N/ g& v% A- x
2 J' Y4 W* f' H2 P9 h$ U
: `, d! G' r7 u+ m+ R) O
$ p" O; O, V3 a( z
. V( S |/ _2 e- s8 S' `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% m: J- z+ H5 z) F5 }# W7 C! D, D
+ S9 d: ~2 p7 {! n3 ]
5 i X4 S# S6 R) A: N, U
& Q1 q! {2 y+ N: g4 r8 h5 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4