嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ L; O: ]& w' T; K {
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' k/ j: n8 w+ e( A$ ^, A' ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
e6 [& ?1 X' N) X; `1 k
% f6 o$ F: q# h q- Q8 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 _) {" i5 b- b# b i
) O1 J; r$ e1 V; v0 @; D& r7 z1 B
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 D4 ?) g/ H/ p. v5 U
/*
/ L# O. d2 {/ E
* Check memory range for valid RAM. A simple memory test determines
& _% W/ i# ]% P, u6 Y Y
* the actually available RAM size between addresses `base' and
1 U0 h: V f) \% A3 y/ i+ l. v
* `base + maxsize'.
2 X( \/ @. e' Z: ]) L1 ?
*/
+ l- Y2 B) k( B
long get_ram_size(long *base, long maxsize)
/ I! z g% }9 t& q6 m# p
{
7 k0 R* m3 O9 s$ l
volatile long *addr;
% h8 z5 w$ W) o) P' s3 L% L8 O
long save[32];
2 S& H6 p5 x- u" ]$ g$ d
long cnt;
L) G- e4 }$ G+ P, I9 r/ E
long val;
4 A% K2 ]9 x! X. R& G1 k7 H/ F
long size;
) E Y8 f; L: _7 i2 z
int i = 0;
% S G7 y R* B& O
* ]5 F: f O! s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 B: J# h4 n7 j' ]3 Z
addr = base + cnt; /* pointer arith! */
. n3 L& V4 M4 q9 R( l9 s4 p" H
sync ();
* ^6 B- \7 ], L. Z! N: Y; x
save[i++] = *addr;
4 m; v6 l( W0 p4 H$ O! t9 E" z8 _
sync ();
; l' r. D9 k' b/ X6 d1 ^- p/ S) ]
*addr = ~cnt;
# |6 s' v8 J, B; d5 y
}
& y2 z L# a. j: s6 q; @% h
1 r4 o: D/ w2 s& \ x
addr = base;
! T5 h' I* |* ]
sync ();
. f3 F4 }7 w, G. Z
save
= *addr;
' Y! x! A9 N# N) y" U
sync ();
' ?1 K! `( l0 a5 x' L
*addr = 0;
/ X# ]# Y, @, l" y. }
) c7 l( p9 b. D7 ?% p. O7 y, i
sync ();
9 O6 O0 W0 \5 k3 ?: b5 Z
if ((val = *addr) != 0) {
6 g0 ~7 Z' Z* t
/* Restore the original data before leaving the function.
* N! ?# q2 V/ J! |, T' `
*/
5 L9 w8 Q6 j$ K4 Q) y+ j
sync ();
' _+ T8 `" E1 b$ A
*addr = save
;
: {9 p; r% T( M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 j# o3 B, R2 ?7 i6 Y. h8 m. y0 H
addr = base + cnt;
$ a( B0 W$ _# C+ Y/ z: _+ _0 s& Y
sync ();
/ o( J: X, @3 G4 u5 @
*addr = save[--i];
' ^5 l/ @0 u4 \% T
}
6 X, v( [" E+ v8 E7 r ^
return (0);
: b1 f) ] E) G: c
}
4 f+ H- `8 z0 e& T2 c
2 ~# I' w: D, p& V1 z; Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 N: t+ n# T# C, s2 X( f+ q
addr = base + cnt; /* pointer arith! */
X! y3 B' b3 m, a* e1 }- F
val = *addr;
# C& ~6 u& f) P2 k. f! K0 S7 I
*addr = save[--i];
0 Y( p& W# d2 K1 s( X
if (val != ~cnt) {
* b! R' b: t4 e# c+ E
size = cnt * sizeof (long);
0 _, X- { |( i; Y5 R" {& W& R& p
/* Restore the original data before leaving the function.
8 X M9 q0 h. R, U9 A5 P. |
*/
5 A0 [3 s1 _6 r# f
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' V$ V( p' {2 I! Y$ y& e
addr = base + cnt;
2 T. v* u W( ~
*addr = save[--i];
2 [) J6 C% C% S% H( R! v( V
}
- Y- @- X% E6 d3 N5 U% C2 S; o
return (size);
7 r, ^# S y0 e$ o( m q1 {# ~8 B
}
+ D. F% |* E8 |. b
}
" [. e8 D. u& Z" h1 [
( A, f# m) R! S0 m1 j% B1 ]! d; f F2 s
return (maxsize);
& L8 A6 i0 e0 V8 { c. y
}
! x: ?( G5 y! H
int dram_init(void)
% J6 W5 e% B. h" O, L
{
- t X+ y1 }; f9 B# m
/* dram_init must store complete ramsize in gd->ram_size */
( y# r/ k. q* K. c+ \
gd->ram_size = get_ram_size(
4 Y3 w+ M( j2 A( M
(void *)CONFIG_SYS_SDRAM_BASE,
" j0 B; C6 h, h( h1 \
CONFIG_MAX_RAM_BANK_SIZE);
2 q) T+ o. {1 H) S e6 s, X) x
return 0;
- }3 R3 F2 J& o
}
7 u$ B( k1 E6 T' v6 V# ~
* R R3 f3 k( j6 b1 {
# @! R e# e0 X3 m# P% ]
; R0 ^" ^9 W3 a' Y2 y( q
$ Y; Y. ^* N% ]1 \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 }7 m+ f3 A5 B9 e- ~: ?
$ u# E: ?$ @' w0 E5 r+ Y
/ z# X1 L& @4 F# x) C# d1 {
3 W$ ]: J) }5 X; |; C# ?8 K8 w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4