嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
& A$ W" y$ G: ^- Y3 \
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 |, W3 A( O+ c4 K2 R2 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' ]8 ?( U( r3 o3 Q6 K( H
3 b9 B: z. S* V" C0 k0 O) ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 l; Y* m3 t- x; @
4 W5 W# D$ v0 @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, P' n+ `& ]4 q' T1 G. f! j* H
/*
$ L d3 B5 D7 D9 G& h/ t
* Check memory range for valid RAM. A simple memory test determines
+ ~% {' p' T% J9 ]
* the actually available RAM size between addresses `base' and
4 L! t( X5 t: s" o
* `base + maxsize'.
, R% k/ O8 o0 S2 U: O9 \
*/
`4 m. K4 f; R, q X/ J, |% f8 K9 @
long get_ram_size(long *base, long maxsize)
5 H' t- c( ~5 y5 ^$ n1 t
{
* s+ N6 i- _* B5 n O$ t$ l
volatile long *addr;
' r: \. ~' y. U; T6 [
long save[32];
: C; \8 B$ |9 n6 p' f0 p' S$ }; E
long cnt;
) C v2 n6 ?* P8 v! x2 K |& w
long val;
$ n& \4 w7 j+ l7 E8 G
long size;
: M8 ?8 ~/ \1 ]# D' `, _0 V4 l
int i = 0;
# _* q0 n2 a. |' L7 i* h M' p# c& |
2 v. N7 E% c( r' B `5 @# j
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" n- n, W9 }0 [. n7 Y N
addr = base + cnt; /* pointer arith! */
* X4 F4 s+ h5 l$ x% ^
sync ();
3 W" x3 I5 L/ a# a8 j1 t
save[i++] = *addr;
# ?7 y. R0 U( ~8 m: @
sync ();
5 Z3 k2 s! z5 |' a" {! s
*addr = ~cnt;
9 }1 e5 m3 k1 G$ v) K% H/ c0 `
}
`( @5 h6 ?7 p' i
2 k8 ^( k' o5 R! }
addr = base;
* j5 o. |' o. p9 m
sync ();
3 F/ t* j! K( L- I4 j" Z
save
= *addr;
& J: R: I; t! ^! a
sync ();
9 c* N: D2 C# C
*addr = 0;
7 s& s2 J/ l* c' ^0 a. J: \) f
6 }/ ~0 Q [4 r9 @$ _* P/ N0 s
sync ();
+ u; Y1 N: t+ H0 u
if ((val = *addr) != 0) {
3 Y3 D! ~: V7 F3 `% j
/* Restore the original data before leaving the function.
& h* y" w3 @' g0 ]$ w2 J6 P
*/
% Y/ z" t6 P& o
sync ();
- @6 o$ T9 T5 ~& b, d
*addr = save
;
6 t! {8 L! z- k% V+ [5 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, I+ b) q2 \- \! {# j
addr = base + cnt;
, E. F0 E, }* Y$ v& q* y
sync ();
5 a) |3 A. a* ]' j% W& b8 M% P( q
*addr = save[--i];
" S+ J: @. h0 @
}
* v) A& A/ D' ^# z
return (0);
) X- Y% {" L' e- G8 t7 a2 L
}
# R0 ~6 }% G% h% }. _- @/ n
`5 m0 d, i/ P- k* E+ R3 D# U5 M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 q( O k/ h& d
addr = base + cnt; /* pointer arith! */
7 f) F! M9 r6 d
val = *addr;
; T2 _ M6 Y" J
*addr = save[--i];
% y- o T3 w4 P' C% N
if (val != ~cnt) {
; M4 B7 e8 U% t0 Z* _
size = cnt * sizeof (long);
' g5 K8 [8 c* t
/* Restore the original data before leaving the function.
" P0 R" ?2 j6 S4 ?7 J, }7 v0 U
*/
6 M, d6 |. f% o! m& N( M4 N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 T: e, E4 R, @; q* l& v( `
addr = base + cnt;
n; L, o5 Z& X6 B
*addr = save[--i];
0 B& _3 D: }* F8 t, e: L9 U
}
7 g0 X3 h, ^) I9 a. b) O. e
return (size);
, Q+ ? p- x6 Q, T" X
}
7 U/ z9 W9 }3 U( K8 w, ?
}
% K) N' c+ g& g; X5 C
6 r) I: S; p. x1 i
return (maxsize);
% z r; K6 w- E9 q" K. E
}
/ d9 H M8 v% m3 [9 W7 @' k
int dram_init(void)
5 {& p6 _( K/ y! s
{
' @5 X* B& V7 A4 |1 k, Z2 _
/* dram_init must store complete ramsize in gd->ram_size */
4 f8 h f" K8 V: X
gd->ram_size = get_ram_size(
6 c2 c. m( Z% W2 [
(void *)CONFIG_SYS_SDRAM_BASE,
' w ~! m$ }2 q$ [. x5 }$ S
CONFIG_MAX_RAM_BANK_SIZE);
# \/ p5 O \; Q, m* {
return 0;
* u# U/ m# z* t- t& Q5 ?; O
}
; Q! z/ J( A, e% Z! G. j
3 Q7 P5 O1 |5 f' J
5 g: c) t# T- D3 Y5 X# K
* A2 A0 R+ h/ C, Y3 N
; l0 K7 l( c, K l. q+ ]2 Y: R
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# q1 f- H6 {* z- F/ A
4 q' T' [9 t w: J# |
! o# n: T+ Y$ X& e! w& m
7 X1 K" ?! k& p/ ?& N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4