嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- @% X* d6 C: Z- E0 w- V7 p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
, E. B3 |3 s+ `7 s) t6 b; B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" _8 }- _! H- E
' s: k. Z( U) h1 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ p+ A! w# u. k9 ?
6 U6 Z2 q8 `0 g! r* B9 \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 T$ [. f/ Y5 O6 @& H( O( m
/*
( l! N; h4 t& ~) O+ h$ e2 ]- ^
* Check memory range for valid RAM. A simple memory test determines
! ?. t3 f- |% z' ^% I! L& X
* the actually available RAM size between addresses `base' and
. F% a# ] m# M2 e; H
* `base + maxsize'.
0 Y+ A K0 Q3 M
*/
0 h9 t6 V' s+ [0 m
long get_ram_size(long *base, long maxsize)
1 }* d# J6 q8 Q) r/ D4 b& V6 U; q
{
) v% E4 z& m* {
volatile long *addr;
% @/ | `/ i) M* ]
long save[32];
+ {/ P/ O1 k1 d. j
long cnt;
* E" Q3 H- K& `
long val;
1 b5 |; q( R- U$ S& p
long size;
# ~# h; [0 {* [' Q
int i = 0;
j* O: E3 g3 j) v1 z, O( k- u1 u
9 l) b6 k8 K. U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ k& E( @& z- _8 [. ^
addr = base + cnt; /* pointer arith! */
4 \# G' q/ p. L
sync ();
: g: t! z, N' e) X: }
save[i++] = *addr;
1 J3 y# O. e0 @0 f2 X/ z. S- C( @, G
sync ();
! A" T; S# D( E0 H7 I% @
*addr = ~cnt;
: a) ~- m( o$ W/ W% O
}
4 X i6 Q( F- E: U9 F% a3 e& Z
+ y. F7 c6 U7 B4 k) E" L, ]: N7 y
addr = base;
& w A: k$ b: h7 e7 B; a
sync ();
! w* ~" I% l" [& i) Z
save
= *addr;
7 }) [, U1 V: t( ]
sync ();
3 j, K+ \& D* n' q
*addr = 0;
6 b4 x* S6 P- k* J# d6 s) O
5 L) G+ @7 o" d% j. y+ K" Z, I7 i
sync ();
0 d" i: ? W- K4 g* a* V
if ((val = *addr) != 0) {
$ B/ K1 d) w" H
/* Restore the original data before leaving the function.
& L( @" T8 g4 H, a8 R
*/
) }+ \& b5 Z7 h& G1 J
sync ();
) r0 ~* N2 h; L$ L& N
*addr = save
;
' M# F" |) y7 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Z/ _1 U* P( c3 K6 H7 k
addr = base + cnt;
0 e- h! U1 a% G+ G0 t
sync ();
* x7 o( ]$ l+ P. T/ Y! G
*addr = save[--i];
+ R5 f5 Z1 a. r% `/ V* e
}
' R1 x" i* Y3 N+ d! x3 C
return (0);
: V# |) @) q9 F. a9 ^( V( } V# G
}
7 k' `7 q U; Z" b/ u* \6 K% j
# B( A. W4 I1 X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 ]4 L8 q3 K: B4 p" v% L
addr = base + cnt; /* pointer arith! */
0 n6 d% O+ r5 w$ ]; d9 |( ]
val = *addr;
5 w6 b( v+ [6 ~6 C
*addr = save[--i];
8 g7 ?) Y' ~ K. L
if (val != ~cnt) {
5 l) Y# S$ u: m" g; u
size = cnt * sizeof (long);
; s; P6 V8 C, L/ @2 M4 ~; e5 a
/* Restore the original data before leaving the function.
2 ]# m7 Q& o4 _$ P
*/
) L5 `" M/ Z# S% c$ o6 [( o6 c7 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& N" Z. ~( ?4 Z8 C
addr = base + cnt;
9 v; o" H' B, n4 ?8 g
*addr = save[--i];
* b8 V8 e% u6 W
}
& V u$ c4 }) N4 q9 _# p/ x
return (size);
% C! l8 n+ h: D5 [% r0 Y5 q( H. t
}
. I* ~6 @- S$ _/ m6 S+ f, Z4 L( D
}
0 P% R3 ~7 @" q( `6 a, b' k
! \3 L) {0 F$ R. n
return (maxsize);
3 A" q5 h; Q& d
}
( o; d. m% H9 W& k: `4 n. L& T8 L
int dram_init(void)
: L+ x6 o$ N1 n3 L: g
{
6 n6 i- `" U/ G6 L
/* dram_init must store complete ramsize in gd->ram_size */
6 R" u" h; Y$ D/ w a y9 N: t
gd->ram_size = get_ram_size(
" z! f( ]- J) K3 E- b
(void *)CONFIG_SYS_SDRAM_BASE,
! N5 N& y3 i% ?% E. v& P$ k
CONFIG_MAX_RAM_BANK_SIZE);
/ x# a2 H X, R% i: ?& F
return 0;
3 W% s% K; a" `% h
}
1 t u9 b7 J0 Z% d2 }# g0 b
8 P: H: V" y' g, g# c2 v
$ _1 n j" ]+ u( i( J9 M2 k
3 d6 T7 Y% s4 I
+ D! t! o7 h- a0 A8 I8 y% K* O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' }6 V, k m4 ^3 [
6 G6 u( p/ O4 W" a0 D
9 O j0 l; i2 z6 e+ {4 k4 g5 X
7 P4 a" D4 ?$ h) d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4