嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* K' _ u7 Y3 l$ j1 T& }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 E: s$ E- w) P* V2 }8 a: ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 v7 R: y; s6 g \% R
$ Y9 z- |& }3 `' M) i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 _' X* R0 Q @" q& b) _0 |
2 V" K5 F# V& S& L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& g V& w5 e i
/*
- [, R7 s; Z" L9 U, `
* Check memory range for valid RAM. A simple memory test determines
# r8 v6 [# m. M
* the actually available RAM size between addresses `base' and
; I% K$ d' F& ^2 t$ [# L/ @8 v
* `base + maxsize'.
' o: u9 m1 U" u& p
*/
5 M3 ^; d: y8 F7 L7 ^5 c. r8 | ^
long get_ram_size(long *base, long maxsize)
0 D) K, A% D: q( S
{
- q% V# m+ R7 a4 n
volatile long *addr;
8 S5 {+ R/ T. N
long save[32];
; E: x+ L' y) {) D. t
long cnt;
2 y# D: j( S, K. _0 q+ H2 M% J' a( j8 i
long val;
7 t8 h! S5 }/ J
long size;
' B; H1 I9 O# q. H% o
int i = 0;
0 m7 o0 Q+ o* @; U+ }
# l1 b# u6 P1 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! l& G' |$ ?% P
addr = base + cnt; /* pointer arith! */
5 P# I# e |1 I
sync ();
/ \2 |1 ?2 V! j0 }+ Q) k
save[i++] = *addr;
7 R0 S4 G0 ]2 J4 x6 ^' i2 D
sync ();
2 K1 Z* d# j6 I% D% J
*addr = ~cnt;
; I7 m, N- M; A& a# C* ~& F
}
6 F {# n5 ~7 O. [4 X2 |0 b
N. H+ o( S8 L7 c; f6 M
addr = base;
& _ y- K4 R5 T4 q! B* |% t6 ]
sync ();
0 Q/ f; Z" P: Y/ l; ~1 o: G0 j$ l
save
= *addr;
2 B f2 y9 ?* e+ g- X
sync ();
7 u% d* x9 m) V% R5 e$ @
*addr = 0;
f& e* P& m" U3 v
7 S$ B% J0 x* L1 i# j8 R3 d* b
sync ();
' T, H' D9 `# w1 x7 @
if ((val = *addr) != 0) {
$ g7 r2 N# d! r$ t
/* Restore the original data before leaving the function.
8 S* |+ N/ F' Y5 z
*/
# k0 G$ g& `$ |! @1 y
sync ();
7 r" o2 M3 o4 I) p* S
*addr = save
;
6 T- S" T# S6 C5 @# O( C
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- F! y) l1 g: C: _
addr = base + cnt;
, \2 P( i4 u/ i" [+ t
sync ();
/ c4 ?- S3 `% q8 k9 z' {
*addr = save[--i];
4 n% s& D% \! L |# L
}
5 J- P, D- P: H# k7 Z
return (0);
& b& a1 K+ f$ [7 I8 V! Y4 O
}
2 j; ?$ E4 A* v% }
Y) b: @% q4 G3 H6 @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: B' E7 Y. I: i7 N" J. S4 J9 @$ r9 Z$ c
addr = base + cnt; /* pointer arith! */
4 [. t2 C8 B* t
val = *addr;
- f: x! Q% |# m
*addr = save[--i];
$ ^5 k- u, a# W$ {# @
if (val != ~cnt) {
9 a$ V2 N; \/ e8 Z4 n
size = cnt * sizeof (long);
3 ], e- Z1 t% W. ]: J! M
/* Restore the original data before leaving the function.
1 V+ @$ r: F) w2 S8 {( P8 o
*/
$ Z! u; N- @, e; {. l* k) a0 f( Z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 [3 l/ n; Z7 ]2 A& t9 Y/ M a
addr = base + cnt;
- g, C( ^3 C1 X& |
*addr = save[--i];
: m+ L. v7 v. z h4 L2 o, B1 K1 z
}
( s1 }6 r& e) [& u8 D& ^( g b2 Z& p' E
return (size);
l! u( n2 W9 ~& Y
}
2 Q3 `, b; v+ ~5 x: v) Z
}
! e, V1 g7 [$ M O
7 z2 j D. L) ]: c$ o& f
return (maxsize);
) n# M( H* F4 S1 }
}
; \" c5 q5 _# L% `: Z( d' f4 `0 `
int dram_init(void)
U5 U6 O2 f# ^
{
?! B S; @6 ?9 |- o: W
/* dram_init must store complete ramsize in gd->ram_size */
, k9 ]: X% e# O6 i
gd->ram_size = get_ram_size(
. v5 y! I. v1 e# c* d
(void *)CONFIG_SYS_SDRAM_BASE,
/ W: J0 D. u4 C. M% }' h5 \9 Q! w
CONFIG_MAX_RAM_BANK_SIZE);
" a6 z( }2 R; V( V
return 0;
* B2 V, I8 }* x o* M3 M
}
. |( s, E0 D- _6 n6 V( n& u+ q
( S+ e' q* L8 a' t
; D" U8 w' L$ D5 X; j
/ z. E' t0 n U- [- E
. D9 j5 `$ v& t+ ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- Q- p: U# I% n7 U
7 h H* i9 H5 g( B3 w' V9 \4 P, n8 {9 t
7 c+ i! f H7 N+ ?8 Z. I! @
, L- @0 A( y( K" U* K- e: }
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4