嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 g2 o. U3 n* \! O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. b! o0 `6 \$ [& D! a: o7 W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" N T2 l; O3 b( e$ W
^5 n# B; c" h0 b- ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 x% t% b5 O$ D" e2 i% b
# m+ a L0 e5 \: d
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: U$ ^# k5 [0 L6 Q% G, D
/*
" y. o0 \! W6 |: r9 J
* Check memory range for valid RAM. A simple memory test determines
- C" c5 A0 ?* B
* the actually available RAM size between addresses `base' and
( n& I% F! F! q/ h: o
* `base + maxsize'.
9 B7 E8 a/ k/ ]& b
*/
' m7 l' W" L* S% e
long get_ram_size(long *base, long maxsize)
$ ~/ \7 p) i- d9 H5 |9 `* v
{
( y1 n5 T9 C# h! f- w( E
volatile long *addr;
5 r# R3 ]" ~- e/ Z
long save[32];
1 N+ T% D+ A; l( ]) ]
long cnt;
1 |' U. Q2 M$ I9 t2 T9 C
long val;
1 y* r% R( s& Y \( O
long size;
2 q" }1 P1 C, u1 D
int i = 0;
: A7 \! i+ `* v' T" S
' G* \4 A I- ]8 Q8 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
P+ P+ ?) c2 `
addr = base + cnt; /* pointer arith! */
" f2 C6 w& _# Z$ o+ |5 W5 @+ e, s5 s
sync ();
X- M4 Y: m1 ^, o% h) L1 Y) F
save[i++] = *addr;
% `. u0 v: b7 p- W: B" C1 b9 ~
sync ();
/ d. ?# \8 Q8 h S
*addr = ~cnt;
" ^8 A# Z" U0 o. M6 y4 }
}
! ~1 O$ r( E% u, l3 x% m5 J
/ w4 Z: i4 l& g; x7 l
addr = base;
1 o; u; w0 \5 G( z
sync ();
# T1 N( ~+ W: I3 E" R* ]! i# i
save
= *addr;
: U* f* ?1 A9 _; r, u: o' q
sync ();
. w/ f: n. C. e! F! y, t
*addr = 0;
/ B0 E& M7 e% E( B& @
7 `0 v, D( h1 k7 z1 R0 g
sync ();
B- Y0 x K4 W) L
if ((val = *addr) != 0) {
( E \6 X3 B9 r$ Q0 X) Q3 F
/* Restore the original data before leaving the function.
/ Q* @: R7 \0 F
*/
/ s7 G6 p- x) y. @+ Z7 { x
sync ();
7 @* E' K3 X" D0 J
*addr = save
;
2 Y# F# \, J; [6 H; N) ~- ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 g6 s% t0 G# ]" F) v0 C
addr = base + cnt;
5 u' S3 H* p! l, b& m0 B
sync ();
4 U$ g$ i) k+ _1 ^/ I# h
*addr = save[--i];
2 @4 V; [- ^8 V6 z( u
}
0 P0 f$ \. U+ }( D, ]6 q6 D( v$ G
return (0);
% E9 H! `4 F; Q( j5 c
}
& I& l* z2 Z& ^1 M) M
9 S4 U5 R6 v+ o1 G; Q1 v( {
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 h( v2 Q% l$ H
addr = base + cnt; /* pointer arith! */
( f6 u7 K* ]2 h; Y! u
val = *addr;
( h8 g. a) X+ ?, K y
*addr = save[--i];
. D" j9 Z3 T3 D/ W6 @
if (val != ~cnt) {
+ N2 h$ o0 a$ `+ i# w8 l
size = cnt * sizeof (long);
* S& d* D1 h4 B( _1 o3 ?
/* Restore the original data before leaving the function.
! w1 n; b. e1 A( l- @% q
*/
* x, e% q: ~5 K% P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 S$ O! Q, T% w) G5 b2 D( U
addr = base + cnt;
3 A5 H K/ ~8 ^
*addr = save[--i];
2 q9 f& y4 t! @/ f. K
}
. z# K8 L# o7 U: e0 x+ D$ ]
return (size);
5 s/ T2 A" A, V3 J. Z- y
}
0 v" Y) t: u; k7 |0 H
}
! O# h! E: E, F4 B' B' X0 J U& W
6 g* e* z8 w0 i, c. F1 o# ?# b
return (maxsize);
* }( K; K9 G4 e3 u
}
; t" v6 e: k, u" k4 T, F
int dram_init(void)
% `; I% O; D' U; R# C/ v4 B+ n
{
4 H* x; `1 I" ^' i
/* dram_init must store complete ramsize in gd->ram_size */
. E* p. L1 s5 {$ i- Z# s1 O3 z: h
gd->ram_size = get_ram_size(
: U0 L& X- j0 q: V* v
(void *)CONFIG_SYS_SDRAM_BASE,
: T6 D2 z$ F' Z( V
CONFIG_MAX_RAM_BANK_SIZE);
& z2 M& E3 v, O8 i( e, i2 M. e
return 0;
( k f/ k) U: G# t* T) u
}
/ C6 t) l: d- f' ?3 d9 G1 c
6 R6 _" W7 o8 H5 _, ^
4 Z/ B, [; g# O5 y1 I# j& U
; w6 \0 N' T f( z7 u# i
) W" c, O9 B! x, d9 X: p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# s* d3 s5 n5 ^" A! D; q
; v% O" }2 x& m( R" G- f& P
+ y% T' a. u$ ?1 Z
E/ }7 ?; |& g, @( E. X% g! x
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4