嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: h% ]: Y9 R! e# b" S" G
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# U9 v1 n0 h$ J% D8 m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) ` C6 R) h. h
- I3 g$ I8 w4 ?: K
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) x g; k! N; l/ g& W( w/ O1 H
7 j, N$ w( F4 q; O. c
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- ~ |4 I0 c1 _% o3 C$ B
/*
$ S( l: g" E2 c
* Check memory range for valid RAM. A simple memory test determines
. O0 t' d" [+ c* s5 c
* the actually available RAM size between addresses `base' and
+ `( f; Y x6 f/ j6 @& @
* `base + maxsize'.
5 ^# r1 P2 Y3 a! S- s% H
*/
& d4 ~ T- A' u0 |
long get_ram_size(long *base, long maxsize)
% Q- c5 ~8 [) g8 `5 n' z! l2 R
{
& i' `; V7 s2 x# Q# G
volatile long *addr;
' [) e9 B" q; _1 m
long save[32];
: K+ C3 Z8 x( ^7 e; \
long cnt;
/ e* P5 X0 n r1 u. O* w0 ^" W
long val;
* N, @7 E) s$ f& ]3 Q3 z9 }( w c
long size;
' y u& u" m! t
int i = 0;
( I" t6 Q8 b7 O
1 E9 f, p4 M/ [$ X2 l, ?
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ Z+ y( ]" |6 ]6 o9 ?& s
addr = base + cnt; /* pointer arith! */
6 [8 y" ]% n- e
sync ();
* l9 `' o4 P$ t' p; ~3 M' a" P% Y
save[i++] = *addr;
. U1 Y$ q6 W" ?- D) g8 s# U
sync ();
* t* Q" }! _1 H4 x7 V# w) F; k
*addr = ~cnt;
) \) ^5 J% P ]3 K
}
# o' t7 f* h0 e7 i* h! ~
3 ^* V$ j. c- w! O
addr = base;
. _- X o6 z6 Z5 G- q
sync ();
9 q: a Z$ U+ j) u3 |
save
= *addr;
' Y% h" ^' H; S! h: m$ I
sync ();
0 I; j5 {* V- H% m/ z( e+ s; i/ } m
*addr = 0;
4 h5 a) r j/ i! ]! m
) ]1 [* g: e0 Y- h L9 c" @& L
sync ();
! O& V e5 ` @* b' c( L
if ((val = *addr) != 0) {
( D% l+ O2 q5 l1 M( ^# _1 a
/* Restore the original data before leaving the function.
$ ~" p, p- E. f" O1 h& D2 D
*/
5 j$ i. H: z' t3 t) H, B! [
sync ();
" Y. r7 l( {. E! v' p7 V
*addr = save
;
% K8 {3 u9 c4 A% c' m. ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 O! _' f5 \: S$ J' {# M0 ~% z
addr = base + cnt;
. G) p" O/ X) F% F" s# ?
sync ();
) J1 W4 O& V0 ~. B1 P
*addr = save[--i];
0 j9 [; J1 y# Z, @( p) h" A
}
1 ]; r3 H3 k3 V( ~8 B0 ]( I/ z
return (0);
- v% I1 B8 N9 X% ^9 v" C3 \
}
# q% i/ W: K( F
6 [8 \9 G3 [( c6 B- X8 x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' P, ~6 K+ Q, T7 W0 Q* c7 I6 e
addr = base + cnt; /* pointer arith! */
8 _" [7 X# @! c
val = *addr;
l5 T% ~4 L T
*addr = save[--i];
p% s' _' E/ o5 x' H8 i/ \
if (val != ~cnt) {
# A$ d" X8 e' T- N# \
size = cnt * sizeof (long);
8 y" J4 [* Y9 Q8 _7 ~& ?
/* Restore the original data before leaving the function.
+ B/ o3 o' d O1 d+ v) V! e; A
*/
1 A9 x6 J# m# P4 w" y1 f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" r- K& E+ d4 [7 G& f' j3 d9 }
addr = base + cnt;
6 \$ i% j$ O1 x1 p3 }' y) j( B
*addr = save[--i];
% x2 Z6 ]9 U4 l4 p+ ~! J' J
}
" z$ N8 B( w8 y. U
return (size);
4 |9 |- _' _. D% ~8 G. q8 w" T$ h% f
}
/ P% v0 q9 j8 [! Y. ?3 I
}
! @! O3 A( K$ Q) U S2 B& ^! L
0 e" V2 E( D, ?; J6 k+ R
return (maxsize);
( ^/ ` x' A, j
}
' f$ ^- m" w9 l+ b) A" m% c8 ~
int dram_init(void)
* c* T" s# v1 `1 B
{
6 \9 e) w8 L2 T4 O) `
/* dram_init must store complete ramsize in gd->ram_size */
0 f9 }+ D0 T! e2 n( b' {, \
gd->ram_size = get_ram_size(
" }6 I/ B& y, G/ S+ Z/ }$ R
(void *)CONFIG_SYS_SDRAM_BASE,
* k1 B5 ]) |1 }* u
CONFIG_MAX_RAM_BANK_SIZE);
# g) P4 j6 h- C' r
return 0;
! E+ _ R6 s( X: O* B+ w2 W
}
" C' ?- I* t8 M! c( _) |
* B" X0 ]; r8 Z4 |! h
. [8 @0 ?& \+ X2 r* S7 T
7 t1 @0 P; R4 a& B/ U5 U
9 o" o j& h5 Z: p5 {6 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 H" b; {. P0 L6 d3 L
( n9 O, t- f s6 h
5 ^4 E( r4 U' D
! ?# d+ w0 P7 L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4