嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! Y, w+ D% h" a; p6 j. s7 g
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 a, |0 y! V2 U/ O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. Y- i! j: | L }# Q
# i' K5 D9 E1 n3 X, c- ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! `% a( G: Q5 `; `
3 ?$ r, Q/ n3 ^ B2 Z9 ~: M: n3 {0 _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, \9 I, g9 n1 g0 x( G$ _+ ^% s
/*
: R% M% K6 _& \& @2 n6 ^: l% Z
* Check memory range for valid RAM. A simple memory test determines
$ h3 f& g5 l, e5 o
* the actually available RAM size between addresses `base' and
. @' f& t' y0 R" Z2 w9 x
* `base + maxsize'.
@& z1 k# t+ _% k
*/
* m3 h- g+ d3 x6 }9 d
long get_ram_size(long *base, long maxsize)
3 h7 h i) \0 s2 M- |% v
{
: F0 v6 d* F8 U1 w5 f
volatile long *addr;
! ~ L* g& c3 T4 ~
long save[32];
% Z4 A+ O# r" N9 A: Z4 Z
long cnt;
3 J, q5 q: |5 i& ~& W) ?
long val;
; W+ r, |% A# a- b% K3 ]! i3 y
long size;
( ]- D+ u( e6 ?7 `3 G
int i = 0;
5 \6 f% H1 ^% Z4 t3 }
. r5 ] ~* |7 D3 e! H) J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 k0 t+ O% h- F( {* z
addr = base + cnt; /* pointer arith! */
@. S: H: {5 ~# @3 w
sync ();
( @ C) k& V v. q P& A
save[i++] = *addr;
/ J0 a1 M2 l# H# C6 S! w2 [6 X
sync ();
) n# R8 l' O6 L9 R
*addr = ~cnt;
9 @* }7 w# k7 \# R# s
}
/ \8 [% w. C( D% o7 k
! r' ?$ D* Y3 `/ U! f
addr = base;
0 ^4 E+ B% y" X {
sync ();
1 p/ d* A" |+ M0 D# b( B- G
save
= *addr;
. v, d( I" O, N5 j+ g; t
sync ();
' w. O; N& M C8 Z
*addr = 0;
" u* _. n' l& r* E0 z: _$ f$ Y
6 M F& s6 {$ s1 l# U
sync ();
. r7 }) q, V5 {3 P/ D
if ((val = *addr) != 0) {
; }6 y' o* f: \8 h: c
/* Restore the original data before leaving the function.
' L( P$ L3 g+ m* c" y% J
*/
6 c2 S. \; `% z+ H8 G+ j
sync ();
* p* `8 T" R6 k2 I2 j
*addr = save
;
. K4 z: m2 t6 W* c' G4 R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( q$ V3 ^ C7 @/ y9 C5 o
addr = base + cnt;
, n! p0 C/ {3 {' j0 F/ K r
sync ();
+ e( }' s7 c+ Z8 n& U
*addr = save[--i];
, S V: m8 x! d& z0 Z
}
/ Y1 [8 K" B% Q. h3 ~
return (0);
8 f: O L: X# _0 G( E
}
6 L1 f+ [0 {, K5 n/ ~
/ a) n+ m% o7 n1 X* S% x* J
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' _8 }6 b( [7 p8 Z, p
addr = base + cnt; /* pointer arith! */
! T% R( z8 {) h" c8 B
val = *addr;
' ^6 v* j8 p/ Z1 z7 d7 i
*addr = save[--i];
4 {/ T, f" H- i1 n# r$ u
if (val != ~cnt) {
* u9 `; i5 B& l0 K c
size = cnt * sizeof (long);
. D5 k1 G8 ^2 a- D
/* Restore the original data before leaving the function.
4 U, a0 ~! i5 I( H+ V( _1 C
*/
6 \' M8 v0 x) I) M: Y* ~$ y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- K/ X8 L+ U/ t
addr = base + cnt;
' B& ]7 n3 _/ x' }* O
*addr = save[--i];
1 E8 n0 J8 D6 g/ O
}
+ p3 ^; H; v7 y$ w# N$ t
return (size);
; x2 A' E- Z2 h X+ e
}
% D# t# B5 Z- B% B7 f4 ?: o
}
; w# @0 B) M- \2 T& n" Z- F- x8 u
" Q; R' v. n# ^4 d9 K
return (maxsize);
* W& g, m6 P+ E8 w$ h
}
: W. }2 Z1 J- C; p" i/ _# k2 G
int dram_init(void)
" I( m0 I. L5 U+ v
{
- X3 j; W" H6 d2 K
/* dram_init must store complete ramsize in gd->ram_size */
8 \/ _& C' |, `' D
gd->ram_size = get_ram_size(
3 V! k8 y/ e* \- i4 l' R
(void *)CONFIG_SYS_SDRAM_BASE,
( L: q( G& q: O6 X+ B2 T
CONFIG_MAX_RAM_BANK_SIZE);
* r. }+ y1 O0 V: g5 g' v! T
return 0;
& G; z; u, c4 N) l( [
}
+ m9 S+ I! G* j. [
7 [7 D+ _3 U/ @" c/ g
! { A) y4 v: L i
! m; t+ j, R" b* U0 k* a
% w C; H9 Q0 }0 K3 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
h, A% a `! h, }* |6 H0 {
5 ` s. {2 X8 }5 d; F" Q3 J
$ M$ n6 l% c) ^ q4 k' T0 e! D5 u
* k# s, H( r+ o; { j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4