嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% y I* o+ p \1 f8 [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 {$ s/ ?( ~3 @* b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& p5 D/ l* a! @" v: r7 i3 \
8 x K# Q5 m8 H7 w8 i8 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' x( E7 I4 a$ ~( ]( l) v2 U+ E7 y
7 z' u% l; Y6 Z! Q& ?2 y+ y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- C* X$ ]/ H, ^7 B+ e! B# ?
/*
( M* r7 [% k; L: O, G
* Check memory range for valid RAM. A simple memory test determines
% z/ s+ d' `+ |3 ]
* the actually available RAM size between addresses `base' and
* p/ p! P1 Q# J% g2 L4 v
* `base + maxsize'.
9 ]- q) ^1 {+ Y3 L- \, `
*/
3 c7 r! ]9 z8 g0 a$ E$ w
long get_ram_size(long *base, long maxsize)
( x3 h4 q! J7 O) n; x$ R" M
{
4 C* V' ]' i. T+ | h
volatile long *addr;
2 k- x1 W: D3 W1 t+ \
long save[32];
& `9 O1 c |6 K0 W% ]5 X/ j6 q! A
long cnt;
& k9 T+ B: _8 [1 ]
long val;
* [# I# [( ^3 O
long size;
( q/ Z8 o' r# J
int i = 0;
Z+ K' H- O" o2 ?
. i2 E% I2 |, T5 P' {9 V& f) t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& G# C8 w2 F! T V& g6 e; ?
addr = base + cnt; /* pointer arith! */
4 b& O, L( [! J+ N
sync ();
: b: R: T' S! `( x
save[i++] = *addr;
9 r6 T: S$ F3 C; j, Q5 Y
sync ();
& U7 |4 a6 p! }! P% x
*addr = ~cnt;
9 C: U8 S. E0 }8 M) M
}
3 b' c& i' ?+ r w A7 J9 p
6 O \2 h$ l! @' ]
addr = base;
# K9 s7 E/ Q9 W6 U
sync ();
8 g: Z2 M- u8 }+ f/ n
save
= *addr;
7 A) I( x& |1 }
sync ();
- C- }3 Z, J% e/ w
*addr = 0;
1 }8 @: G7 l2 {# a! ?' ]
9 A0 C/ S+ d- M! n/ g+ q; h
sync ();
! h, m% v+ Q4 {2 }8 p( p9 e
if ((val = *addr) != 0) {
" C# z3 L K0 l6 H- G
/* Restore the original data before leaving the function.
2 z h) ?% I) W" m# _+ C
*/
: ^% [- m H/ s: V/ b' h8 o3 T
sync ();
5 H3 f/ h- U- c# t7 x! L* `. y4 v
*addr = save
;
! T5 d) J/ O. ~# K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ U o3 U' i- X, e1 x$ n% a
addr = base + cnt;
$ E5 }' c2 K) k$ G% q( n
sync ();
+ {+ d" h, F2 V; F& v) J
*addr = save[--i];
7 E- G3 I8 j7 Q- z& x5 ^7 [
}
* `% f: e1 K. z; I8 c' G. ?
return (0);
* W8 l3 A6 W/ C6 h$ ]7 ?+ E
}
) ?1 o. B' G( D
% `- |2 N' y7 f! ^' x2 `* M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 _2 Z# a$ U5 V& V
addr = base + cnt; /* pointer arith! */
- b0 H6 F. Z2 D$ c3 m: {1 R3 Q
val = *addr;
6 O2 @. g/ l' i1 O7 K+ _+ f$ A9 s" B/ U
*addr = save[--i];
/ j/ F- h9 w" \4 ^3 O( M1 Z! j
if (val != ~cnt) {
6 i( p" l; F+ a* M: }5 q9 R
size = cnt * sizeof (long);
2 w/ ]; I/ P8 V0 @/ l
/* Restore the original data before leaving the function.
9 l. }2 Q. }' w& r9 o9 o3 L
*/
; v4 A2 m# {* C! Q* @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) `2 L! c H# n% Q, n" a9 v
addr = base + cnt;
% V, w" n# u/ Q, ~
*addr = save[--i];
1 `9 H) R5 x, K" ]& O9 C' p# e0 o+ c
}
& p; T: Y5 H% R; d# j* W2 K) N
return (size);
2 g7 b4 _8 s. d% ^
}
- Q6 H- x, @7 ?: t0 x
}
9 A! `; \, Y! h) ]- Q
+ H! y$ H7 {+ q
return (maxsize);
) D) ^& n) V% ]0 x% K
}
2 M, G9 B3 @# h
int dram_init(void)
4 t" R8 g0 j0 L2 b; l: ^: Q* h
{
$ U; \( a( p5 J
/* dram_init must store complete ramsize in gd->ram_size */
5 Z$ g$ N* ]" [& W
gd->ram_size = get_ram_size(
/ F! B( @# h# w1 j
(void *)CONFIG_SYS_SDRAM_BASE,
9 D, I% @9 d2 y, _4 s
CONFIG_MAX_RAM_BANK_SIZE);
* t& i3 F& V% G. P
return 0;
1 Y% @- A* t6 q$ ?9 l4 K
}
/ X* s2 e" e4 e/ a; S0 @
' L" c: V+ G8 {% u
' j3 _+ @1 g1 X" s: t) R% x% ]- j1 z
' r/ T, f4 E! H( L, N0 p
6 k5 Y5 u# U3 B2 T# K; _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' H9 n4 ]' M' G1 d+ G& k# m2 j x
' X1 U8 @/ [1 G. c- J
8 e' y2 M$ C8 S* V. I1 w! s3 J8 m
I% ]! a& N3 ]- n1 F8 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4