嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# S% a; ?* y V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! ]. S2 a; [& k/ t0 C% @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 _# P3 M! A* S6 @! o3 Y" a) v
6 o2 h- _0 L2 v9 n' V. c8 @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: O) c- k* @- {/ f8 e
/ w- h- w' ^1 e+ O2 h- A4 e1 N3 {+ @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: O4 S5 ~6 L/ D6 N9 F
/*
% [4 Y; t: X0 F( N0 E* N7 N
* Check memory range for valid RAM. A simple memory test determines
0 k3 l6 o/ x( A4 |9 T3 U3 \9 s
* the actually available RAM size between addresses `base' and
. r0 i& w8 H) Q7 x2 \/ l
* `base + maxsize'.
2 {5 z# u. ]% `9 r7 }4 G8 d, W
*/
; K, b6 H$ Z5 \
long get_ram_size(long *base, long maxsize)
3 p: p+ m$ w! P8 L6 C/ I
{
! P% y, c. v/ `
volatile long *addr;
6 a' m; b# H7 [6 d
long save[32];
) j4 |5 k% B; [' \8 p+ V
long cnt;
$ R% r% ^8 Y& R" I- F0 h" s* {
long val;
: R6 B' H7 ^, H$ s0 s6 }9 k
long size;
1 {: V# |5 w4 w, ~6 S
int i = 0;
9 Y' z8 O( p2 @7 u9 q- }
4 i/ m4 C3 u1 X8 ?
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) i4 H# F& D) }( N# N
addr = base + cnt; /* pointer arith! */
" r. j3 _$ _9 A' K! q% g* Z
sync ();
# e6 q3 H8 ^: Q/ f
save[i++] = *addr;
- l- e0 Q. ]8 o" d( Z
sync ();
8 A) m7 j2 E! m+ }) B8 \$ ?
*addr = ~cnt;
! B6 F& K2 ^6 R, A
}
. Q6 F" r; K, t6 t% n+ m
. l9 A1 ^9 x3 K
addr = base;
. E: p4 }( w( [! f- t
sync ();
' _; d; i' F2 ` O7 V% \# K8 A
save
= *addr;
6 E* G8 ?' B/ H0 v" K _
sync ();
. \4 _% T9 s$ D! K5 A
*addr = 0;
4 A1 B: {6 ?7 @4 Y
9 P( }6 m% N( r9 Q9 b* f! Q$ Z, K: |' E
sync ();
' R4 D) n) h) @ L3 C2 M8 D$ n+ n* j
if ((val = *addr) != 0) {
, C# Y' n# c. H$ Q7 [' D) `8 p6 s
/* Restore the original data before leaving the function.
# \5 g' s! o7 o& |# k8 A0 g( a U% H
*/
, l& F4 s' y. D$ k1 K
sync ();
2 b# G/ D( b" x% X, x L* t
*addr = save
;
: b5 u, C( m6 f% Q/ b. Y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' r. C$ _& @9 {# |' Z& F5 p9 W) m+ c
addr = base + cnt;
8 ]* p9 B: T" k
sync ();
+ ]0 T" r3 @7 |3 j" K. e4 q* k
*addr = save[--i];
& j, e O9 L: v" U4 j" o
}
t. y7 P+ X m% ^9 |
return (0);
4 n* X+ w7 A' D$ P) ~% B9 k3 H% I$ ?
}
5 L4 c" z4 O6 u$ V/ u: q! J, q2 B
( {, g0 O* `8 H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& B' Z% O: k; \2 K3 l7 Z7 m# f
addr = base + cnt; /* pointer arith! */
* A, z% ^* K% J
val = *addr;
4 u1 x) H: y8 w3 `4 C" L
*addr = save[--i];
) k! J; }2 J! u4 J. s3 E
if (val != ~cnt) {
/ j. f5 G! B' G$ d5 N
size = cnt * sizeof (long);
$ C' [( |2 c1 @ n6 a9 G
/* Restore the original data before leaving the function.
$ m8 m* C& d/ C5 T' `5 J9 O
*/
9 \' v# A. @, `; H( M; b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 P. [! ^2 \; w
addr = base + cnt;
) v. w: d3 t, U% o- q5 H5 H
*addr = save[--i];
; W F( @0 n/ h9 X1 Q6 T
}
, Y+ Z5 h3 D. f/ o$ Q
return (size);
3 W- P/ S- A; K/ T" Y
}
5 d1 f0 J+ }2 i3 {, u3 x
}
6 g1 Y( [, c1 ]) W) {8 p
6 c1 [2 N# O6 E$ X* z; D& @
return (maxsize);
5 ^" z+ j" A, R3 U1 X) M
}
5 b- d# e, R; I+ T& J, |
int dram_init(void)
$ v s4 w O: a* ]0 m( Z
{
& q1 ]& O- q! \, h' w% N
/* dram_init must store complete ramsize in gd->ram_size */
: l- a) O& J0 d! R" [* E2 C. W+ }
gd->ram_size = get_ram_size(
. d4 c) S: F w7 K
(void *)CONFIG_SYS_SDRAM_BASE,
" b3 x8 i/ B% ^
CONFIG_MAX_RAM_BANK_SIZE);
8 X# g7 L* {, B' y% w
return 0;
$ C# ?9 J/ B7 M5 S7 ?5 W" z
}
0 w' ]" A7 N: T! e4 S! ~
; C4 v" w* X) G" t- ?
3 k9 I0 E6 }" k9 X" [! i* ~1 A/ }/ L
6 Z: F. G% H* i
* h7 A, E. o# n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" J& ]4 M( f* W1 e
~6 }( ]! C/ @% A, a
" U7 D+ X. `* a8 v" l& L1 I, \) ?$ S
0 |/ W Q1 ]- t+ a- I; Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4