嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; A) p7 K" G- G2 l- A- F' x/ P" M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ Y/ \. @. N8 x. I; J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 _4 C$ e/ ?" f! z' Y
y* Y4 O* E& ?: M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" V, T1 J7 \" f
, [3 w U' T% }# N4 i, u5 s
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& T4 I# w% Z. f( Y, j! O! V. ~- v
/*
4 ^8 T; O9 A. X& p& J% S
* Check memory range for valid RAM. A simple memory test determines
* }* M/ C7 q" b: S! N1 k' r/ o Y: q
* the actually available RAM size between addresses `base' and
- G' y; a+ h: z; q' U
* `base + maxsize'.
3 o- u! H1 f! _
*/
3 R) p8 O: r) C# S
long get_ram_size(long *base, long maxsize)
& e. d% k8 d( S4 Q
{
' V3 p, Q5 E( V' \+ Y" E# K
volatile long *addr;
+ K1 C5 K* Y1 C0 O" @! `- m
long save[32];
/ ^: P( N0 p' g# w$ U! \+ W
long cnt;
5 J4 s% l5 J0 G
long val;
8 @' o7 v' }, P4 Q$ J$ X
long size;
3 Q& s6 z2 w. G1 O" W3 d" T
int i = 0;
& h$ ~0 w* r2 b3 C+ G( G6 Z
; [4 o7 m% r- t& K2 P8 p
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 n- O! B; Y, \9 {( H
addr = base + cnt; /* pointer arith! */
8 Z: Z6 D/ l z/ M2 b) D% k' l
sync ();
/ _$ H5 h% B2 T R4 G2 @
save[i++] = *addr;
* N" c' W7 a6 A* o) ~
sync ();
; `& B/ M% W; L1 k2 l1 B
*addr = ~cnt;
% T' W1 @1 T, r5 u
}
; ~' K- L6 y1 a% _( T/ L
: a) a% h0 O; H, ?0 d. o% v
addr = base;
4 |4 Q. \/ ~5 D$ n! ?
sync ();
7 ~* F H T2 Y% r
save
= *addr;
& k" l2 u9 [; o8 r8 Z- h: P
sync ();
" e0 M; K* \( k6 l+ \$ P' i
*addr = 0;
7 M9 {( s5 y1 d" i z" ?
E1 a4 g+ w0 D- N# I5 p
sync ();
7 c2 G1 p5 J5 K% u# |# c
if ((val = *addr) != 0) {
, y6 f! ~) a3 s- m" u. C3 f
/* Restore the original data before leaving the function.
) P8 |% W. h2 H6 n2 u
*/
2 C8 F4 Y0 \4 @% c: t+ j" Q" q9 J& n5 O
sync ();
* H4 }% @4 C4 \, T9 w" X' J
*addr = save
;
: b. q- ]0 O3 Z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& }# ^4 O3 t$ Z& l$ l
addr = base + cnt;
6 J- {' p& j7 {% h& Q( y! M
sync ();
* P) E& v6 \3 T. g6 q
*addr = save[--i];
$ q9 w; S) c% G( b' S5 I. q
}
0 E7 K1 \' J7 K' @ g$ Q
return (0);
3 s3 F" q* X M) ~2 h* X
}
5 u$ g5 x( }( P
/ t$ ~! T* v s+ _
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ z$ u, A& M/ n! N
addr = base + cnt; /* pointer arith! */
: S2 @, M) P1 U+ Y# n+ V9 h5 {
val = *addr;
& f5 w8 M# g+ C- `2 F g
*addr = save[--i];
5 `% t: Y5 Z' \
if (val != ~cnt) {
f1 X0 L0 M- y# g. x6 R$ b" F
size = cnt * sizeof (long);
, f. T) j( y) i& U P9 @& m
/* Restore the original data before leaving the function.
8 S- F: u6 g: `& t& M
*/
; Y S6 j* V" e+ ~! e" r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 j c" E: k. j: ^* ~
addr = base + cnt;
7 X0 s2 ~& s3 ~6 D
*addr = save[--i];
, m. G$ |" i- [* I4 U" g9 l- H
}
+ ~; D5 R; Y; l# |+ Q
return (size);
; R, g. u0 B) [% L7 b4 k" l' O
}
+ S% P8 o3 k6 b( b
}
/ P1 l' F d3 A; {' H
% D: K6 T9 T' H, O: P; f8 ?
return (maxsize);
' L) t6 ]$ b+ S* v. Q9 K
}
) ?9 ^, X9 X% Y, J4 _! u* }
int dram_init(void)
# g1 \. @6 g2 q! R
{
4 | X0 v' |( F5 u
/* dram_init must store complete ramsize in gd->ram_size */
: X1 W Y3 |7 L& v7 Y
gd->ram_size = get_ram_size(
: J& ?7 v8 [ I' L% ^( N# S
(void *)CONFIG_SYS_SDRAM_BASE,
4 b3 w4 `: k0 e% C. t7 k) ^
CONFIG_MAX_RAM_BANK_SIZE);
1 u& x E) ]' _! }
return 0;
% k+ T( m/ }! b! L
}
5 m$ M; D% `, ?9 y) D" C
& K, U# m g; B' A+ c/ d9 N
, g ^+ s& d+ A$ f; r; B- X6 h6 e
; {: l1 r, _* u/ F$ W
. F3 l+ t. O( P+ a4 t' | i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 z' i% F% K- p8 b; s3 N
7 h9 u8 b! Q# C
8 ^) ?- I/ s! F V, N) j: r
0 O& Q' G1 J9 K9 ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4