嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 A: ` E/ r) F- K0 ^2 B6 b7 t7 ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 G6 E# C8 h ^0 u4 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# s( l$ P% @3 o k& Q5 k
. @( v2 X* X& Y$ P. M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" S$ Z' p' Q% c9 U0 D3 V' a% U
0 a5 m2 D$ Q3 F9 F4 }3 C' G
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
g9 H% b2 z. _5 B1 d, S# x
/*
& d7 m! w) w" _! R& v6 K) {
* Check memory range for valid RAM. A simple memory test determines
* q |( g O" b6 c& d" e) V: r
* the actually available RAM size between addresses `base' and
5 P1 G7 c2 C0 `
* `base + maxsize'.
4 o$ X2 X) t' ^5 I
*/
d6 `! G% e1 k& ~$ x
long get_ram_size(long *base, long maxsize)
% I% r2 I" v* H, R0 ]
{
3 A- y' K: _" ?
volatile long *addr;
. d* ~. h3 J8 m- S4 r) V: b
long save[32];
2 U4 e: ?7 z3 d* ~3 O
long cnt;
( N- t; T4 l9 X! P5 J: X y
long val;
% ]; Y! a5 y) r9 m% F
long size;
/ b3 H2 E1 T% ~6 Y9 H$ A" P! g
int i = 0;
0 ~* M7 S. @9 X, @. G: u& W1 t
5 Z' {% f8 R% o5 R. z3 s5 m( Z8 ^
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" S4 E! v3 Z. l
addr = base + cnt; /* pointer arith! */
) C( ?& w0 T- h7 J
sync ();
/ U3 q/ Q* N4 i/ D; {4 t
save[i++] = *addr;
/ I* ^$ D. R' U8 a) ^ g
sync ();
# G, s5 x" T d) R; {
*addr = ~cnt;
. z" u: D R' N& x# k: |1 o% b
}
: X* W0 v. V; S# U- h
4 G" B, A; F" b& t1 C5 j: u
addr = base;
6 v$ [% O- v$ Y+ W
sync ();
$ ]! F; u! z$ h7 {3 y2 C- }; k( V" Z
save
= *addr;
+ p; |; y/ v! t. f
sync ();
+ B: Z# C% V8 g
*addr = 0;
- g+ X( c: R# p( o- ^
6 o& ^' { I; v2 S+ f: e8 q
sync ();
& x6 h, E7 U1 e: e" A2 t8 C
if ((val = *addr) != 0) {
# u: E# U1 k6 X$ z% t
/* Restore the original data before leaving the function.
0 v1 c! S; G Y, I
*/
2 `% N0 R; g9 R* r: H+ _3 u# n
sync ();
( _' |& [2 q% z+ V
*addr = save
;
) d1 m" T, |$ }. A$ v" O! ?& E0 E! V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- C8 `# B' F1 {7 R: {
addr = base + cnt;
( a# c6 n4 d, H/ W/ u( Z( Z& `& L
sync ();
5 K0 l, A% {' g8 _4 E# B& [% Q3 x
*addr = save[--i];
( h5 N* w4 y' A8 \- s$ s1 ?1 d; }
}
2 C! x) |4 P; ~- N
return (0);
3 i! b$ E- C/ a# G) Z4 ` _
}
7 j# d* M8 h$ x. D, c8 O* B
b! z0 }1 ^9 |9 p4 Z' ^6 v
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 b& D& Y: K) H! l, k9 [: F
addr = base + cnt; /* pointer arith! */
1 y6 y; ]. M+ X7 {0 ~" ~
val = *addr;
& E2 o2 [: p2 e9 }! d& w8 N
*addr = save[--i];
- R7 V! G4 W4 F: O F+ S$ c
if (val != ~cnt) {
. C' I3 \; L9 m w9 I: a
size = cnt * sizeof (long);
5 l2 e5 z6 w) \4 G& \5 F& f9 q7 R
/* Restore the original data before leaving the function.
% n4 R: ?% M7 g
*/
4 k$ Y1 D9 v0 i: T8 y/ D; D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 c' e% u0 v* p3 W( E7 p, a( S
addr = base + cnt;
s+ L! a+ A3 U' T0 L
*addr = save[--i];
+ \6 [( l. o$ b& P, E. [
}
% E# T& ?! _3 J( r& Y5 d
return (size);
/ k. Y9 G( ]' q
}
# I* L" S) D: l) d9 p2 d8 O' E
}
+ P/ z7 |; D7 D! |6 R
; N* @4 k; u0 m# K# V
return (maxsize);
' S2 v9 l5 a. A2 T
}
) V, q7 e, D# y+ i& T r3 Z7 w
int dram_init(void)
2 Q& D$ c$ ?& n4 K+ w5 m% W
{
& Z& z- e5 J3 h! y& N6 W9 \8 ~
/* dram_init must store complete ramsize in gd->ram_size */
; j( P N+ ^, x! F7 z& q
gd->ram_size = get_ram_size(
6 e0 n2 V7 Q" i+ C6 H5 t
(void *)CONFIG_SYS_SDRAM_BASE,
+ |, w$ G' i3 C* k
CONFIG_MAX_RAM_BANK_SIZE);
3 y+ l5 Q9 N0 ] o
return 0;
+ B. v2 a0 V3 k; a! o; T* i
}
s5 |$ o7 f, D
4 ^" c0 V! o: R4 I V
& z* Q& p" y! N! V1 P; C* h( ~6 Y4 j
0 Z4 |1 B- J* w+ f! A
% {/ q) a6 [8 m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" v y- w9 H5 w9 Q
: j7 C C# j/ w4 a+ }/ H2 E$ c
9 H2 h y( P P8 H. E0 a7 B
' i' c) c0 I5 ?; A$ M4 }- Z1 U& z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4