嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 x) V+ W+ X- q# L T! G* z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ D) Y$ [$ _; Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 }7 X ], i5 m# T4 |
3 _* S$ a! z+ h1 n6 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 n( D, \2 c- [
& X, o: |4 a. m* h3 [1 H! c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 P8 y* G) V5 ^: `% k" b& ] p( H
/*
3 O. x, Z4 n' N/ N
* Check memory range for valid RAM. A simple memory test determines
( s4 ?; n' P4 f3 c
* the actually available RAM size between addresses `base' and
) k8 v% w6 K a0 ]
* `base + maxsize'.
4 \4 c& Y( g: E) f. C
*/
3 v9 t0 R3 D8 x& O
long get_ram_size(long *base, long maxsize)
. S5 [$ y2 N: w) \1 M" u
{
) C$ @% x+ L! ^; h, ^; p
volatile long *addr;
0 M) H* }' t- h# i3 u- b; a
long save[32];
; E6 d$ Y1 T+ f' e, E' ?
long cnt;
* u) V0 ^4 l6 N
long val;
7 j3 T' E9 s6 m0 m# L1 k/ T8 t
long size;
2 w, [9 O9 _0 ]8 `6 U; r7 B
int i = 0;
% G$ k! ~+ B! f# a& h5 _
( d# S+ w4 U* ?6 Y; b) Z* {! I7 Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ I( u6 ~0 N2 Z2 A+ s3 \( P
addr = base + cnt; /* pointer arith! */
8 F5 l' h7 t) H2 P/ L
sync ();
- N) e6 c% ?' u C5 {! \' E% M
save[i++] = *addr;
# l: t: f; h5 j. o
sync ();
; G8 A9 [$ W6 [% j4 J
*addr = ~cnt;
- L9 U6 s- c+ \( v5 l1 Q, G% e
}
4 b8 @. J- X" Q+ n* _% U
2 |3 w% A6 R1 Y8 S* z
addr = base;
; M! M1 L6 J7 ]
sync ();
: ?4 x* |: O/ Q6 i. j( X
save
= *addr;
1 v6 R) E! f( I( Y) a
sync ();
- ]% |* ?* C. @$ v8 l
*addr = 0;
# E' N$ F4 I+ \8 W' |0 y' M: {
3 K( a$ S8 [1 @6 x
sync ();
! K; [8 m B, j5 x& L0 H& Z
if ((val = *addr) != 0) {
- }0 n) [, F$ N% |
/* Restore the original data before leaving the function.
$ r$ J6 c. ]+ u- ^% d! b. L. {
*/
7 [% w* m; v' K! {+ _2 D
sync ();
5 ` s* g* n% x
*addr = save
;
8 P9 A( R* {* T. ~9 {
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% \+ t q l- Y2 ?
addr = base + cnt;
8 {+ _5 A+ X& X2 \$ P2 p! F
sync ();
$ s9 D$ O: t% T& \7 r# v
*addr = save[--i];
: z h# `9 b3 T7 v7 j. r
}
& J% V# z6 H1 C0 C% ?
return (0);
5 O/ a8 ?- c5 l8 e( v# M9 ~* S
}
9 v" k9 Z, p4 r& J, k
4 g* t& I) v; p6 F+ Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- D; j: S5 j$ S; z+ c7 w
addr = base + cnt; /* pointer arith! */
) n+ M) S* `/ `" a
val = *addr;
0 t; |* P9 A+ y9 N
*addr = save[--i];
8 `' A# N4 q( `' b$ ^/ G* v
if (val != ~cnt) {
" |( H( {. F3 V& {
size = cnt * sizeof (long);
- S- }+ m$ Z. O6 S G; L1 ~
/* Restore the original data before leaving the function.
4 ?/ K. G1 u: t
*/
8 H& Q' b R9 t4 ?* Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# j1 }* N, V1 j* B6 F7 z
addr = base + cnt;
! }5 l7 L" C+ o9 l4 ?
*addr = save[--i];
, |1 j' {# B( T6 `+ h. A0 Q9 B
}
5 G. g# V" [4 }! ]
return (size);
/ g7 K2 S3 y! _& _3 t; l" f
}
+ e' S+ E2 b3 W8 ]
}
2 C1 L2 G7 v- c& e- g) u, Y
5 Q1 t* O7 M1 I# D
return (maxsize);
4 l+ ~5 z9 o$ W/ w6 l% a j
}
0 R# d! V% Q, X0 ?% [2 u3 q& E* x
int dram_init(void)
( V& z% |5 T: e1 p0 K. C' w! M$ K
{
0 g7 y, {. A& n6 i
/* dram_init must store complete ramsize in gd->ram_size */
, x9 E& g$ S& Z) W- s9 O5 R, l
gd->ram_size = get_ram_size(
7 h0 v# R1 ~: {7 G7 v
(void *)CONFIG_SYS_SDRAM_BASE,
& H. r, k2 [4 B2 b0 _: f1 W
CONFIG_MAX_RAM_BANK_SIZE);
* ]' V# N" n0 h& K2 x& E
return 0;
# q$ F, @5 W: Q9 L! _. Y) k
}
; Y+ G3 G) x. T9 {( g- W7 L1 l) K
& V# n, e R! `. m' K3 D! [& g
4 w$ P+ t* v$ X5 k3 |$ X
$ Q5 f" K; Q& c
( @) c2 g5 V; H. [+ r B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; T# X9 r" N9 q% a& K0 u6 r& W
3 a. B1 D9 L) P3 u) U8 T, w. j
( X$ M4 g* |5 e; v8 \# p3 L4 }
- z3 c: v8 p* W4 V' t* ?. S& e; }+ z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4