嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# r. t! m( ]2 I i& P0 A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& Q# i/ K, s: ?6 Q- |& i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 [4 m1 }6 T; C4 t/ _6 ~3 J
! i% u& V/ h# f4 T' P' y* J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. `0 ]6 c6 |4 A, O
- K0 ?1 z4 } C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* p1 Y' z1 B# B9 Q! Y
/*
- Q! h, T |7 ?9 T" V- D
* Check memory range for valid RAM. A simple memory test determines
$ I0 O( g E+ y
* the actually available RAM size between addresses `base' and
' N' e1 h4 t% L( ~* E; I
* `base + maxsize'.
: E: B' w: N# g% V8 f& o. A
*/
7 X/ r- W: a, \# I9 A
long get_ram_size(long *base, long maxsize)
0 l# k# }* U, b
{
; H$ d1 I- c) _7 Y8 m
volatile long *addr;
1 V& w9 z1 L' ]( A' H, `. u5 S
long save[32];
+ K' l( f7 @+ |2 T# [( O
long cnt;
; K7 P) e( [' r! V; G1 b3 e
long val;
3 L& T3 S# m9 [( n
long size;
# G8 p5 _8 [2 s3 G2 N8 ~
int i = 0;
- d8 P$ w; s$ @$ T; w; X; _
, J, M& }* L/ C4 O% r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; }+ N+ J( J/ R: ]" S# q
addr = base + cnt; /* pointer arith! */
6 L* m1 ?, o: [5 H8 k. J7 f
sync ();
: O* t' j, }! d. b |4 F
save[i++] = *addr;
$ w" g1 q# _. q
sync ();
* J3 x) i Z7 J0 c/ P/ \
*addr = ~cnt;
$ |; [$ ?; M' Z* L8 u
}
% p7 Q0 \! I# p2 u: Z3 @5 x
) Z: l3 h8 D& {
addr = base;
. _$ ]; d4 H& ~
sync ();
: ^/ @* v4 |9 V$ B+ L6 J. b
save
= *addr;
( r) [ E9 X1 g
sync ();
` ]& a4 q R& ^3 r4 l
*addr = 0;
& W! }+ Y6 i1 ]/ u
7 h7 j E" K; r6 O# o
sync ();
, h3 k! @$ z/ V1 F
if ((val = *addr) != 0) {
* I# c2 _% p1 K5 a" Q( \
/* Restore the original data before leaving the function.
, I0 B6 x5 F: E& W9 M# Z* |
*/
9 ^. a9 v; Y+ ?- R
sync ();
) H7 T" M4 U: p7 t( |3 T% g$ G d
*addr = save
;
+ H4 F! u$ U' Y5 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% L8 ^' p: O4 M
addr = base + cnt;
1 `; f3 i. z- }3 j$ ?$ P: |8 s0 f
sync ();
( A( z$ k0 F7 k6 l
*addr = save[--i];
% y& p+ t4 t5 Z( p/ V; L
}
2 f/ W( |* q# C& {' T
return (0);
1 w r3 H, E0 F7 }+ t C
}
, [9 A' o, T+ l$ ]) H+ ?
5 \% P+ x+ a8 ~: ?0 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( A6 B3 j p0 R3 B
addr = base + cnt; /* pointer arith! */
5 H/ t L9 e& z1 }7 {7 q
val = *addr;
7 u9 W! B: i, [0 ` A( i
*addr = save[--i];
$ |. R- ~9 c ]0 y; d& F _6 j9 F
if (val != ~cnt) {
u' I) x# U. f: u; O/ F
size = cnt * sizeof (long);
( O7 a; X1 o& a/ m+ H* W" j/ Z+ e
/* Restore the original data before leaving the function.
4 g% o+ l3 m8 @, {+ C+ o# F: w( ^
*/
$ f3 P& I! q% W9 p! V$ d0 s: C
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ s9 I+ o/ w0 z2 B/ \& `8 \
addr = base + cnt;
' X, R4 s$ G7 R9 Y( {. Q" h2 k
*addr = save[--i];
, q" {" _9 v$ }
}
9 P! u: r2 x2 V+ f' u
return (size);
7 `" O4 J" k5 w+ ^- Y
}
9 H2 o; H5 ]! H, x3 R+ b8 o
}
$ f3 d9 F& h& s( W7 |! J4 S$ A
0 E+ f* O) F# k
return (maxsize);
1 n- @+ [+ q, m3 V9 T1 U
}
1 `$ ^- w) k5 W1 g5 Z: \
int dram_init(void)
7 X3 Y: C6 k! _8 p$ Z. Y
{
! U* d# Q4 e7 R, z: x7 K3 J
/* dram_init must store complete ramsize in gd->ram_size */
' O, ~; q0 W& C# o+ L
gd->ram_size = get_ram_size(
+ W! l- ]3 i0 T1 L% O2 Q
(void *)CONFIG_SYS_SDRAM_BASE,
! T9 \' \1 f6 S6 J6 Y! e! S
CONFIG_MAX_RAM_BANK_SIZE);
, n- t) u; f7 n; W# ?. T
return 0;
* h1 f0 M$ u9 k8 v+ r1 C- {
}
2 T) L- }+ H3 g: Z
) K1 J- Q3 J- s0 N" s$ J+ u& ~7 q
0 V. `4 w+ v; |. ~
- b7 A/ F+ \1 }6 d, ?
& d6 `' H: j4 i+ t: ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* s& j- _* m, C3 N4 l( ^; q/ O5 ^
R" V+ r8 U( B' Z0 a
3 }- ?6 N9 _4 T7 k: q, z; o
* I: [ }9 M0 P) j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4