嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# A3 Z- L: y& x& h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; V7 {. J3 ?4 G; e# q5 T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. u! B9 B0 U, a9 \) Q
# b* x3 Y2 f. }. ~8 B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 j9 ?9 N0 g0 W
0 R, g# x$ F! G% g" K1 r* E
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* p5 r" ]$ m( ?* c7 B$ V- z$ @
/*
# R- `+ s r9 V# p1 }6 H7 x
* Check memory range for valid RAM. A simple memory test determines
/ l( s0 x9 h+ B+ D! x
* the actually available RAM size between addresses `base' and
0 `; x" G+ G }* |- `1 O
* `base + maxsize'.
7 s5 L( F |( g8 M5 U! F
*/
" L* _8 u4 m7 M# l
long get_ram_size(long *base, long maxsize)
" q! W( W& l4 l. l& U2 n
{
8 U4 Y6 {) [5 d9 c9 Q+ y
volatile long *addr;
! x( |9 I# d% c. u# q" y/ P
long save[32];
. x* R- n6 _/ [9 \
long cnt;
9 k" T" |' x7 s V7 n* ]5 L
long val;
) l9 q! w' b9 g5 ]( A6 o
long size;
( U$ ^: K+ n) a7 d+ `* M
int i = 0;
9 O, ~/ T; k* V( L& C3 h0 i5 }" |
7 X4 B T ^4 Q! l8 m: N [8 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ B% H# x* E$ S0 o, U& B
addr = base + cnt; /* pointer arith! */
6 q {. E, G% ^3 o
sync ();
Y& i! L- Z. C' X9 X
save[i++] = *addr;
! G2 u! f* P# p2 Q9 R5 p3 _
sync ();
) D( Y/ j( q* C: y* l8 Q
*addr = ~cnt;
& V( Q0 k7 e8 G9 {( ]
}
2 e; X3 r6 t3 W, K' `1 F, @
" R: h" k9 i9 `' ^9 p H
addr = base;
9 W2 h$ E. \0 |
sync ();
& e* A$ K. _# Y4 T6 |
save
= *addr;
6 Q: z9 c" p: q* a' v W4 B/ Z2 x
sync ();
H6 O, b: G3 ]
*addr = 0;
5 j& B* s" i& c$ v6 Y7 A1 N, S
U5 i$ y2 t: a! B( j8 g1 W( ^
sync ();
% c9 h* N3 X" x- s+ e6 ]
if ((val = *addr) != 0) {
6 V0 Z( ? }5 x% l/ F
/* Restore the original data before leaving the function.
8 e0 t) ~7 w( c, u8 c" r0 E% [1 ~
*/
. V) g$ y i4 z) Y
sync ();
5 V4 X1 g9 s6 z. m
*addr = save
;
# Y8 ^3 D2 [0 E( w! b* U9 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ |6 g6 Q! \$ I/ M2 u# _
addr = base + cnt;
: r2 Q; H' V9 b
sync ();
7 p; Q+ p( H" v. v" J
*addr = save[--i];
( X( z8 N, e7 q: w s
}
% s3 D1 V v* e
return (0);
6 F2 l! Q+ O! j, X5 Y
}
" S2 r$ u" T3 U/ e
8 ]8 N5 J2 F2 V4 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; R/ L; p. W* v$ p
addr = base + cnt; /* pointer arith! */
/ ]# o" b& T$ W4 ]. z/ W, D
val = *addr;
. h- ~- p) Q+ ~$ i* i
*addr = save[--i];
, C) A- Q: U# {& p' o
if (val != ~cnt) {
- p/ I$ N3 v' J
size = cnt * sizeof (long);
$ o3 q2 f9 R Q7 |
/* Restore the original data before leaving the function.
* r! D- C! a5 i1 U. |' I$ ^8 U
*/
1 j' O% d \; Q7 I4 @- j. D$ i
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' a- `0 c1 d) h* O6 N5 M: E# w: `7 O
addr = base + cnt;
* _, d- |. F7 ^9 `$ Y# H0 _9 n& P ~
*addr = save[--i];
# K5 N1 b- O% W, _ L4 d
}
^ U, Z8 V7 w
return (size);
" M( @* N" l8 p' ` ^
}
" n! z4 Q) V" v/ O' a8 W
}
8 a+ Q A8 J5 X8 F$ U! Q
9 r- J+ q/ E( f. ?% ?+ K
return (maxsize);
P4 p4 q$ l: C- U; g: e. S6 f; R3 m
}
" c! F% q/ u+ K3 g9 T
int dram_init(void)
1 o/ ^ C) g9 K: m5 D
{
5 U# [. Q$ S. B# [2 q% R
/* dram_init must store complete ramsize in gd->ram_size */
: s$ d- A& y0 I, m' ]* `* g1 G/ _) ]# n
gd->ram_size = get_ram_size(
& I9 }/ K3 V$ B
(void *)CONFIG_SYS_SDRAM_BASE,
7 J' `/ B; p. t3 t' g% x
CONFIG_MAX_RAM_BANK_SIZE);
2 l+ q. {9 g% w5 g% ~2 a1 V2 S
return 0;
- M0 j; ]! Y: P' e( N
}
- _* b/ s0 }5 c1 D: x
. P' I# P1 {2 O7 Y7 R
( l/ G% D9 V( B s
) v9 T, r) e' n' ~8 m
0 [- o$ f' I# P- A% p- t4 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ W* [3 p0 S/ [' W2 b
9 y: ?0 {0 r8 g1 a& N. R
5 |1 t. `2 I8 Z7 D( V
: @. |6 |% ~% F! c+ R9 g# g2 j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4