嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 ?% G& D+ H: V8 A
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* Y. D* F: M' J9 w* ^, m) o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
C @! c# D% q0 ~3 \* M6 q/ L b5 E
7 I+ U- I4 Q0 Y8 ?5 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" m* d9 C4 j+ I( }7 ~( N1 @& p
; c# v! L/ r6 Q6 l) E; s
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 y! U9 n" A F6 q* n7 _
/*
2 G5 i8 C: L H
* Check memory range for valid RAM. A simple memory test determines
' T2 A& G5 u0 l1 C( |9 p- a
* the actually available RAM size between addresses `base' and
# m2 p5 U9 g8 J9 d5 c: K: N
* `base + maxsize'.
' ~& k) m; m- w& \
*/
9 w* `9 @$ \( h# M* g
long get_ram_size(long *base, long maxsize)
* {, Z8 P- n7 C" b
{
$ f) ^2 D; Q* i* |& R& I5 R
volatile long *addr;
1 K) P4 B: |* Z! q+ k' P
long save[32];
% r2 @" i1 `) d) @, V/ o) Q9 u
long cnt;
; A7 |. T" S3 t" K" F% T
long val;
6 z6 Q4 Y4 c8 q/ i5 c$ U4 t
long size;
7 L# P7 G+ n- }( h c7 i- [
int i = 0;
$ B: ^ Q* R1 E P$ l4 N
, N# L$ t( z% u5 r1 |0 x9 `+ x5 i2 W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 ~8 {) E+ ]' T# b# q4 V& Q
addr = base + cnt; /* pointer arith! */
2 }8 _0 p4 Z. t3 j; ]% @; o! G) a
sync ();
+ Q0 T. [1 G7 c% a1 ^
save[i++] = *addr;
9 m. A6 o* I5 F0 c; z1 q" L
sync ();
7 ^" |0 X" I( _# M
*addr = ~cnt;
- V1 H) j* X a) i( d# Z2 n6 z
}
: \/ g" `8 x: ]3 X. |2 B: b
' _8 j- [* B) |9 X! _9 G
addr = base;
: x! @6 o% i- z
sync ();
/ } C6 P' f. @' c
save
= *addr;
3 N$ M8 k K4 k0 h; i0 @
sync ();
) M7 o0 p _8 M) d) `, g- A6 X0 |$ y
*addr = 0;
4 M- j5 r8 _0 q, B9 L
$ R/ D% ?/ |( m, i
sync ();
6 t( ?& V' X i
if ((val = *addr) != 0) {
" n$ N, H5 P" E: \8 m2 E
/* Restore the original data before leaving the function.
( W5 x1 @) I1 k s
*/
. _2 i) ?$ w: u, u
sync ();
+ D5 L% b) J8 ~* E+ u
*addr = save
;
! h+ n V' i) |- f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 b6 b8 V6 p" J. p) W4 w* F% [
addr = base + cnt;
: y! ~. I( k5 ]4 [' Y& h
sync ();
# m; M8 f8 A# ` j( `! \. q) @
*addr = save[--i];
) }2 |2 n F% F9 P5 M
}
! ~8 I9 p1 i |0 `
return (0);
! r2 j! v9 v$ }) I: q6 d
}
- s( u7 J2 M5 K0 p6 _3 \% t* x
/ U' A- j7 B+ g: h$ |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" P' _/ p# N; \' m
addr = base + cnt; /* pointer arith! */
% W: |( ]. s. v5 v3 |7 @/ s. _- c3 \
val = *addr;
9 a7 V0 X1 j7 c% m* `' w
*addr = save[--i];
6 y- L/ v( p: J
if (val != ~cnt) {
5 [( Y" y V( X- z* f
size = cnt * sizeof (long);
' S2 L7 }/ p8 X. @1 [- k
/* Restore the original data before leaving the function.
9 v2 h9 ]" U+ j1 R( A3 W- U# p
*/
, S* v5 H0 Z ?. W7 }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 l6 c+ X/ U( h" V
addr = base + cnt;
. m: o% }6 S( i$ h: i
*addr = save[--i];
7 I4 i9 e& m e+ ^7 R
}
' G' ^8 G! r5 N6 h2 z( b. F
return (size);
$ l" u( ]( P0 F6 t g; z- f
}
/ y0 U7 R4 h8 S" ~) c* S1 b
}
1 y4 E! B& L' W3 _' J ]
l: c6 N2 T \6 ?
return (maxsize);
3 j& U( H5 l D: ^7 O4 x& a) H& ^% e
}
) Z5 @+ x( I9 w6 i" r, g
int dram_init(void)
" v; j8 ]' D+ a/ A6 T }, O5 k
{
" w* W2 w" w7 u/ b! v B( e% H
/* dram_init must store complete ramsize in gd->ram_size */
. O% _8 p2 m. v- x0 ^" M
gd->ram_size = get_ram_size(
& G9 w2 Q7 r8 _6 t4 H
(void *)CONFIG_SYS_SDRAM_BASE,
( E' F6 ?/ J8 C* ^% d
CONFIG_MAX_RAM_BANK_SIZE);
9 L( E, p! \9 z, `# b2 o- O
return 0;
( @: } O- ~' {/ }" I1 |
}
* O8 h% x8 W6 ~& v/ d
9 H. a) T E- v% q
& I' j2 P1 A S H; p; h8 h
8 @9 P9 a5 [% n$ j1 S4 g q7 l8 w" Q
! ?' N: p& z( V" q4 y! [0 |0 B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' z) ^; x& h% M* m! T/ Z
. J0 F, _# D) ~% ~" ^ Y2 f
) M Y& Y+ i# m4 k, W% C
# Q! l- I. i+ R) L! s( F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4