嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% s+ L8 z+ ?' q, h( @8 G+ C c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ n3 y$ D2 w2 ^7 ]4 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 R1 i R9 p# s
9 M" \' c U! e+ @" J( X6 t5 m5 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ p4 G+ E4 p; \* Q* z/ Z5 U
) Z2 c% ?% k+ l. c8 g( r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 g; L+ R4 H) g
/*
" W9 h! w5 c/ Z) g+ d
* Check memory range for valid RAM. A simple memory test determines
; G2 w/ A0 [. S
* the actually available RAM size between addresses `base' and
+ k) _# C w4 ] D) { n
* `base + maxsize'.
# x: A8 I! {$ v5 f! M9 M
*/
; d3 t! p( O+ x: G9 y- y
long get_ram_size(long *base, long maxsize)
& R! P# z! ?) G, k* @ \/ _8 J1 J
{
- ? q( E9 w, j
volatile long *addr;
( J/ C0 C2 q+ E, ~; c
long save[32];
, m3 T; k9 k1 ~4 D
long cnt;
% B3 I5 x# A/ e- h
long val;
$ X& { n( c$ E% N
long size;
0 o2 a6 [& [* G4 K8 b
int i = 0;
* Y6 x3 q6 l, M8 f' h7 @
2 G2 H E a/ g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" N. I: y: `6 }7 a/ A0 u v
addr = base + cnt; /* pointer arith! */
5 T* |$ h# h L! n, c! g, S$ d( q
sync ();
9 K* D. n, f, \. Y' Z; r
save[i++] = *addr;
) \. c& i4 g/ L5 J( J
sync ();
4 M8 h6 Z2 v$ Q& N+ l! {
*addr = ~cnt;
D, o o6 p$ O7 ?
}
& K0 E( ]8 M/ X1 J
1 ~% T" w0 v6 K
addr = base;
0 [* O3 J" ~$ [ i+ z" F1 ]
sync ();
. {: _5 Q$ b4 u; I
save
= *addr;
7 J: p! ]7 a" `% V# m0 J: u
sync ();
0 E0 U$ @9 C2 F6 }8 o
*addr = 0;
f- h& L, n( g T; f l0 l
+ F9 Q! ?& L |5 l
sync ();
4 j' G2 m2 |4 W+ }' ?7 h
if ((val = *addr) != 0) {
9 n2 r5 A. ?( S7 @0 E( B9 s
/* Restore the original data before leaving the function.
: ]. r, G9 G7 X
*/
- U" I7 y4 Q) W6 \
sync ();
* a: R7 I7 j& _( H* z' Y. t
*addr = save
;
, A$ t( X: z3 i, H& r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 p) q9 P+ X( w- @5 `- }( O
addr = base + cnt;
) ?. ~" I; q, e" L6 m7 O
sync ();
7 [# B! R1 t! E, U" ~: e
*addr = save[--i];
- S' ?; f6 P4 y1 y3 J( r
}
$ o8 n4 g; F" Y+ F/ s; h
return (0);
( K1 l5 `0 X1 }6 G2 t
}
' u) s6 V: s. v4 \
5 l2 H' P. L3 C8 |- D+ B) Q3 F
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 w3 t4 W7 _# L" R
addr = base + cnt; /* pointer arith! */
$ S2 u' ?7 g5 Z- \1 C
val = *addr;
! j: w- y3 t' o
*addr = save[--i];
) _2 ?. a& { |4 E6 x
if (val != ~cnt) {
, w1 z# _1 Z6 z6 z
size = cnt * sizeof (long);
9 t% a5 o, G6 a! O4 m
/* Restore the original data before leaving the function.
" { a; d& v! M' p9 Z7 |
*/
w- D6 J" o. K3 H
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& P2 n, [( w) u. k
addr = base + cnt;
- q, B: N% U, W% r9 i, Z
*addr = save[--i];
& E/ h9 R, Z3 k# T2 c Z% n* P
}
7 k6 c" B* E( F
return (size);
c: m6 z% O ]
}
3 T" ^& A- R4 D# H' [4 v8 U# ]
}
0 p; e I- z5 l( m, m) ^2 a
4 }4 N' x4 W; ~0 w! N
return (maxsize);
) q$ j# g0 }- M9 Q y9 @
}
0 M" N& H' W8 G( u. h2 W
int dram_init(void)
' K N1 S+ |9 d2 N C) r' P1 O) b
{
. X- u9 p+ Q% q6 [" G" e& X
/* dram_init must store complete ramsize in gd->ram_size */
9 ], {" p: w" `4 w8 z6 j( z
gd->ram_size = get_ram_size(
" w" M/ k1 {3 z7 D8 l
(void *)CONFIG_SYS_SDRAM_BASE,
% A" o( }" l) s y
CONFIG_MAX_RAM_BANK_SIZE);
( F& [7 g% O( [& ]$ m
return 0;
5 ], z6 X! @- r$ ]( P7 w
}
* L2 ~. b7 f, d1 l. ?( \; z* H
4 O" M+ I5 V6 L3 j/ i/ f
1 D& J' Z& |6 N2 w( B$ @2 A
; G$ U$ ^. c% ]/ Q7 K: K$ i
' P( ~: S) C9 [1 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& o. `# q9 ?# O% Z
! R! G. j0 y* d s5 r2 P/ d
2 g! S/ ~% d6 F5 ~
6 Q2 A- l- q* Y9 u+ `- K7 c
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4