嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! u1 g l6 B' ]- ?
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: |. t$ N+ v. r9 V" o9 B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ r/ Z2 _0 {$ L
! `* F5 E( |8 M0 p8 _( C- c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" T$ `' ~& a0 Z4 h6 i- |3 J/ h0 x3 U
. a/ Z ?8 l. Y- f1 j5 v
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 J+ `1 g, b5 ~# Q1 X8 s
/*
0 F1 g) L* f$ c3 Z% \0 L* [& `
* Check memory range for valid RAM. A simple memory test determines
! X4 L, a; b' |
* the actually available RAM size between addresses `base' and
; Q# @* L. E: N; q Q0 P
* `base + maxsize'.
: M# E: L! p) |. q9 w4 f
*/
( q2 w; ^8 z; z1 o' Z. N5 [
long get_ram_size(long *base, long maxsize)
8 J2 H( ?+ C$ ]
{
x' T$ A; S7 a- K
volatile long *addr;
" I) Y) p+ _2 @! ?5 V
long save[32];
7 O5 Q- g. v& t1 Z) k& W9 z& e3 {) W% M
long cnt;
; F: p- j0 l$ |
long val;
_) h d1 d7 v/ j
long size;
+ }. \8 _0 m l5 }9 F6 p( R
int i = 0;
" Q- p, x+ A6 H x8 x8 O/ {
. ]/ D) P4 S0 p( u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" L$ V* ?* M; h1 F6 g# \7 u
addr = base + cnt; /* pointer arith! */
/ |( h; A, P- R! c
sync ();
' X- _. \4 P1 X. {& y3 \1 T0 Z, L& f
save[i++] = *addr;
6 H2 i% a7 N9 w3 D5 e. L6 g; ]/ ?
sync ();
% b0 e) f- i# A0 ]0 D! ^% J
*addr = ~cnt;
: A/ B4 Q3 x9 {8 c P" o: }/ ^5 t. R
}
" R* y! @$ x) D( Y
" @1 ~6 v3 X3 Q% _5 X/ \
addr = base;
* G7 X4 @6 G3 b4 z! h
sync ();
- ]3 h5 |4 j: R; F) |
save
= *addr;
8 W! \1 g) ^5 ~8 |- N
sync ();
' s/ K- f6 E1 `/ D* _+ W0 |
*addr = 0;
7 ?2 a9 O# r7 u
) y! B% d, | j, O8 w
sync ();
( E, y9 M1 j, B5 k, H/ T
if ((val = *addr) != 0) {
( P! N8 D: F4 S$ ?" A- ?) w7 v
/* Restore the original data before leaving the function.
% R- E6 \ K# ^! y) Y6 z' I2 c
*/
( P6 F/ `8 [4 r& O! a7 f
sync ();
! s Z% {0 J0 ?
*addr = save
;
) \) `/ \+ c- H, D
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 `) w2 r) q1 t6 D3 l: d( n; e4 ?
addr = base + cnt;
8 z2 i$ t6 f; d
sync ();
$ ]; y8 N O, Q6 }* o; V5 X
*addr = save[--i];
5 O9 [: ~6 w D# Q/ C5 l6 n
}
: u$ l3 X' f3 _1 {; C" R# n) |! E
return (0);
+ X$ l' O* k$ I4 o$ A
}
( x9 S3 C* d4 g' E9 l+ k; N
0 r! r+ h* j& o0 }. `6 K3 `
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; a) o) ^, G- e! B" B0 i5 R8 f7 O4 E
addr = base + cnt; /* pointer arith! */
& `* e% \! K/ s: {; U
val = *addr;
+ E5 I! Z. h, p
*addr = save[--i];
5 q$ r1 T# R( l: p) A
if (val != ~cnt) {
/ L8 Y0 j+ l" c7 S! \7 c0 }
size = cnt * sizeof (long);
) Y1 G4 Y) r+ h! b% q
/* Restore the original data before leaving the function.
; q8 k; V$ R# w; s
*/
6 `9 ^& q- W. T* p. k
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" B. |' \6 \1 Y
addr = base + cnt;
" a1 e& [$ s; [+ o8 K! `
*addr = save[--i];
~( p' Q' U$ {6 k& Y
}
/ ]9 P8 p' o3 c- [7 p# d
return (size);
# ~3 ]. }9 q2 w4 I- l6 G
}
; y1 p9 O6 _) E
}
O, b6 @1 F# k9 y6 d
$ Z6 [) h0 c# a4 Z
return (maxsize);
) b; ]( a$ h, ~" S6 H
}
$ N4 y! O0 ?/ Y
int dram_init(void)
- p( M- o4 G s* v; k
{
2 E, e0 B4 }" Q. m% B/ @ Z9 b
/* dram_init must store complete ramsize in gd->ram_size */
Z0 Q3 L- w& |4 Z! t
gd->ram_size = get_ram_size(
, Y( I \, [7 u! f# F
(void *)CONFIG_SYS_SDRAM_BASE,
+ _3 u. w; G, p" z0 l( X! ?
CONFIG_MAX_RAM_BANK_SIZE);
/ o8 K; d# z8 M4 [ q& J8 ]5 a; `
return 0;
) ~0 B) L1 I4 c0 q+ l8 m; K% K
}
5 j! U- e# _5 v7 \
9 L, N' Z5 |9 P; o7 }
0 G: r4 `' U1 @+ M' m$ b) u
: x/ k; y" d7 i$ T6 c i+ ~; ?
6 z: }# l7 B' f8 ^. C" b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& n3 P0 c h R3 ~/ C2 f- p8 |# J1 v. r
- k1 v" d# G5 O! g, w1 x, Z5 B
/ S" k1 y" O( {6 n; O# N: u
% B3 }' `5 I+ a* S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4