嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 c; A3 q. l1 \, T+ X* O+ ^2 D; w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 K8 c( \# R. K& p6 b4 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 w0 @4 u, L. b& m! z5 a; S0 u
: X1 E& j: ]+ F' }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ k0 p7 ]5 Z/ b; J6 m# C
3 J+ t9 A+ H' T' n* H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* F8 R b9 X1 l6 R8 [
/*
, n+ n0 }) k) H* ^% J4 N
* Check memory range for valid RAM. A simple memory test determines
' \* e# a6 R" U8 ]3 n
* the actually available RAM size between addresses `base' and
3 X5 R- L+ ?1 i* c' s
* `base + maxsize'.
) x+ h$ C4 V" z
*/
/ D; B$ X2 T+ q/ A
long get_ram_size(long *base, long maxsize)
0 Y/ a/ k3 W5 s7 m% G
{
1 f, u; R1 L& W8 R/ j
volatile long *addr;
J% U- k" a4 f! m; Q5 f' _- k% d
long save[32];
% ~2 h8 ]* E3 a$ x
long cnt;
: j- ~+ g5 p2 K. q
long val;
* w3 G Z6 U- ^2 f+ B
long size;
1 A/ g3 {" u% Y
int i = 0;
5 g9 A/ f3 @8 ^! A ^* o
' H3 ~1 c% d+ b p) t$ I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 [# a7 M: y5 ~) ?0 m) D
addr = base + cnt; /* pointer arith! */
! z4 y/ d$ z7 s" B
sync ();
2 y8 Q. o% U- M$ K
save[i++] = *addr;
1 N- x/ @ V4 A$ A7 p% p
sync ();
, F, u% j+ H2 ]$ c ]
*addr = ~cnt;
$ M$ _/ D: l I- u/ |. L
}
1 K1 {- X1 ^- Z- V0 L" [
% W7 `. j! A) c* T/ P
addr = base;
# `9 V/ M! i- ?' c
sync ();
; D* w3 s( A+ W- a5 [4 T" y
save
= *addr;
0 u/ v. q# n6 L
sync ();
; u) ?2 U$ A# X, E7 I0 L7 z% ^* g3 Z
*addr = 0;
9 ~: Y: x( h% W
[! T9 \3 a6 D$ z2 P+ d+ k
sync ();
( j; a0 K* w0 B. \. V7 W7 r) r6 g% j
if ((val = *addr) != 0) {
8 \6 d R5 s* a' Z" Z. [" @
/* Restore the original data before leaving the function.
; r p% B1 @, c/ ~0 _7 ^4 {% n5 z9 w- j
*/
6 c' r5 r' l9 m4 z& @7 T
sync ();
% W+ g* K9 ?: ^/ T5 J, H( Y
*addr = save
;
; M9 u# E$ l# p: m1 j& A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( I9 k3 L! N1 B* A
addr = base + cnt;
% {7 s9 {; j* Z3 m
sync ();
7 Q3 x8 Q1 p' k
*addr = save[--i];
$ P# E0 i7 O }
}
! O( I" N8 j! M6 ^
return (0);
# d5 c) r: M2 F( H1 `+ @
}
7 p( {" M4 X7 A" u9 h* R$ |" r9 m
- e$ `# }) Q9 Z. D, D' R* c% N0 `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 n! |8 i2 E' T. j+ M
addr = base + cnt; /* pointer arith! */
+ f) ~; L; j7 n- a6 K8 A% l* V! O' |( s
val = *addr;
$ E% }$ H3 h- ~& x$ z' ~
*addr = save[--i];
% A+ L4 S4 C# m! C. X
if (val != ~cnt) {
% `9 \7 ?8 Y3 G# B; a' U3 T" I
size = cnt * sizeof (long);
5 c2 h; o4 K' e2 K0 k y4 D% ^8 n
/* Restore the original data before leaving the function.
% x/ i' e/ C: ^1 e7 |
*/
( a1 r3 s3 ?* `- w& |% b$ J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, f! x' Z1 w! X m( r" t% F
addr = base + cnt;
6 q- B- @: k+ T ?5 {
*addr = save[--i];
) U" e- s( w$ T' S& W
}
9 N* r1 {" k# e6 v$ [9 u! p
return (size);
E( k/ B+ F G8 D- r2 q
}
; z* n- m8 r. D- V8 @. I
}
' W* I) G0 L U! j
6 I. ^$ W# I7 w: X
return (maxsize);
, v; N8 i% t5 Z9 T2 t: t7 b3 c
}
2 p0 h. B$ ]3 e! q) b5 A4 K
int dram_init(void)
) ~/ Z- ]/ S6 v: M
{
" V/ [2 U' A5 q; B
/* dram_init must store complete ramsize in gd->ram_size */
% L7 l6 z$ h' A/ P7 w
gd->ram_size = get_ram_size(
, {+ a( s) c$ v7 a$ C u# B: u
(void *)CONFIG_SYS_SDRAM_BASE,
8 F8 a( h" u2 m' l- f- `) X! k
CONFIG_MAX_RAM_BANK_SIZE);
; S" B6 k* O3 K; r2 ? {7 K3 ^
return 0;
. l, D3 z5 e7 G, z% C9 A+ g
}
2 \/ A7 d; f }6 p) |
7 ]. U/ R8 g4 m% ^
% f9 a4 I# v+ j- b" u
& U$ w* L, `6 {# [6 Q) j1 w" t
! z( f, L5 s& D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ ]3 _# {3 C/ ~
1 Y0 I8 ~ S( {5 [
- ^1 ~6 p4 u& |4 O( P
$ s( b& E/ P5 r# x8 n# ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4