嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
" [) X T6 r) p+ z" d% Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 j- C% X* X. G: n0 }; w! v4 E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ c t7 G4 E2 Z; u
. s9 s: f. |* S! d0 O. I" _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 {# H2 [" Q" `/ o' Q5 Q
( E1 @$ h' Y) S3 J, H* z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 i, w- N' P/ ]; r8 v
/*
- M0 m* a: z5 Z% S; B% H% O; h
* Check memory range for valid RAM. A simple memory test determines
5 A, h: l) t& m% C# A
* the actually available RAM size between addresses `base' and
7 s% K* Q! q! C$ f
* `base + maxsize'.
8 v2 X/ m) Z& s+ t; E; G
*/
: h. X R8 q( N& j* H' V
long get_ram_size(long *base, long maxsize)
( ~4 R0 Q1 d ]; y8 w
{
3 \' }8 ^2 i" b0 ?( ^9 `
volatile long *addr;
6 G5 Z& I* E4 d2 |3 d
long save[32];
, j- E* i4 a" |9 m7 p/ a2 N. B$ d
long cnt;
. l2 h2 C1 w9 p- L$ N( K
long val;
4 }2 z3 ^$ f* U0 S2 O" a: L
long size;
+ T& Q, ]) h7 f! Q; b+ ^
int i = 0;
0 h4 O5 e7 j2 [1 d3 _9 @
. S' r" T4 ?' z; t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ d* h+ d" ^; w G4 V
addr = base + cnt; /* pointer arith! */
5 b ^- ^+ ?5 R7 w& c/ J# c
sync ();
" I( d0 R) a- s
save[i++] = *addr;
* C A* C+ p+ y9 p9 W8 t3 |4 W) l
sync ();
# s- {3 L/ B n# a8 e. s) a
*addr = ~cnt;
$ l: O6 X4 H: \6 R: x1 `' Y) M' F
}
8 n a- ^! c7 B0 c' |. c
: a O+ _0 {4 ^9 [
addr = base;
/ [- E% @+ }8 ^$ {6 [
sync ();
/ F) t% T! E c8 ]% Y( v
save
= *addr;
! M) _) O7 P2 O; Q: }) z
sync ();
5 n8 f0 o% c! |, Y' ?2 E" k, c
*addr = 0;
5 d6 X! p- w' ^8 o( [; ~
- N" X; T. M) z5 Y/ }) k
sync ();
2 \. a2 C" J/ C* s
if ((val = *addr) != 0) {
5 X2 v0 e4 e$ n0 g: C. E
/* Restore the original data before leaving the function.
+ l3 f, v2 l5 z# p- y
*/
2 M& p7 B- i8 \$ o# x J" \$ e
sync ();
& m0 y( z' x3 j" }
*addr = save
;
& `) L2 o! ^5 q8 x7 Z! ^# G; q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 z$ Y) J, ^7 g3 a ]; k6 L% A: ^
addr = base + cnt;
3 g' _2 \! D( Q/ S7 T- j q
sync ();
& s- P0 _5 h' l' L
*addr = save[--i];
0 c' J/ \5 O& Z- F) I9 F
}
" w* y. q- C9 L3 |- h6 B& _% }
return (0);
& v" F, g* L5 S8 s+ ~8 D0 k: Y
}
* o6 w5 n2 ^0 j o# k4 r8 [) r
7 ]) k! P& P# ^ W. ^5 n, D8 o
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ U! ~0 Y* B q. U
addr = base + cnt; /* pointer arith! */
' T3 u X( s/ ~: l/ d8 G! @
val = *addr;
: b) O+ A# e0 P- A5 c
*addr = save[--i];
4 | q4 C7 }: g0 v- E
if (val != ~cnt) {
5 F. v2 O* L3 w7 x& y; H
size = cnt * sizeof (long);
P" z7 z9 F' y
/* Restore the original data before leaving the function.
( J% G% E1 f1 c3 Q; }6 |' s
*/
! D* S! J* O5 V- k/ ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 a2 V5 T/ t2 e% m0 L
addr = base + cnt;
' @# W" t+ M+ I4 u6 w+ {4 r
*addr = save[--i];
. o1 H( R& H! k3 R6 r# a
}
6 U7 T, p3 W- J1 |: F
return (size);
$ b4 E' d, g1 E J/ ^
}
+ `$ f: t4 W) @1 N0 R( b
}
$ }& T& c0 H; w9 O' V
5 d. @' `) ?2 h) ^
return (maxsize);
0 Z6 z) z* R' }/ }0 p0 p
}
6 m, o) i# g) R
int dram_init(void)
5 n& x' v6 k. x$ n
{
+ R W, _& G3 H+ s$ O0 E. ^! D
/* dram_init must store complete ramsize in gd->ram_size */
& c7 X! O2 V3 S# y/ w- r
gd->ram_size = get_ram_size(
" Q: u' t4 P" ]7 `7 o
(void *)CONFIG_SYS_SDRAM_BASE,
1 Z8 r% q. @9 c9 M- `. O
CONFIG_MAX_RAM_BANK_SIZE);
$ e( V6 U5 C( |3 V8 Y/ C
return 0;
4 U8 k+ W, _( n1 Q4 I
}
3 A$ M0 d9 o( E/ W
6 p3 n3 s6 V8 V: X V3 u& q, C' h
1 w. x' Z1 ^9 L
# L/ D' ~3 q. `" l+ ~
, T1 K; V% q& T% F, |- e; y4 x2 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 t) l3 g$ z/ D( {5 Q+ E) U
: Q+ N1 Q, o4 N; t3 K
! |) T. R/ E# A- O8 F& | ^
9 h; S3 Q, x4 U: r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4