嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, \6 U* x& ?; K8 h( j; r; l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 e* v" o7 M& O1 n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% H% z# \, r4 ]7 l" o: t
# a J( S5 Z2 n- V( F. h" t7 k( ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ [+ |5 L; I+ U, `
$ X- y2 z8 n) U4 c9 t" s2 C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
C% Y6 d d3 H# t! f1 W
/*
+ ]- V1 I5 N. V; u3 l& G
* Check memory range for valid RAM. A simple memory test determines
/ g R. F7 R \$ d0 Z% K
* the actually available RAM size between addresses `base' and
1 H4 V# |6 H3 I/ f% J3 K( A
* `base + maxsize'.
( W; b% K" t8 D6 [- y
*/
/ Z( s8 S" }+ R7 `% M
long get_ram_size(long *base, long maxsize)
4 T+ D8 o* r9 |
{
. c: d5 r; b/ e$ y
volatile long *addr;
1 {% o4 @ f' }3 R$ X; A( E4 W
long save[32];
5 I% B0 [& Q$ m8 i" F# v( ^2 R
long cnt;
& W. l6 x2 B/ W; W5 T4 S: a) z5 X
long val;
: D. S: i* C6 Z7 d, r% W8 Y" y1 ~
long size;
% s, {! T5 `& N8 N$ k/ q: k+ m
int i = 0;
+ {: @+ s. ]$ J
( u* F! w3 o5 y" S' u0 c. o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. x! E; J; x( D! x8 O
addr = base + cnt; /* pointer arith! */
. n/ @8 a/ K4 H
sync ();
& C& d% ]" |% e/ I
save[i++] = *addr;
+ s) v; l* t/ p# E9 ^ _
sync ();
3 @$ R4 @5 {7 C6 V/ U' `
*addr = ~cnt;
, z! M# U3 E6 Y; X# z, N% O
}
2 Z4 o' [' Y4 t5 s& b6 n% s
/ l/ r4 D0 ]1 r
addr = base;
& V+ R3 s! ~/ K% A$ m
sync ();
7 O8 w+ k9 @$ K/ Y8 @
save
= *addr;
# I4 b* P4 b( B4 J8 U
sync ();
8 P4 t1 S% f" m) ]
*addr = 0;
0 O9 ~7 ]8 {7 m* g M
0 p3 Y9 a! A I% h5 l+ P' |
sync ();
* I/ x# B4 a X+ S
if ((val = *addr) != 0) {
+ L5 j {. p. t2 b& K
/* Restore the original data before leaving the function.
W7 }: T: X. k2 G% Z1 {9 I( }3 W
*/
2 E) g: l5 @, X
sync ();
8 s& p! { m4 K. e) i) ^3 P. X
*addr = save
;
$ ^; v) s1 u. l6 e5 ?4 T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% Z; i% a/ F! p' c; G- ?, v" T( t3 T
addr = base + cnt;
; w3 C. T* I* Z- \- Y
sync ();
+ a% c# d2 i) ]2 G( M: q
*addr = save[--i];
Z, ^8 n7 ?; u, p) S
}
9 ^ m& \- R+ S9 V
return (0);
* |6 ?8 {! j6 x0 F
}
- L% I1 ]7 a/ O
) z9 ~2 n3 B# Y; N4 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. g4 x4 H- ?8 a9 V+ X! g7 @/ g
addr = base + cnt; /* pointer arith! */
1 B' i2 A8 {% D
val = *addr;
, u: V1 f" f" S* H4 x$ Y
*addr = save[--i];
' u+ A6 M% c2 Z/ ^( @' D
if (val != ~cnt) {
9 y) N) L: J" ~" s3 \
size = cnt * sizeof (long);
4 p5 t9 E) F0 b# i5 ]
/* Restore the original data before leaving the function.
' Q) ]! x$ a7 u, d0 r+ N
*/
5 B# b, y0 x' y# b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 y. v7 p3 ~) j4 K
addr = base + cnt;
/ }! m. K. c" ]# f6 e
*addr = save[--i];
O! p! Y H, u9 ]
}
1 ~7 R( s3 a6 `- g: X& }
return (size);
- ?$ O8 Q) A7 b, i
}
, ]: o4 W) h! \, e9 ]
}
& t. z5 N1 N5 k3 d( f
2 K$ g2 i4 @0 C4 |
return (maxsize);
8 ^0 l, s `3 `& l) X5 m
}
8 l/ Z. ~) O& J3 ^( A% E& o
int dram_init(void)
- _& ?) I, t# M4 T
{
0 c' v5 [1 K6 t7 A4 S& o6 Y- G
/* dram_init must store complete ramsize in gd->ram_size */
$ }& W: Z7 A* j/ R
gd->ram_size = get_ram_size(
7 B: z4 J6 \: u/ n- \1 w/ b# G
(void *)CONFIG_SYS_SDRAM_BASE,
( T) v5 L8 \. q8 V0 x7 _
CONFIG_MAX_RAM_BANK_SIZE);
/ b$ i- D. c: @: V7 k( |
return 0;
3 H0 R8 [4 `, [# p7 y; x
}
7 g3 A: k5 A: P1 I
1 v: Q2 ^- t- q
. E! w5 q# d% I1 L; s2 l
4 j, @; C4 v; w J
( N7 U1 i% u: l, j" z; J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 D. P# E2 z5 L& q0 A
/ O. A6 W& n. o
9 A/ m& D1 C0 ]+ C
# e1 s! Z6 k& Z, ?0 X) b
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4