嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 B+ C P3 Y7 ^8 d7 H/ Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" J. z( ?7 O) E- t$ Z( z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 Q/ t* v0 _2 v9 ~9 ?
7 ^) o0 b0 Q- l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( x: O3 N/ U: d# l5 Z: p9 [
8 w+ X# z/ _' C( s3 B
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 n! D5 C3 }# n5 a" [
/*
; }) l' B" K0 u9 e* V9 C: j: S$ X
* Check memory range for valid RAM. A simple memory test determines
5 o$ ~8 b. \5 Y
* the actually available RAM size between addresses `base' and
( j! R! {+ P" _8 M( e
* `base + maxsize'.
" W: \) B- q, e
*/
; w7 v1 ]; y3 O/ D# L# Z4 I
long get_ram_size(long *base, long maxsize)
\* w7 P/ r$ C- K( e, \5 j, z, I
{
1 N. z- r1 V1 s/ G% e. U
volatile long *addr;
0 f5 n% l+ _! W0 O" y" p" G8 x
long save[32];
: L, e2 u( z& T
long cnt;
7 X4 w f, {2 E. i3 i# l
long val;
$ a9 C5 |" n+ X$ h1 b
long size;
0 j$ h' q& i" @. v: _1 I/ k
int i = 0;
9 {. i# B, L; r; G' |, M1 E4 P
2 ?6 I5 R/ `( o. G r3 J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& I2 ]3 L' @" x' ~" b9 x
addr = base + cnt; /* pointer arith! */
1 c7 O p- E! p9 l+ |* |
sync ();
5 H- J4 u% T. N- R- K4 Y! m; t2 r
save[i++] = *addr;
1 f" C3 w3 y9 F. p2 W
sync ();
5 [/ G9 f( ?" T2 k$ [4 q* n& t
*addr = ~cnt;
2 J, D/ Q( ?0 g/ i6 p
}
% ?- A% K" u$ j! x1 B9 w+ r
+ E. ^8 t( t" o. g; g
addr = base;
i& g. n) G8 N' u7 k0 g
sync ();
6 z4 X& X& ^8 s v
save
= *addr;
3 d' ~9 |5 b# n2 ?! F* K2 ~- v
sync ();
: B e0 M/ r/ {/ i3 u0 E& N8 X( r
*addr = 0;
( a2 j/ K. }$ E7 ?) n
9 j5 I" R9 T% L ], r7 F$ R
sync ();
9 ?( Y# {6 s% T( m+ E7 e3 [, E: |
if ((val = *addr) != 0) {
' a2 Y$ ]6 r+ a& {) D& Q" D! d3 ~
/* Restore the original data before leaving the function.
. x H7 C% R3 `8 H8 b& `
*/
! T: b* Q! _; l# ^$ m
sync ();
/ H# K) L! D3 s9 f
*addr = save
;
3 e0 v, y, L; I0 e1 x/ I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, ]- L `" N: n1 g# J' B+ a3 e
addr = base + cnt;
" @6 M; K5 {9 ~* I1 ?
sync ();
* V6 ?( g! T0 e
*addr = save[--i];
1 Y4 j6 D2 b# d( ~/ t ]. q
}
& k: `0 Q" c6 f- y5 n% ~( O
return (0);
( _5 W* q2 ~. e' J) T
}
- T1 b4 I* H' G$ u7 h! g& C
/ z" u9 U% G# j$ x! q8 b+ c+ T( s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* B) @, O/ u* S( l
addr = base + cnt; /* pointer arith! */
7 D$ y8 J3 l; m/ E- Q
val = *addr;
2 m4 g2 a* V# Y: X
*addr = save[--i];
5 m: _) v, z1 j
if (val != ~cnt) {
8 z0 q; X$ E& c/ [/ m+ m0 _% ]
size = cnt * sizeof (long);
2 i8 k3 g/ k6 n$ k2 h% E
/* Restore the original data before leaving the function.
* D) z+ s. J2 F' T0 {
*/
/ r- ?1 a" S5 U6 l- _+ V
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- m) x$ P- G! R6 q2 a( ]! x
addr = base + cnt;
5 b7 t6 e1 k: a7 z5 V
*addr = save[--i];
& w! Z, b( ^* @8 |( I9 e
}
1 ?+ Y& d! |% _& `9 ?* E6 Z
return (size);
9 i1 _) Y7 a1 k% ]8 n. ]
}
: X1 F8 w. H6 v" G
}
' }; T* C$ t$ l7 ^$ z
7 `& p+ T2 P6 s6 e
return (maxsize);
. X5 U$ o/ a/ g* _# P
}
& _6 }1 F0 I0 T8 W9 d# V! B
int dram_init(void)
0 a# B4 L4 ?7 O2 o+ Y6 V! ?+ s
{
9 i2 X1 E- N2 F
/* dram_init must store complete ramsize in gd->ram_size */
4 b2 [7 u6 n- c2 L8 H* s
gd->ram_size = get_ram_size(
3 U" h' I6 B7 Q
(void *)CONFIG_SYS_SDRAM_BASE,
n# j3 H+ c" i3 H9 e5 g* N! {
CONFIG_MAX_RAM_BANK_SIZE);
6 |7 l2 A% L- B7 J9 o F3 a' F
return 0;
. Z, M/ }! G9 s& D$ z0 S; f X
}
: r1 Z" S! o2 B7 h5 q6 X
. h7 N" t9 i/ S* N5 f7 B
0 L; ~# x! ?, q/ e
# f0 Z# A! t+ K' T
/ v0 C% P% K" u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! w5 e: _" H1 P% ]; `, D
8 n5 }& l' Y' G H
! C9 M# A% r# |+ A) \
4 q4 o1 Y: ^, T) Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4