嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 N" D# K4 [4 L: l0 D* y" ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 g P! I G9 f, |$ w0 |5 G4 @
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* P- m! J3 P$ I! A+ }2 d
" ?0 Z' h+ Z, B, c2 C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% W, w' D/ C9 W; a) y
% n: d0 v# M2 E) K! o- O
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 s( [- Y- O3 `" Z4 d
/*
% I9 k" k) [( c/ G8 T
* Check memory range for valid RAM. A simple memory test determines
" g, o8 E1 P& [; j+ E
* the actually available RAM size between addresses `base' and
; s" k: T% W# H2 h w9 w$ ^
* `base + maxsize'.
9 s/ c8 V: J% p! o; t9 Z
*/
^2 G# `0 @4 ^( ^; d8 b
long get_ram_size(long *base, long maxsize)
- q# {( ^; z3 P# P* m j: Y
{
e x( } l% j U1 P. j
volatile long *addr;
8 W( O/ ]" v$ `' P
long save[32];
" |5 J8 D; j/ q
long cnt;
7 {. s- H6 ~# c4 m/ Z2 o! u" E
long val;
5 W H4 S' b+ ^# E |
long size;
! N9 z: n9 j) e! ^
int i = 0;
% I+ ]6 T8 A+ T7 }; b
* [$ r. [4 l- i l( N0 U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ b. ~$ v" `3 z! m5 h
addr = base + cnt; /* pointer arith! */
" Z& g' m$ E' R- p9 w0 p
sync ();
$ N( A7 ?- {* p
save[i++] = *addr;
% {) s3 K1 p) u# W3 E. w1 R" P! c
sync ();
8 p/ s6 l2 M& q7 }2 L- c. ~
*addr = ~cnt;
! S) S! K3 f3 S$ z+ w" }
}
' w, x5 N$ z: c9 ^0 Y
- V' v$ P6 Y& I$ ^1 J
addr = base;
" I/ k( ~4 e0 l4 ^5 \( y$ N3 u
sync ();
: I( g! r& o' R0 R0 e C+ Q3 c% c; `; j
save
= *addr;
2 T. `; N/ e7 V# v, A% b
sync ();
) k. Q; Q- `. p Q7 |7 S
*addr = 0;
; Z9 y0 _5 x' p! }& G
4 d, t$ H r6 Y! Z' }) p
sync ();
5 J; R% X B- d. \. _- M
if ((val = *addr) != 0) {
& L& I, K& ~% H& Y6 n
/* Restore the original data before leaving the function.
) l: d3 _" t5 `# g4 E1 ~& w! O/ H
*/
' w" ~0 Z6 j, }* |" {
sync ();
8 V; l" v( `: j% A
*addr = save
;
1 @% H+ H: P/ ?) ~: ]) \- j3 s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) c. J+ W/ b9 p/ Z# D# y9 q
addr = base + cnt;
9 T. x' E4 H( e6 g. q
sync ();
5 j2 O. _0 Y5 v) d
*addr = save[--i];
3 A' a- G! S% H/ Q3 b& W. F
}
/ g& w) |2 V2 m
return (0);
+ n& u- ]. y \
}
) q; z6 U6 B+ G6 F& l% p3 R
9 d8 g. J# v; z0 K7 z, _
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# h& x9 J2 ^1 p2 N h4 M& @$ S
addr = base + cnt; /* pointer arith! */
- B: A2 V0 U! l4 I4 f: Y; [
val = *addr;
8 O+ X. c, i+ W- Q$ K
*addr = save[--i];
; }) @9 Q; K$ h$ |( g7 c' U2 K
if (val != ~cnt) {
( f) ?8 C& _7 o, E
size = cnt * sizeof (long);
2 P0 f$ A# N7 e/ b7 z# \; h* e
/* Restore the original data before leaving the function.
, L5 a8 u9 R" V
*/
$ Z1 n& `; A0 {/ S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: a& E( I0 e$ X. r2 L2 D) ]
addr = base + cnt;
, h; o; Q6 C4 p0 ~) P" ^+ A
*addr = save[--i];
' h, y7 _# X% ^& E3 b" v
}
0 C8 O. y m% r) r+ d# {) e
return (size);
& ?5 l: I4 f. D; |# k& u6 X
}
( m- \+ }" N4 V, t: }* z8 P6 O
}
' D3 i' U/ P1 T/ |" ^+ P& W0 @
9 M- } o) N+ X6 L F
return (maxsize);
) M. }4 g: E# y& _
}
* \5 I$ e2 ` @; |) M7 q
int dram_init(void)
2 s* _( [/ p r0 U0 z' q+ M- _
{
( p) ~' C! u' Y2 F9 N* r- M
/* dram_init must store complete ramsize in gd->ram_size */
5 N6 a/ Z+ @: y' b( ~! g& p
gd->ram_size = get_ram_size(
: ~; @' v- r% I) ?) X! r% i9 f
(void *)CONFIG_SYS_SDRAM_BASE,
9 B' g3 H' l5 B7 \/ o4 O
CONFIG_MAX_RAM_BANK_SIZE);
) U. `, u% P6 G0 `* d/ c+ {1 D
return 0;
) _3 ]. c1 g( _; e& l) \
}
, u, M- ]2 Y- I/ _: @
3 H# V& M3 A5 b/ M; K: H' P
3 |# Z! M8 H% D( W3 l) d2 ~! Y2 N
D. X& B, G& W: j
A0 @5 |* S; P% {0 P" g0 z) C
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ g9 z' }' k% y, c7 E2 `
$ N$ A9 B( U, ^5 R2 v2 I+ s& J( H
\1 f: x1 F3 k- F
$ H) h- N/ e: |! V& K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4