嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' K4 Q8 ?4 ~, y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: L+ U! K" [' t$ u' U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, ^+ b" ?+ r5 t$ p1 W, G" Q
* R1 }8 V4 v' N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; G" K; d- j( s6 u R, Y9 m
5 f! E1 m3 B0 ]! U' l7 e( b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" J- v( z6 s Y+ |
/*
$ {; @4 O$ J1 s2 L- p, h2 E! M
* Check memory range for valid RAM. A simple memory test determines
% E. }) a2 h) l4 A
* the actually available RAM size between addresses `base' and
5 I& e+ E$ T3 `4 X2 ~
* `base + maxsize'.
0 k6 L/ g* P, o8 |2 O, |
*/
1 N* t) X2 @- P& m) v5 }
long get_ram_size(long *base, long maxsize)
+ K8 l( U3 `3 n0 |- L$ \
{
( _- A7 p2 u* x- L t+ X) K/ n
volatile long *addr;
; f5 q; q' A* H- z$ {* _
long save[32];
8 \2 W& M0 k. K8 e7 `/ j
long cnt;
5 `* x9 `, v% E6 E" p8 z ^
long val;
8 A0 y* r) }5 N0 k2 ]9 _
long size;
* I7 P6 [: u8 x
int i = 0;
. X" I/ O; Q! Z
& @$ O) ?1 T( }+ {9 c% [
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 R0 T9 X5 V( f+ U+ s: \. h& p2 H
addr = base + cnt; /* pointer arith! */
( }9 l) ?, Z9 i/ T/ v& Y
sync ();
( w, |6 n" w$ S( g/ F1 h1 ~2 q6 x# K/ L/ D
save[i++] = *addr;
6 |% h! u% j/ j# F2 |4 c7 O7 @4 S' I/ n
sync ();
/ F0 z$ ~5 P) W/ Z
*addr = ~cnt;
5 C' w( t* V& a
}
' b5 u; ?, @2 j# k7 J, l
1 A; T$ o+ K+ z; @1 }5 s) A$ p
addr = base;
9 m+ ~1 _% R0 D2 _
sync ();
0 |- Z+ \; w% J8 p
save
= *addr;
3 J. U0 U5 U/ F9 L
sync ();
9 A, F; R$ J9 c( p2 |
*addr = 0;
- D9 c1 \$ N r7 l7 A$ a2 b
1 F, I# K4 S0 i* J! p7 @7 J' I5 T
sync ();
* [* F' h ?& f
if ((val = *addr) != 0) {
# c; w0 E" P4 v3 Q8 O
/* Restore the original data before leaving the function.
; P8 n5 X, s6 Z2 ?6 Q
*/
+ L5 b7 Q- ~5 F1 T* S
sync ();
. R R0 i; X5 c2 N8 d
*addr = save
;
# t* w! L9 y5 c* C0 B; X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 Z& C4 D/ ^% H6 A9 o# c
addr = base + cnt;
9 _/ @; J& w2 |( c; l! E3 T4 l) x& `
sync ();
1 C5 M6 j" i9 }4 `# V% y8 y
*addr = save[--i];
: O( J3 F+ J) w7 `: \' L4 j
}
: c k% z* L. r8 K# Z+ D2 _' A5 |- e
return (0);
+ h5 V1 ]* s U
}
% M9 t5 g: L8 x+ c
& L$ q' M% f/ C
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( B+ [9 j, y$ U( P
addr = base + cnt; /* pointer arith! */
( Q s3 g6 e. k6 U6 H4 W! m
val = *addr;
7 G/ E( b& r9 N; Q# L& @
*addr = save[--i];
: J6 W0 M% o- b
if (val != ~cnt) {
6 C1 p% d6 |$ l: M
size = cnt * sizeof (long);
* E! o% s, y$ Y |; n1 V3 j4 p
/* Restore the original data before leaving the function.
0 J4 p! k3 d6 p4 z8 M
*/
0 s# ^' p. C( E% A* i. \, m* x
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: o6 A, a! x( i' B0 q9 ]7 g
addr = base + cnt;
' q0 R0 w; \7 o7 U* \. L( k; U6 Y3 f
*addr = save[--i];
! ]) [; E( H5 \) c. ]0 r
}
W( A$ I5 ?: Z
return (size);
) a8 O) X- [: G5 M& _" [
}
& g' q# O/ n0 ] v
}
+ l9 [7 d/ v @" x/ }
5 b7 v% }0 K' m( H
return (maxsize);
- \; j. E. K- K: v# k
}
: |" Z; n! l' c: F3 {5 h
int dram_init(void)
9 k/ ^ A! P6 E, O5 z
{
2 K7 F3 {7 U- \* O4 W1 j
/* dram_init must store complete ramsize in gd->ram_size */
: }: q% B# P% v# h1 U/ f
gd->ram_size = get_ram_size(
3 F7 e; |4 O7 ~/ t. v) V
(void *)CONFIG_SYS_SDRAM_BASE,
8 {7 N/ T: ]* Q) p, a3 X t/ V
CONFIG_MAX_RAM_BANK_SIZE);
: z+ K, [& n7 B
return 0;
/ @2 T9 E) ~7 \1 V: v$ h
}
1 X5 t+ K8 C1 U0 S
# x# ?! x" r# W+ `$ J
7 A! @4 j/ W2 U4 E/ L$ e: g
% b( }" P0 r. }; b
9 k1 ~, R! Y; V7 T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O/ p% K7 J+ \1 c
R' w# D' K% j/ `" I6 u: P
" i5 s8 [6 s, b$ J ^
; E i- n; \6 @; _: S: E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4