嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* j; o7 A' R7 Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* Q; D! c( k; z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 n* r# d5 ^# Z; B% C. D
( @2 z2 E$ k6 y1 N- v, l* i% W2 }5 s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 {" Z7 D' v4 ?: M
2 N( |) n) r/ k2 i( G- f* P9 t
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c9 Q5 D6 ^% ?+ \& f8 d
/*
8 Z. E L# V3 C a. K! ~
* Check memory range for valid RAM. A simple memory test determines
% {& [0 B; `6 M* Y) a
* the actually available RAM size between addresses `base' and
9 |: M$ |$ J) `3 a' B; p0 I
* `base + maxsize'.
3 q+ }( [1 r, w" p1 F' v) M1 |
*/
# ]. T8 G1 q. C9 J
long get_ram_size(long *base, long maxsize)
$ t- b& d: f& l6 C
{
( j, f" h" ]0 r' F" [6 I
volatile long *addr;
1 t' i2 w" m6 A- L6 P* Z% T
long save[32];
& E- [* L+ V# {5 c
long cnt;
, `8 I. g; n8 y3 l
long val;
1 W8 W, [- l, T) ~, V2 c
long size;
$ K/ [6 c- I: N
int i = 0;
* M8 @% j+ g" @
1 p' Q& l" _- ?8 ?* S6 w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 J: J3 i' x) n, k3 ]8 W% r- Z; X
addr = base + cnt; /* pointer arith! */
) y% F0 o4 k5 m+ Z B
sync ();
9 d4 p4 p7 d2 k' A: `# a( s
save[i++] = *addr;
% @. }- s6 v- X5 J% f5 `
sync ();
7 s3 z; W: R8 f# M: j# \+ h# z. i
*addr = ~cnt;
! ~( x4 g; W# v8 E2 X
}
- [5 r) `$ _+ h' _1 e4 `1 S1 }
* Y0 U; _$ I# s! E
addr = base;
) ?' K. P8 z+ S1 g
sync ();
6 V, A; q6 G2 e6 R' p
save
= *addr;
- [. g; X. r& L; l- K
sync ();
3 P* f' c: Z4 W3 D1 [: {
*addr = 0;
5 Q1 ?, M7 Q9 z
( `9 ~" c- \; e# e
sync ();
$ U* `# }2 [; E5 E- \& l
if ((val = *addr) != 0) {
U# S% \' L7 ` P. S0 N. y1 a
/* Restore the original data before leaving the function.
2 v& N0 {6 }3 [" P$ ]9 l4 b
*/
" X2 ^% L# z0 H' j) g1 Y! \0 u4 V
sync ();
: M. H7 J" y' w# \: K g
*addr = save
;
! N$ |6 H6 } E k0 y, q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 \1 N( O. b+ r+ x- ^; R+ c
addr = base + cnt;
2 p8 X3 `7 f. C m0 u1 P' d
sync ();
/ R1 ?3 U, R" Y% `. B6 U3 H; @. o
*addr = save[--i];
8 Q2 j+ ]! n9 Y5 ^0 w" w7 L+ G
}
- D$ U3 g9 l# x
return (0);
2 p) N+ | g# u" `
}
5 }0 |5 k6 d& ~5 n6 o5 b9 U& b
9 I+ o* v! V' _/ b% K/ i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ J& ]( q( w0 I6 I) e; L
addr = base + cnt; /* pointer arith! */
( ` B. Z p) A# l/ h
val = *addr;
- ?& N C' c+ s- |. \% c9 z
*addr = save[--i];
}. t1 o, y% q* W- H: n% z P
if (val != ~cnt) {
( u( H4 r. B8 ~! }" R# }7 |
size = cnt * sizeof (long);
6 }4 K- v4 e( k/ K
/* Restore the original data before leaving the function.
0 S. J! e. J* U5 `8 s8 O. p
*/
, `* b( k6 q/ Y6 k; o& }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' o/ U8 _" ]( b0 T5 g* A
addr = base + cnt;
9 I+ G9 ?* E b, J' n
*addr = save[--i];
8 a% f. c; a& `. [ ], ~
}
( K* l0 G8 K+ F1 F7 G6 h
return (size);
4 o+ |3 P5 H5 V* d8 U) s
}
$ p' z: p5 N( _& u( I
}
4 E; S: U8 {! Z) R1 l1 Q
, [" A5 V! a$ W1 K( J& ^6 |1 a/ N
return (maxsize);
' K/ P6 u" ~' e Q% l
}
" S, j" V& a( f, f9 j4 I3 u
int dram_init(void)
9 o# G8 J/ E2 r N
{
$ I: K4 x; C# H0 Z8 `3 }
/* dram_init must store complete ramsize in gd->ram_size */
M u9 F) ]) Q7 p7 T
gd->ram_size = get_ram_size(
7 t- z1 W9 }2 N, K g& m- h; ]
(void *)CONFIG_SYS_SDRAM_BASE,
) r5 [! P( C2 s+ \7 y
CONFIG_MAX_RAM_BANK_SIZE);
/ ?7 a! P; u% |: u$ A2 Y
return 0;
! ^5 R+ c) \3 B0 \* o: P
}
% k* W; V$ ]' {/ ?
% J' t6 E' j/ _/ f& c% F3 Y; V
7 d4 }6 v" Q: M7 w( B+ s D
- w4 s; y# T% u/ U! j
- w9 J* u% ]6 M5 w( u4 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* y) ]9 |* X" K% _" @; X
! t: X& x3 T% I( a/ {
3 h3 Q$ _7 \' Y' |4 L6 T' j; R/ H( d y
' V( }5 Y8 d# O% q- ^( ~- A: c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4