嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) p: i& m, p% }8 _4 \7 c; E: |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 t/ _) v9 j0 r% X% s9 N6 f$ [ g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
I9 y4 k+ ^0 J" h* o7 @
+ ~/ z, \! M2 _% [; l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 a1 l) \( `7 h& e: j
2 C" T* J# t/ S% w' O- L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; L) x, F: C t
/*
6 M* V* I3 M Z
* Check memory range for valid RAM. A simple memory test determines
, p* S3 `6 j% x1 |
* the actually available RAM size between addresses `base' and
- R' v$ X' C# Q& q' v
* `base + maxsize'.
8 I9 J8 }. {8 _2 W" e
*/
1 |$ ^- @' `: V" U8 H
long get_ram_size(long *base, long maxsize)
. c e b$ n3 q/ h8 b2 |# L# G
{
E$ A8 t2 j e
volatile long *addr;
3 T5 |8 R( o/ _+ b4 y
long save[32];
+ d8 p, A9 ?& m( a# ]
long cnt;
+ x$ r( y1 V8 M0 ]5 K' p g
long val;
+ f- y2 t3 {* K( L
long size;
6 {; \8 z, G" H# V1 R7 ~! J/ V
int i = 0;
, Q' @7 D! a- K3 j2 y. I: \
`* C' e, t8 g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* l( \, o- ~$ Y# N
addr = base + cnt; /* pointer arith! */
0 B7 u% n, y0 o" S) r' ~4 s
sync ();
+ L" I1 }& d. I) c
save[i++] = *addr;
3 u$ \8 @* ~5 }6 Q
sync ();
0 K. m' l: U& k2 f/ H( X4 x
*addr = ~cnt;
5 t5 u# O9 u% \3 |; D! f
}
( Z/ ?; Z. D% b+ h
) X0 ?% ~! B H8 H' `9 a ?! i( q
addr = base;
. s5 L0 |; ^' q, J
sync ();
' `! j& k2 T' k3 ]1 m" B
save
= *addr;
! @& z4 M- ?: M h9 w, d! t
sync ();
( m9 z) |. T' i0 n# t9 l- u# B; e
*addr = 0;
6 L, M9 i: Y8 F6 a
" f& ]5 ~* T. U
sync ();
5 l; C! U' \8 W8 i( X' e
if ((val = *addr) != 0) {
' o/ Z% S O/ a: H; V. I
/* Restore the original data before leaving the function.
9 `. S! j. B0 a: B5 x
*/
* k! h- L2 Q% E: H! d
sync ();
; X/ y' ]: @+ B4 r
*addr = save
;
% l: w/ E6 N0 q" h/ V& p/ {; w
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: C% b' r6 k/ [: d. z# w
addr = base + cnt;
# m, \, U3 \% o% W4 y
sync ();
i. {( D; P w4 ?
*addr = save[--i];
3 p' O: P! P6 [6 G$ p" m
}
; v* K# b5 @1 K( T) g% V
return (0);
x1 }$ t* F7 u1 O, V0 Y, I
}
* S0 Y1 @' Z1 s- p, E% X
8 Q: v, m0 S2 F9 M! p1 i) }5 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! y! Q6 r1 p' y1 z- P& f7 c& |
addr = base + cnt; /* pointer arith! */
; T5 v$ o" Z- Z5 P& V/ J& [
val = *addr;
5 J/ T+ K9 @/ p. e# w* S8 C
*addr = save[--i];
& {/ v5 b* h6 ~' z5 z9 x7 G: M
if (val != ~cnt) {
: }; H. ~* ?9 @7 o3 i2 C. V; J* j1 f+ M
size = cnt * sizeof (long);
4 B+ h/ m; L Q/ ]2 \
/* Restore the original data before leaving the function.
" I9 F% Q: d( G) n
*/
u9 B5 W) V4 g: ?( L
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: J; B: ^% p: j7 G1 X& C9 G
addr = base + cnt;
' p" ~' G2 y8 X1 Y/ P2 s2 H; p+ j
*addr = save[--i];
e) e- c; ^' M" h) r- Z( o- ~: y
}
1 M" C9 L2 g' ^/ j( t( D* P5 H; p
return (size);
6 d# V' n& z% L9 ]0 w8 M8 Y+ |6 b
}
1 f& c' U: a" c
}
2 n7 K& N) q) x. N" _2 z$ v
9 { z6 A. ~; R- `& J: C
return (maxsize);
5 ^/ X' I) \8 G6 `0 Q! m
}
, U$ n7 v% L- Q* O% Z
int dram_init(void)
+ e! ^ v% L/ f, t- f. P* \
{
: I6 V$ X. {* t+ z8 ~* u7 y( ^
/* dram_init must store complete ramsize in gd->ram_size */
/ o# j3 f# c9 m5 n# F2 e
gd->ram_size = get_ram_size(
1 z0 j8 C; D6 l" p
(void *)CONFIG_SYS_SDRAM_BASE,
/ Q3 g9 f1 r6 T9 X* `& o. a9 d
CONFIG_MAX_RAM_BANK_SIZE);
6 e* y$ Z' a! F' V
return 0;
/ S" a. s2 y5 u. o
}
7 q. |( E: N S2 J! D9 u/ A' W
9 D2 C4 ^( H3 a
t2 }- d9 N( v$ p
- Y# o# _; Z# `- x
4 U9 v7 d1 ~5 ?( [6 @6 h) v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* [( Y3 E: Y+ D" ^* e( |+ d
- O7 \: j' _0 T* m* T1 ~6 l1 a
6 X$ F6 |+ m: k- z% Q4 B$ c
; J; i- o& O8 W5 j* P5 V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4