嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 L F) `5 J/ f; q3 B ^% J
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: J1 n# g- K" | m; p' D0 u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: O& x3 u% N) @0 {
: a7 U1 g7 g. ?1 Y4 @8 Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. ]& J5 E: H6 Z' j) }
" M3 m* m# a1 Q5 J+ O- H/ ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 X3 k* x3 w- Y# B, Y w H& N
/*
9 a; v( y/ B1 r
* Check memory range for valid RAM. A simple memory test determines
0 A, p0 I# M, m+ L' H" X
* the actually available RAM size between addresses `base' and
. k) N4 r; O) M) V5 v) k/ y
* `base + maxsize'.
( U8 W# a3 M( m" J4 Y( `) V7 H
*/
4 b" I* _; W3 C Y+ z/ [( ~$ s
long get_ram_size(long *base, long maxsize)
* }3 r) P( a( o) Z
{
2 b, J, S: L4 }5 G, W; j3 O
volatile long *addr;
, p0 L' @' Z7 A h' g! U7 ^7 B" `
long save[32];
3 e0 T! c& d$ f7 ^( K' B
long cnt;
: ?5 f8 h5 r N$ z% R
long val;
; m, u' H7 N! v4 K6 w
long size;
! ?4 N& v" ]' m( `6 \) Q8 j2 x, s
int i = 0;
2 a. M" X" ?) b! V9 e! b* _
w6 n/ k+ w! h/ `& u6 w" C3 Q/ F( c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ q' Y0 a$ B( d/ U' A2 p4 C% B3 s" c
addr = base + cnt; /* pointer arith! */
0 l2 _/ u6 o1 V
sync ();
& v# P- G) y/ z3 `0 m
save[i++] = *addr;
7 i; B) p; o9 {5 @
sync ();
( w9 H P$ ]+ R; f, P% @0 p+ K
*addr = ~cnt;
7 ~2 P6 j& Y7 o3 Y
}
- H7 K% F/ |$ g% ?+ }4 B
% d" b1 m _- t) L
addr = base;
8 {4 a z& M+ ^- \
sync ();
( [: H0 T2 ]% Z
save
= *addr;
+ W# B3 d9 {. V! i* C; \
sync ();
6 q# G! w8 Z1 P4 n) E
*addr = 0;
* A. B5 m7 T3 ?7 @+ M
' @2 @0 i* b3 ^- k
sync ();
& R c# E; }, C u7 I
if ((val = *addr) != 0) {
/ c/ v6 {9 v1 v- C, V
/* Restore the original data before leaving the function.
# u; f. Z& _( S& O# u
*/
6 k% V' o. E V0 [9 d0 t
sync ();
+ |; j0 x9 J, O0 d+ f0 X) u ~
*addr = save
;
' a1 | d6 H; {0 }2 o0 `( O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 p) N. v+ e1 Q( l
addr = base + cnt;
& x+ u) |* o) u! ]$ z9 a
sync ();
( H8 T5 K( N+ C1 Q% B
*addr = save[--i];
Z) p' N# Z4 v' N9 t+ [; n4 `
}
! Z5 d* t( G9 O7 L
return (0);
% o! l) `2 J2 F
}
- f/ n3 H8 g( l" L
5 L4 k8 |& _8 u5 t( b8 z' A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ d d7 V( I, x& w' c
addr = base + cnt; /* pointer arith! */
6 ~2 I `; l, z. M2 P
val = *addr;
- Y, w- h& K" n' i" I
*addr = save[--i];
( [0 S& l1 A* @4 z
if (val != ~cnt) {
0 u. l: k& v$ [8 ~7 t! {3 _
size = cnt * sizeof (long);
9 l; [* i. {" }* T7 i; ^8 k
/* Restore the original data before leaving the function.
/ t/ u3 S! m8 `6 u6 i
*/
: ^$ @0 ^5 E' e9 P# I% h! m$ O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 w6 }8 N9 N7 h1 q) R; [
addr = base + cnt;
3 G4 c6 n) d# }; K
*addr = save[--i];
1 u. A5 c3 E) ^8 k, j
}
% i8 R& }/ _; K' l
return (size);
& A! b5 A' J9 n4 o. g
}
' c8 C! H6 p( e B
}
* S/ v6 X* N/ F0 Q ~$ R
# q7 @& r. v9 H' `; M/ x
return (maxsize);
7 d' t$ A9 j2 @/ {! m
}
5 M' S {8 @# X7 [
int dram_init(void)
, z1 L" I e9 L! a, H
{
) B5 }. G; N: L& }
/* dram_init must store complete ramsize in gd->ram_size */
: ?( f' C F5 {% G
gd->ram_size = get_ram_size(
6 C$ y9 Z( R+ |' J" \
(void *)CONFIG_SYS_SDRAM_BASE,
! w) j3 X( o$ y% i
CONFIG_MAX_RAM_BANK_SIZE);
; o; U, g7 Q+ ?7 J- [$ H
return 0;
9 _# w7 J5 m* k; i
}
% j+ I$ B5 S" y1 S- T7 Q' q( D' V
$ s4 Y- |' D+ L2 B8 C/ l8 s
$ j+ s, x4 d" `$ |1 {
9 r, ?4 e. D$ l& K8 V6 ]7 y7 J( T) r
4 n! [' y2 o6 t5 d2 c" K2 K* G
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: X4 x+ v+ y+ s
$ A& D# B6 ?# u
?* _0 B/ E& X& s& M5 o% O( q2 i
! m8 T8 t2 _# v* e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4