嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( t; @/ B& s2 ~) d! A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- x K8 z& h( m7 r( p3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( J/ q& b/ ?- r# ?* V+ M# o
* z2 g( K8 d) U( }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' p7 {. U: m5 r; v5 V' ?2 R
+ [% C( o: d2 {- [; o- U, A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 ~9 e' W2 o6 H% o6 l9 E/ C
/*
8 R: X3 H ~9 @" P
* Check memory range for valid RAM. A simple memory test determines
% z& \! R' @" a" b" ]9 d
* the actually available RAM size between addresses `base' and
j, t, t0 f* q1 m7 c h6 U1 A
* `base + maxsize'.
5 F3 ]" [0 e( ?: }/ l- P2 L( m
*/
7 }0 d6 Z' a, [" j2 Q
long get_ram_size(long *base, long maxsize)
% `, ^1 k; H8 A1 s# t
{
* L+ X( J% y( O, I* ^4 S0 g
volatile long *addr;
) d. v* J& `' g' r9 A$ N
long save[32];
( b: z0 y I7 e( K4 L+ D5 I
long cnt;
; j( ]3 u, q B2 W
long val;
) c7 }8 X- J: C
long size;
0 ~% {, e; o' ^! v+ }* R7 N: I
int i = 0;
3 D- T+ Z8 S- ^( l! V: _0 I
0 S! e* B# m8 o6 i: o S b* o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, \; W; b! w0 e2 l6 R- Q
addr = base + cnt; /* pointer arith! */
0 U4 R7 H5 m# d1 [9 ~9 l+ r" F
sync ();
H& @$ i# u Y+ |& F8 G
save[i++] = *addr;
& W9 b7 U" J! F1 L7 o( _" {' Y
sync ();
( t8 H* _. @! m3 }9 B
*addr = ~cnt;
$ h0 l9 y' Z. m) F
}
* U. }" `, W4 a! d# P( t! S
' G; a) u% r0 V A" h1 N
addr = base;
1 ?# @2 V, w' z7 l& x
sync ();
" \/ I$ c$ s; z c! L
save
= *addr;
, F* u T# |! i" \8 M4 u
sync ();
: `$ C3 i! J6 A+ }0 \7 a
*addr = 0;
1 E4 d# _. r) y/ @5 z* p m
1 P" R' N7 Q, Q/ F
sync ();
2 s7 f4 m* h# G4 U
if ((val = *addr) != 0) {
7 Z# m9 h' A, ~$ p
/* Restore the original data before leaving the function.
2 ]% ?( r# a0 w8 A: o/ {6 U
*/
/ U9 R3 j# c; x9 p! J- l3 ~
sync ();
8 f' y4 i1 k0 y- Z9 U9 r
*addr = save
;
/ L8 ?3 C! ^) H2 y7 S, w$ b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 j3 |* |# b7 J \& R. D
addr = base + cnt;
% K/ Q. e+ G i
sync ();
- ]. b7 a' G1 K" S# ?( p2 a
*addr = save[--i];
* n/ u$ O, \0 O1 s
}
" g! D9 E' {# \7 ?5 m! C' {: ^) }, P: ?
return (0);
% g7 y) T' ~' |% X
}
; r! G, ]+ b- r+ d K
; b& r+ x5 b. B; H% Y$ W; v, X( E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
b. t6 r- p# H1 u6 I1 A
addr = base + cnt; /* pointer arith! */
/ l5 z7 X# J1 c! F
val = *addr;
& z$ k/ S6 k, y2 [8 J: {9 g
*addr = save[--i];
. I, x' h v" {$ J) {) j0 ^
if (val != ~cnt) {
* x- X) j8 b0 x: F+ i; z
size = cnt * sizeof (long);
( G+ O; J0 e$ ^! I' _
/* Restore the original data before leaving the function.
+ z3 ?+ \) v( D# k9 q& ~
*/
$ |% _3 l2 l. g' P2 t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( E4 A* |) E% |- u v8 V. @
addr = base + cnt;
1 `4 ?0 \2 J/ I. X, ^; G E
*addr = save[--i];
6 R. U: c! T2 ?" @9 @
}
- \& R/ H. J/ r9 S5 x$ E
return (size);
/ m0 W. @8 u5 E$ P) ]
}
$ V$ y9 p0 B; `% d. O
}
4 Y7 \* K% g- N2 p, J j2 E( ?; z
1 E$ E- \& \* b6 W1 _
return (maxsize);
0 ~" S8 N: q5 W& p9 e8 b2 ]1 H3 d
}
& ^; H3 \3 Y/ l# y" K
int dram_init(void)
) T9 \% X9 c! c' Z& [9 V6 g, @
{
" q d; v) E5 o
/* dram_init must store complete ramsize in gd->ram_size */
* z* w- k! U" T1 H3 I
gd->ram_size = get_ram_size(
. }9 Z: s* F- B
(void *)CONFIG_SYS_SDRAM_BASE,
u' L1 T4 l' `
CONFIG_MAX_RAM_BANK_SIZE);
# j2 t. \ N/ H+ {
return 0;
) Z A& Y [4 }, x) G
}
' ?& o' P# m) C- p [
% s& M I0 z: d. Y
9 N* V! ^4 f' r/ Z4 M) N s T$ ]
" h& u* A5 \0 p( m
* B$ \& S. T- s4 z4 I, Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) _) F, H) Q* a( P0 s
$ }# }& p2 D2 q5 E- f/ c
" n8 J. F5 v) x
Y/ B; V" N; m1 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4