嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; A4 t5 n/ [* e. A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 w# H7 K0 H* i; O8 U2 x) N; l/ k! T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& V8 `0 r1 m4 X; z# M# j" s8 S1 [
1 o' ?& \" n* `6 z: a2 t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 F. m. X+ B5 w
6 \) g* z9 m! ~/ \( S- C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 F1 W9 C# m1 K# v* D
/*
; u8 h ]+ N+ ^2 f. { N
* Check memory range for valid RAM. A simple memory test determines
( s' w2 Z) w: H- }6 P$ O
* the actually available RAM size between addresses `base' and
6 E3 i+ i3 k1 q1 \5 U- K* t' H: I/ K
* `base + maxsize'.
4 r1 l' ^& q# q$ ^
*/
6 A* w& T7 J9 `2 J( G: f
long get_ram_size(long *base, long maxsize)
4 F( v8 K5 I5 i* D
{
. A- P, H( r# d, b: P: M! {
volatile long *addr;
( o6 ~/ A, d ] h6 {
long save[32];
! ~. O7 q5 S" T5 G. ^
long cnt;
9 W1 T, l2 Q9 w- B' p7 i5 Y1 _) W
long val;
/ k7 b: w' H, V# j+ q' a
long size;
\. C$ |; M% m% U) L
int i = 0;
+ J+ D. @" ?4 z2 K
0 h- H' r" P8 A& ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' X/ i( k- r/ Y. J7 v
addr = base + cnt; /* pointer arith! */
* Z! {9 |2 C) f- {& k" K
sync ();
- w5 G2 }/ f- \' J8 y, t
save[i++] = *addr;
- i( X0 ]% E. J5 q
sync ();
, g% l4 A7 z7 U M A6 P
*addr = ~cnt;
# B- g# @3 T7 h' V
}
2 s$ ?# i6 o, B; Q
- Z- G% T( q0 f0 G6 }6 n2 C8 a: g7 B- Y5 X
addr = base;
1 m! F- I9 M! O2 e& P4 h
sync ();
; |) y- \, J8 }6 y& t4 @5 n2 @: j
save
= *addr;
- h' X& K* E- }9 K4 ^/ f
sync ();
. r6 h4 Z$ U3 o
*addr = 0;
' s: p' A4 Y( j- k
8 l+ C, D1 w0 _; e& c0 {
sync ();
1 l1 Q9 f, P# c2 [
if ((val = *addr) != 0) {
( D1 d% ?& z# W
/* Restore the original data before leaving the function.
* Q# [9 C1 C/ o) l. L* F
*/
% W ^: K7 q# L# l3 L8 q& h$ i
sync ();
4 i* m0 E, g1 u! w A, P
*addr = save
;
k8 X$ V; ^4 d) Z$ Y8 h% n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 V! w* w! E3 G9 ]2 G
addr = base + cnt;
: t/ t8 m* c5 ?6 K7 W) j: V
sync ();
6 d$ S; n3 B1 L' a) c+ r* Y( R1 A
*addr = save[--i];
: J& X' s: n, V* r, x! d
}
' `0 Z" K2 }- |! ~# [/ [
return (0);
5 C& q( A/ D @$ P7 E. ?+ b; W. Z4 t. |
}
0 I8 m1 |. W9 O C! @2 N
0 \7 |% J2 L6 Q. f' o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 {0 W% E- d l- ?& B, j0 N
addr = base + cnt; /* pointer arith! */
7 ]% L* q7 o0 r( |: D0 [
val = *addr;
) }' `6 {' g: S: H0 ~) M
*addr = save[--i];
! m- R+ ]1 G8 P& n1 g
if (val != ~cnt) {
& h6 s8 A; l' N- m9 G
size = cnt * sizeof (long);
. _, z# v/ I8 e9 {' W( q" B
/* Restore the original data before leaving the function.
" k3 ~2 a1 g. L$ E8 S
*/
0 Z# Q- s& ]* W- i
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
V0 _( o, C8 t M. }; T
addr = base + cnt;
- G7 j1 q& J" q" i" I
*addr = save[--i];
# o) n4 c9 V5 [1 q- J
}
1 S9 d+ g; o9 b& {) }* K/ V
return (size);
+ O) @' j7 ?1 N1 |4 P% c# P" m
}
$ b& D+ ~, \3 d2 y1 N9 u; J
}
9 G6 f5 Y: V& E+ N
* H8 `, y6 F( V' A6 T( x
return (maxsize);
5 k) u& n* g {; u( _5 m- ^
}
* ?; y5 V; Y4 x. V8 Y
int dram_init(void)
% J4 A# E3 x6 M. Q3 {/ k9 P3 N
{
$ h c! J3 t* a1 R3 a; N
/* dram_init must store complete ramsize in gd->ram_size */
2 }: O6 E( H5 ~! B+ }# ]3 ^* Q
gd->ram_size = get_ram_size(
. |5 N9 C# D1 A! _6 l: a: K
(void *)CONFIG_SYS_SDRAM_BASE,
: O1 }* I% n8 m" b4 E1 g/ x
CONFIG_MAX_RAM_BANK_SIZE);
6 D& d/ X6 U# S4 z7 c* F& T
return 0;
- U1 Z- v- w+ a4 M0 E& L# B3 \
}
4 Z) b/ G5 a7 o8 w. B2 J3 v' z
/ T3 x& z* x) L6 U
' e+ J2 k0 d1 I
1 W9 w$ e& V8 C; B
' i) j& n h; I3 T* @$ y( D4 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 j+ W. M1 N) b% M& p3 ?
' }; m) l V2 V3 w& `% ], z- U
c0 T3 G, E8 `
, x- ?2 q6 R. \8 E2 x" |1 H, R5 r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4