嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 \3 {" b4 }' a: L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& z! R, f% W+ c3 I; f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* r) {9 S& K3 D$ {/ ^
! e2 Y/ G9 W. @' g: E2 I* Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! {# d9 V6 D. w1 P
6 ]8 W$ B. I6 P8 Z! A6 J. r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
]( V7 O0 w( M- A6 Z; y5 f
/*
5 ]: c3 e6 h9 S- n& S
* Check memory range for valid RAM. A simple memory test determines
* K1 R9 l- B! E6 |5 |
* the actually available RAM size between addresses `base' and
; O: P0 m4 b6 q
* `base + maxsize'.
1 d7 C" h& S) L* v5 i
*/
' Q, [' z1 V' e
long get_ram_size(long *base, long maxsize)
( q: N6 L# w: F8 L1 U- ], h
{
- X/ ^$ ]& ~" w
volatile long *addr;
- g8 i' F, U" i5 D2 [8 N; E! C
long save[32];
1 a$ o, Q9 V- ^% g
long cnt;
% c& x; \5 q1 S8 u1 ]
long val;
9 h$ n! }' h$ |5 j7 O
long size;
8 p1 u2 s) b& C0 l
int i = 0;
# l1 N R" ?) }) k
1 y9 e0 [+ O) {; V* ^) c7 E: `6 Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( j: P5 K$ z$ K& Q" R6 G
addr = base + cnt; /* pointer arith! */
; A4 F" x8 H- }8 \
sync ();
- V4 w- X) w& W
save[i++] = *addr;
- g2 X4 a# y* y5 L4 x8 a6 a
sync ();
- [8 e' T; B) B( K) m! b& ?' h
*addr = ~cnt;
9 I+ ~/ f9 M1 u/ a
}
8 y" g3 T! N5 ]5 e
( s- k. C l$ {8 u) Z7 y
addr = base;
( \ H6 {: ?* a; b
sync ();
! [* g; R; T9 u# ~, K/ v' m
save
= *addr;
. D' p; p+ G+ m2 e0 o
sync ();
% M& a. Q! K: D: b- E1 @
*addr = 0;
1 ~8 j4 K8 K+ }
% _ s" O" k; D+ e
sync ();
3 B, ?' e+ y7 R0 J6 N2 B) I+ d
if ((val = *addr) != 0) {
U" l6 y* k2 g
/* Restore the original data before leaving the function.
9 U3 f i) N; ~; f5 }
*/
) L( g7 r9 X( C" A" g4 D
sync ();
+ e2 B+ _* x( O& J- _
*addr = save
;
: B8 a+ ~% K5 R! ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( s3 B. e; |3 g3 v7 r- ^
addr = base + cnt;
8 L) O6 j* o2 f4 W4 v/ |9 w
sync ();
1 a1 X+ G @9 e( G5 p
*addr = save[--i];
; Q) K" ^; Q3 C9 A" H5 u/ y
}
* \ ~ G2 j" m1 _" C' {. K
return (0);
6 M/ h" v& \8 _6 r$ a3 \0 Z
}
7 N) o, w6 f" i4 b8 E, J2 T
. H7 e4 o+ I. W- u/ F- u
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 C4 S m* V4 N8 f" M
addr = base + cnt; /* pointer arith! */
/ s6 C+ f# `/ d0 V7 O
val = *addr;
. H, N* h) b7 ~, k) f: p4 [! L
*addr = save[--i];
; [' q2 q. X* f3 j
if (val != ~cnt) {
" k+ F+ C6 c1 p8 o8 U9 [1 J
size = cnt * sizeof (long);
9 K+ H2 ?2 A+ X) V1 |
/* Restore the original data before leaving the function.
' B! \/ k5 H/ k7 t6 |
*/
0 M. Z# l$ B+ D9 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 k& W2 e3 S/ ~/ L( `; }( @
addr = base + cnt;
$ i6 C$ V! k: g* S
*addr = save[--i];
; a L* m: `% Z( ~. l
}
1 v M- L" ~! R( N# ?7 h/ {. p
return (size);
6 V1 U& B7 L* p* U, |, P+ ?6 O! b$ e
}
* M8 Z( `# i" j1 d9 h
}
! H3 ~- h6 J# t0 I% d) N- R
9 H6 E! u/ [( d Q- F/ n+ h
return (maxsize);
3 w5 `; x, t/ m( P& T% V1 z
}
7 k- N: l- S0 O& d2 r/ v% ]$ P
int dram_init(void)
- r, Z1 ?. B8 Y+ R0 i
{
8 H: ]" I- b6 U# ^, e# E
/* dram_init must store complete ramsize in gd->ram_size */
/ T! {$ b# M0 G- C
gd->ram_size = get_ram_size(
% L5 {1 s6 `( Q$ c
(void *)CONFIG_SYS_SDRAM_BASE,
0 p+ c8 L, g5 O4 Z$ o( Q7 [% t
CONFIG_MAX_RAM_BANK_SIZE);
$ Q8 T: Q! n% f5 W* M: _8 ]
return 0;
( Z% P1 |0 E2 P$ v3 N/ Q2 b, f: X
}
8 B2 e, [2 p' x c/ m
9 {0 ~. { D! ^. l; l! s8 [
8 F( ^7 g0 T9 X# }$ I
# Y: X. F/ P7 ]& C9 Z8 c- m |
& I( M: |' g9 i: o/ P1 {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 F3 ~' n: P3 {7 B. X9 g
D R* J8 ?& I" O1 z9 f
& u5 e8 c- @% N/ M6 z# J* c7 Y
0 S! E: o3 g% U" O+ w- p; H5 `& O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4