嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ V+ e R# x' D1 `
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 h- f2 b& r4 m% r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 {9 O# h% J& P! {# Z
( r2 w* ]1 l2 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! H2 I) n) T: @- _ W
9 O- ?3 s3 y0 j2 Q7 n, |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 Q( r1 d$ X* ~+ H- W4 w
/*
# R) c; y* A7 @2 A* Q3 ~0 T
* Check memory range for valid RAM. A simple memory test determines
- j6 H5 h8 Z# e; x0 t" ?
* the actually available RAM size between addresses `base' and
6 u& q2 ]# q% F D; ?/ k C. ?
* `base + maxsize'.
' _# e. x+ H: H
*/
* n5 f8 L7 l/ S6 y& W
long get_ram_size(long *base, long maxsize)
1 L" y$ G; o/ M& s" c6 W, [- j
{
: H8 L9 ^' U+ r0 d3 r' T" z
volatile long *addr;
; P0 J$ E; A- B2 C/ Y
long save[32];
0 C- l2 b& q5 |" L) _ x- e2 H( ^
long cnt;
) P3 j1 g1 H( ?" z& U
long val;
0 x# w: I9 L, U# r- e
long size;
0 Q: i2 E& O2 n; p) [' `
int i = 0;
4 I0 E# P2 L7 N5 n9 {' ?% k5 V
) L, ?1 R# m) V: Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! ]9 r* @$ `5 P& d
addr = base + cnt; /* pointer arith! */
) O6 s+ `7 {7 a5 ]( C
sync ();
! ~0 G6 e3 K8 L
save[i++] = *addr;
- [9 z: D; J5 Y/ t8 m
sync ();
# L- K' S8 p" j0 y4 {* _8 F2 M
*addr = ~cnt;
' t$ t4 N2 T: e- M
}
6 m! h1 H, S# ]
0 `. i1 g1 o4 @) U: ^7 ]4 r# l
addr = base;
* i1 V( y' P. k; v' u
sync ();
+ n1 I% O, I! |" E+ J
save
= *addr;
. d$ o7 o% ?) ]* x5 W, q1 b
sync ();
1 Q/ M) C0 m* a* Z0 `/ L5 R; m
*addr = 0;
* ]$ Q6 q6 `* U. N& y
& X3 M& D/ H- B; a+ s; P' `
sync ();
) y- h" Z; |0 l1 b$ V8 n: i
if ((val = *addr) != 0) {
' @/ X6 R( J/ p6 Q' @ Q
/* Restore the original data before leaving the function.
$ P& R$ K9 H" B) a5 v
*/
9 b/ @& P2 f5 ^ ?3 `
sync ();
. Z! l4 ?( R/ W" G+ x4 G* o3 d* {
*addr = save
;
, v/ d1 K2 J4 n5 V& x0 o& j
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" `6 V1 U1 v6 r( @2 N8 Y) u
addr = base + cnt;
8 V3 I$ R9 e! J. j0 Z$ D# O, i$ z
sync ();
5 y8 c j( o+ q; e* j; M. g% ?
*addr = save[--i];
9 y/ M! u5 y" }- k
}
0 _- @% N' b) _
return (0);
, e5 ~# T3 u) r- u' S! q) N
}
/ C5 A: m& L% H! q& E: q/ `8 t8 o2 T1 d
1 c# x" `/ {2 N! ^1 e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ N2 |5 M4 M( H! J# T0 E$ y+ o
addr = base + cnt; /* pointer arith! */
: Q; X: b0 a; F" `' s; \, Z9 G. F. d% B
val = *addr;
# j% g, |- V Y* ]
*addr = save[--i];
5 g+ |* m0 T, @+ O- ]. s
if (val != ~cnt) {
, x: D/ C2 u! x& N& C
size = cnt * sizeof (long);
$ c) z/ K! ~& V
/* Restore the original data before leaving the function.
) X! g; l7 q0 I o: D0 _
*/
( L. }( J5 c& G; l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 a$ ~% O& L; U- L3 b" F* Y
addr = base + cnt;
3 t0 |9 _+ T8 ^5 U! g0 [* P
*addr = save[--i];
0 g& L5 n! R* s
}
0 ?; U, b- A" n# Z! ^9 b. t
return (size);
; {! k8 X- b9 U" p% A
}
/ M" ^2 n0 h/ P( s
}
* r6 u/ ?- z' e9 @# E% U7 R
; \- q3 l& D) U: ^
return (maxsize);
' |& `. B0 a8 ^% _: ] b, G
}
, S0 O7 i% n' n8 z- L
int dram_init(void)
: |2 S* r/ j- _
{
4 y- @( c3 T. M, {' Y; ~
/* dram_init must store complete ramsize in gd->ram_size */
9 L# t- ^ A6 S9 a
gd->ram_size = get_ram_size(
2 I" f8 {- y( V& b. `0 {4 w. N
(void *)CONFIG_SYS_SDRAM_BASE,
+ S! \2 B( i6 @( ?" {! S* d
CONFIG_MAX_RAM_BANK_SIZE);
}/ k! G/ `- a' y N" q
return 0;
1 D9 o( N3 e1 m0 I% I
}
2 F- w( b8 H4 \! n3 V9 Q" P
' U9 L( {6 v; L$ A s3 p5 `
) r+ k4 J( @) L' e9 X5 X
9 q8 y4 }$ m0 b# ^: e& M6 O L
4 l9 p6 i& e2 g; M, ?* i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& r/ | a! z1 I4 _
+ d$ x: N4 y! A$ A- `/ P2 C! I
3 F7 v6 ?3 P, x1 I9 j0 K
5 |" [6 M! N& ~5 T7 u
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4