嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
x$ W8 J/ t" v) W$ j9 k+ `" u
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& \9 l0 l; |2 f) K$ j! X5 L0 a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( C% a/ n! T$ J
% T% Q- a3 ^8 s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 k4 `4 i" u& r' x+ `- u
! r# h- p1 `: H: G: O$ I9 T; d
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! }6 t) ^$ f/ y8 [* e" g2 X, b0 U6 p( C
/*
1 L1 p D. u8 A" A- W/ _# S
* Check memory range for valid RAM. A simple memory test determines
1 \; G, {7 H) C. \8 i4 D; ^
* the actually available RAM size between addresses `base' and
# r/ K$ d/ ^$ H) O' h. L
* `base + maxsize'.
+ u8 o' Y" }: Q b
*/
* V+ N6 H3 M2 R! N' ?3 U. H
long get_ram_size(long *base, long maxsize)
& H a2 l2 d/ y' u$ h0 w
{
% v+ S0 ~# y3 h: h3 j) f6 G
volatile long *addr;
* T% p9 L, \" X" Y1 a
long save[32];
' V% V2 h4 T' R0 H8 k2 ?" D0 t: Q7 U
long cnt;
+ f+ M1 `; c4 l/ T
long val;
) I+ b) n, r$ l& |+ `
long size;
& z6 w' T' w/ f! v$ V% E
int i = 0;
( H0 ?+ ]% d" {% \+ b
3 j, h$ D- h% |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* z3 G( y5 `/ z* k" ?( w/ P5 J; y$ Z1 k
addr = base + cnt; /* pointer arith! */
5 C5 J+ v3 g$ P/ P
sync ();
7 |: p2 E6 W% X T1 A$ G- V7 u; x7 D
save[i++] = *addr;
8 T) G6 O" |4 {) u# u( t1 A
sync ();
) f. m: B- p. X9 X2 {% y
*addr = ~cnt;
8 [; [! ~! ]1 e
}
- w6 ]. n7 U2 r% C: h
( D1 o( c& d0 G5 Q* A+ k! H
addr = base;
( I' d8 T- r: n( w* a
sync ();
9 `# S( J2 a1 S# L ]$ v$ `! p
save
= *addr;
" H6 G8 Z) H" ?6 v* u/ o- T
sync ();
/ a$ ]- l9 d5 V. i
*addr = 0;
. O( J7 C: B7 Q- U9 K
( b3 X; M' T t' v
sync ();
+ d, A& U, |$ |" r) U
if ((val = *addr) != 0) {
r; M6 ^' s/ V0 c1 p
/* Restore the original data before leaving the function.
6 S& P( s% T, R, b: F/ g( D
*/
% f k5 f. a, h6 _' V0 {, W
sync ();
' |, {5 R: z% F+ }8 Z; d9 q
*addr = save
;
9 {/ T9 J5 `3 D9 \
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- N3 _4 _% T+ Y, B- C; {5 Q @: C( M- l
addr = base + cnt;
' D8 q. P, X5 n3 v9 `4 n
sync ();
! x2 y6 y; l9 Z6 v' w: W9 J
*addr = save[--i];
" ` O' O/ R4 ? z( k% }" ]
}
$ o( D8 k" ]/ n- f
return (0);
# _- x. d: R" R* d( i) p/ r
}
6 V9 b0 V/ E# \0 e
$ }& b4 P& S/ {. b# ~1 l4 i. M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ X0 m5 W0 E7 F6 q8 _2 K! ?+ q
addr = base + cnt; /* pointer arith! */
, n6 \/ j& a% l9 h3 q
val = *addr;
- E8 E8 p4 u/ F# o
*addr = save[--i];
+ t3 A& I4 B6 D3 h4 b' o
if (val != ~cnt) {
' j. J; `- l& ^% r9 U6 R" x
size = cnt * sizeof (long);
5 l) B1 S1 V9 q1 ^! p: U: r
/* Restore the original data before leaving the function.
, I* c; Y: P) _6 p% @
*/
" x/ }' Z* Z5 e4 u' m$ H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 ~1 q9 e3 n2 L3 O# F. p' n
addr = base + cnt;
' G( z6 |- i6 p- v$ U
*addr = save[--i];
- r9 }! w! o' T v/ w/ V7 S
}
+ V( N4 r. |* J$ i8 s- C
return (size);
3 V) r! q. O1 u& f2 `; D( L/ s
}
- y4 k: ]0 c# \8 o0 m3 L
}
6 c. d# L; y6 w6 ^9 [/ f+ |2 a
" {4 P7 k# o2 n Q8 |3 G# a4 R- A
return (maxsize);
! N7 y' ?, [" O7 E
}
2 X$ n& C X( g* ?6 b
int dram_init(void)
; [2 g7 j" p/ P" g1 \
{
; ^' M' F1 P: q m# k2 e0 `
/* dram_init must store complete ramsize in gd->ram_size */
. [: b1 A2 z. z1 q
gd->ram_size = get_ram_size(
w/ V; }5 p) U" `5 Z. S
(void *)CONFIG_SYS_SDRAM_BASE,
1 Y& \( f6 }1 t4 j
CONFIG_MAX_RAM_BANK_SIZE);
/ m, \. B/ X; F
return 0;
% u5 |$ r; u. j/ |3 [
}
" L: x( i% c) y1 s" B; K5 r
7 c G, M; N8 k; S# r9 f
+ G+ o: g$ B* a6 H- l* O/ G! i: c* H
9 J, ^" P( Z/ i
# o4 D+ K" Q# k+ v0 @# V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 s7 \; J& `3 W' o2 V
# g& ?! E2 y2 v9 T. k7 |9 F M
6 b$ B8 ]4 g1 P# f6 f; H" O6 A
+ n5 {+ E, d2 y" r- h7 x2 P3 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4