嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 Z, g: F y5 _. k" z a+ G6 y) o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( _6 g# [3 A0 Y0 g; j% ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 g- f9 T; P. J! O5 Q
3 d4 ]; u. x" n" T: v/ P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
F- H# n4 P! g' F/ d
- ^: K2 d4 `; y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 N, x- q4 U+ `3 ~# W
/*
5 ^* F* F6 t$ j* [9 `) u$ c
* Check memory range for valid RAM. A simple memory test determines
# v; T. { J" z# X% d1 i7 C
* the actually available RAM size between addresses `base' and
+ e2 b ]6 Q f
* `base + maxsize'.
. R- @; |( H, i+ E
*/
O. D: W9 T3 i
long get_ram_size(long *base, long maxsize)
3 z! h/ ?# ^; J ~$ L" E
{
1 Q& @0 M2 I) x9 L4 c( T; S- h
volatile long *addr;
# ~& ]# Z6 _) i$ O% z+ y
long save[32];
( f# E6 ?7 v6 M5 a0 H- \# i! z
long cnt;
5 R; k' l; u: N( o0 J
long val;
; M4 Q) E% x) \" X+ I6 X# Q/ y
long size;
8 g5 z7 V! M6 I( u
int i = 0;
* U' b& D% p. |: T- D0 l# V
0 W( L7 p- E/ e* `' V
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( T4 M+ P4 o, Z# s( A
addr = base + cnt; /* pointer arith! */
! q& h$ q2 t& _) w
sync ();
& Q+ W9 Z2 ~# H7 A8 M0 X' t% C: J
save[i++] = *addr;
9 Y: }; E* o$ C
sync ();
& ]7 s* @- G' {, n
*addr = ~cnt;
4 C/ c; n3 h F# U G5 o6 L
}
+ S3 A8 [3 `* v3 \! ~9 L5 l
3 P) I* K; G, k3 P
addr = base;
, P% b! O# V+ [3 p
sync ();
4 _& K. o7 y+ p0 U0 R
save
= *addr;
# ^) ~7 u+ T, r5 q
sync ();
( E* [/ [/ a2 B; g7 m
*addr = 0;
$ @: R& M) [: O+ O, X4 @0 O
! c- }. ?9 z: h+ k
sync ();
/ d# |7 v1 \, Z1 f; w6 I; s4 G
if ((val = *addr) != 0) {
% @+ {& G' y1 k7 ~ }( x
/* Restore the original data before leaving the function.
; E; X: r/ r8 z, |
*/
; k3 H/ a( v- |5 b4 j' B
sync ();
) d' ?; l3 G$ r* I; |
*addr = save
;
7 V- ^( C! K, q: k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' C1 y/ R! L6 M; R
addr = base + cnt;
4 }9 z8 w! s1 X# o: z3 _
sync ();
r) j0 |1 F8 g0 s {0 }
*addr = save[--i];
) {7 z9 B ^0 I- S# x5 l" v: M1 [
}
; M+ J' ~: @$ [: X6 u
return (0);
) P- |: |8 B0 C& h5 M1 Y1 P
}
) k7 j1 F, l1 W* k0 k$ @
" G, B- Q& R- V/ u8 ^; T- T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 g& w. B% \: W \" T! @
addr = base + cnt; /* pointer arith! */
' w+ c) Y/ [- W! ]2 e D; T- t
val = *addr;
) B [$ Q) i' E& S' O' \
*addr = save[--i];
! h* t( q' [) p! [) q% ?- f
if (val != ~cnt) {
- B5 F* {: s5 q! @! E( K _! Q5 |
size = cnt * sizeof (long);
: q2 ^: e# B, r( }
/* Restore the original data before leaving the function.
# }+ Y# d6 @& t' s) g( ~. ~
*/
; T# h* r0 o& L+ t3 P8 n6 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' J1 P1 g5 h$ o$ D' D5 ]5 |3 |; ^
addr = base + cnt;
* M' s! {$ v2 }, @
*addr = save[--i];
. D( \" |) M! D- k( q
}
2 N% W: P& d1 p) q# r y& V K- v
return (size);
& z/ o; U& J' C/ d4 V" q3 r. `$ J; X
}
) W/ H, C) k, N0 q/ P" @
}
7 v% S) ^; \% n( s2 [
4 z% x- b2 m& y2 V. f: c8 Y3 i
return (maxsize);
* O0 w3 V. D1 E: G) K6 Z4 J. }
}
2 q& U; c, ?" L; E
int dram_init(void)
( \8 g0 T; U9 @" f
{
3 t! ?& }3 o1 p7 U* _. R; T
/* dram_init must store complete ramsize in gd->ram_size */
( `$ @/ L r( J! w0 y9 F; f4 B
gd->ram_size = get_ram_size(
4 H5 I5 f9 z- _; X& _/ u
(void *)CONFIG_SYS_SDRAM_BASE,
% i% _ U) a i
CONFIG_MAX_RAM_BANK_SIZE);
9 X9 N& m. f" t' i
return 0;
' H: I# W. t: M0 m* C7 X
}
5 t9 N0 K. d: ?. r
/ |! X" ?4 K9 O1 l' ~1 `$ z% w
/ Q, b3 R/ M L7 E2 [6 W+ F
* b3 |. G* K- c; T( V3 j$ E
1 I9 I) Z9 M3 n4 l! t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 L3 d" {6 w$ I
9 U0 ]) d5 R! x" b+ N6 C: O& X
! J9 P: P9 K4 v
/ S0 C: y: i, e' b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4