嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ w& O1 r/ a. P: d
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" s7 H% x8 h4 W7 J/ R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* h& ~7 U2 A% F8 F. B C5 j
( c2 b8 a) [' p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' y+ B: [- U' \9 c
4 l# {6 x+ \3 p
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* o) |- ^2 b$ O6 @% C* ]3 y
/*
7 b! D- g' v8 G5 t
* Check memory range for valid RAM. A simple memory test determines
/ r" {/ S/ ?! H
* the actually available RAM size between addresses `base' and
$ C7 n* u6 T- f: m I
* `base + maxsize'.
" E" u$ _$ m! ?! x3 K0 x
*/
) u5 W2 D8 [+ @( @2 L3 F
long get_ram_size(long *base, long maxsize)
?3 g: e5 @6 J/ E/ [# d' o
{
$ [; X2 i( `. ~
volatile long *addr;
c2 y$ y# K( i. c# y2 a
long save[32];
+ }+ t/ j! P& b- ^0 E
long cnt;
4 V M: R9 a J0 \
long val;
9 h+ i; ]+ K8 l( Z' X
long size;
- y" U# c+ b2 g
int i = 0;
8 s' F" j/ U F% ~
9 v1 V) K, F" G4 N* N& @1 u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* H7 R# |) d& o$ S: @# P. P
addr = base + cnt; /* pointer arith! */
" y+ c6 n) H# W" _* z8 Q/ i
sync ();
5 @; l: c/ R5 T: c4 \5 M4 X
save[i++] = *addr;
- \, e' V$ U% M3 t0 t
sync ();
$ l. {9 ~3 W# Y+ h
*addr = ~cnt;
. k3 }# i8 B% K W6 G
}
9 G" c. [2 I% S0 m. ^ H
! U8 y( e( V7 |: `! @3 k* E& @
addr = base;
N L+ k( z5 F0 S" L: c0 i* H8 h
sync ();
4 e5 `9 c- e$ E: y2 }
save
= *addr;
4 `. K. M6 }- U
sync ();
$ \& g; v p4 N5 `+ R
*addr = 0;
' m0 Y1 Q: I; o; A" F9 ^2 |" @4 R
! l8 N7 i8 A& [: b* q# m
sync ();
4 e& |) W' i5 o, e; \- t/ @/ t0 N
if ((val = *addr) != 0) {
/ X& w; d0 j! q0 W" C
/* Restore the original data before leaving the function.
( Q- j: M1 [& y/ r* ?1 x
*/
' a `8 R/ }4 S- n p9 W
sync ();
* m" v; C( q( u- a. m) r
*addr = save
;
K! B' V0 g! I3 K8 `& V1 v q) i$ } p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. _& C7 E! M. n3 ^ C7 \
addr = base + cnt;
* K# C- c2 s9 i W; }* ?8 U' Z
sync ();
8 }* M7 y3 _& ? j3 k
*addr = save[--i];
9 S1 s. P# J p- Q
}
: m# E1 p1 m: K# H, Y4 J, Z K
return (0);
/ b7 {# e% }8 `$ s# y) k
}
1 R I* k0 w2 f4 h9 J
6 E, \( D' N d1 x# g w6 j
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 l* d5 r+ m8 _# o& R5 o- e
addr = base + cnt; /* pointer arith! */
2 T( I# Y; G$ u U: t( }8 Z% G/ ~
val = *addr;
# {& c4 z$ p* @' L8 ~
*addr = save[--i];
3 D; ~! l; B3 a3 N" Q
if (val != ~cnt) {
8 v/ q) x6 {) x# k
size = cnt * sizeof (long);
8 \5 g# w6 {% `/ A$ `& h" J/ h
/* Restore the original data before leaving the function.
( I) s* L$ a* H" d
*/
8 Q( ~. v' Q; y% f0 [1 ?) v, Z* |" T
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 C3 f; b) {# S, h! E! f# j
addr = base + cnt;
( m3 @/ }/ h8 d1 H
*addr = save[--i];
6 e6 Y5 k4 ~3 h" \
}
8 w' q5 |( p% M% \# |' q
return (size);
. X6 y. p' \! P0 Z0 E
}
" J* H. w& ?% v% B+ o% a
}
) f4 M1 b8 C+ L
2 `- g! m2 Q* P; P1 n1 J
return (maxsize);
$ _+ X0 n. y& V$ `/ F, H# b
}
0 a+ u; a4 @& Q: t8 e
int dram_init(void)
5 ?4 V8 C; |& q7 Y/ x0 l
{
! \0 S" o1 X i: f+ ~( u/ |
/* dram_init must store complete ramsize in gd->ram_size */
! D% {) T+ z) z7 H, }% y
gd->ram_size = get_ram_size(
4 o8 ]8 ]" b$ i! V) Q+ [+ Z
(void *)CONFIG_SYS_SDRAM_BASE,
8 ]8 v. Z$ u7 N* V* j
CONFIG_MAX_RAM_BANK_SIZE);
# i5 E5 i K. j' \1 D3 \
return 0;
/ O% U( u8 ]6 ^4 q+ R U+ [8 `1 L
}
0 Y% {) B! ?1 M: h
3 r* {$ [ a: K# F6 m
% @% P3 i* r# B5 b* m8 {' `1 h2 I/ z
/ ^8 F; h& }( G: ^4 J! C( C( z
! a: f4 [2 z& V2 A( \ U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 _$ ?& u" |7 v4 K% \7 @
; I) \2 F. P2 l8 a
: H5 u- p- I0 }6 t z1 v
7 T$ D6 z2 w) O) g
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4