嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: K# J* s( c5 Z! T2 v
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 ^5 G3 \7 l, O$ c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% I' s4 o5 i/ }/ E0 H+ G
2 c3 y* D( z6 @- p) G1 R: M* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ w7 Y9 u" U2 O7 P9 l8 Z" R2 V0 W
! }( @% ?9 u7 d- B4 [/ U8 k/ Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) O& ^8 |4 h4 g0 c0 K/ w2 [( S
/*
$ c' x6 P/ Y1 }! d1 p" v
* Check memory range for valid RAM. A simple memory test determines
: q0 S/ j a' V" s2 `$ n/ h' O
* the actually available RAM size between addresses `base' and
) a1 M- \: T8 H1 t; y
* `base + maxsize'.
" W/ ^9 v8 w k7 A9 q5 g' f+ n# r& n
*/
g4 F, [. F! E3 e
long get_ram_size(long *base, long maxsize)
! R9 L6 k9 U6 s$ G* b
{
2 N4 m4 n/ {: z6 P/ P0 H7 I Q
volatile long *addr;
+ v# ^- H/ r. D6 t- c1 [
long save[32];
5 g" U: \+ J; z
long cnt;
8 n+ H# Q0 V, V. Y
long val;
" G8 S# M y& i0 `- u6 \6 F/ r
long size;
" I: Z0 N! N" S5 {
int i = 0;
" l! X( d0 C7 [7 {! p2 c+ h& q
8 r0 S6 l1 D- k& c# Q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* g$ }0 p$ Q6 g# h3 N
addr = base + cnt; /* pointer arith! */
$ @, B) \! f. j! x {8 L7 r G
sync ();
0 z, L/ L' l6 O4 A0 t
save[i++] = *addr;
5 s( q2 }5 X1 v8 g
sync ();
: Q% D( p) Y' e3 r5 Y
*addr = ~cnt;
( C/ N; j1 W2 ~$ @ s
}
) N' {$ D$ U+ o- P: N. }
' E, r1 {: _) b# U B* f
addr = base;
* D q8 H% p1 `1 Z) q
sync ();
" {9 k" k" y- R j( |
save
= *addr;
8 _* m: B9 ~: R- q% r- N
sync ();
6 Q7 P8 P2 s4 C5 l, U3 ^
*addr = 0;
9 W% T K8 R: S! e9 [
) Y2 y, N! m* O: h K6 N* x3 m
sync ();
2 L5 Q9 L; i4 O% U; R
if ((val = *addr) != 0) {
, e7 i1 d1 s4 F5 x! P3 B
/* Restore the original data before leaving the function.
6 a5 j2 L8 p8 ^* ]2 a, `8 _0 M& P
*/
: z& O* y2 E% k i+ s) W
sync ();
$ N/ c% `1 W' C* l
*addr = save
;
: [4 u2 u) Y" i9 R! q' n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( y" T4 j: y! W/ _4 i
addr = base + cnt;
# U7 k3 F" i [5 y' f( y( z
sync ();
* Z+ M/ K, E, {: E9 J n" O
*addr = save[--i];
0 ^. F2 N. Y8 k
}
5 q) f0 L' {2 l" ~
return (0);
$ V" X/ J, _) a! N4 D5 l7 o! w% ]
}
! s& Z7 T1 [' M7 U/ @8 ~
5 _1 q# p/ y1 q9 e. f
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 Z$ ~% j# @/ N
addr = base + cnt; /* pointer arith! */
: d! O1 H6 G% q. g/ @ H6 b* Z+ a
val = *addr;
7 v: a( n; V2 r8 L
*addr = save[--i];
1 T9 o) x+ T. J' k* k& C& y
if (val != ~cnt) {
0 t& a, \9 I$ q9 ]4 d; z+ a
size = cnt * sizeof (long);
W9 e; u6 V L, d5 B" u
/* Restore the original data before leaving the function.
* i2 ~( {% v" Q1 q
*/
! L, X( w8 L4 C1 g3 e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- B; \6 A! \1 ]8 j) n1 Y( r$ ^. d4 t
addr = base + cnt;
; s( @2 A6 V) G. k/ U' }
*addr = save[--i];
6 z. w! \$ ]5 ~" z- r& s
}
) M1 H# c' W( R. D
return (size);
, n8 U& i d$ d
}
U* q: I) D: F6 e
}
2 Q/ z- h+ ^3 i$ C' v9 L) x
0 p! v' u# M7 W% q; F/ X, \7 I
return (maxsize);
: c; X8 A5 \4 z3 o) a
}
3 J" ?4 y, `0 O5 q/ n- D9 U/ F! P
int dram_init(void)
& x7 V8 U6 h4 F1 L: L
{
: m( A8 F; U4 ~6 @
/* dram_init must store complete ramsize in gd->ram_size */
2 m0 `2 ]3 _% d6 D# u4 t
gd->ram_size = get_ram_size(
1 B$ d1 B9 p! S' Y0 N8 J y' n
(void *)CONFIG_SYS_SDRAM_BASE,
! r8 _/ `, g! c H) x" N
CONFIG_MAX_RAM_BANK_SIZE);
) p' u8 E4 E) ^
return 0;
# ~6 L+ I& T: V/ a# J& C
}
- C, {* j/ a" k, u, J
% i( L3 \# F; P% b
; T5 O; |3 \; N5 f: P
$ }; F& l/ i: a8 c6 ~0 \3 g
% Q, _# e+ r7 r4 m& P! |' b* U q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 ]# i7 u3 `" t1 S
7 T- i" v3 F* ]3 D D
& a. i& z; b0 X f8 j
/ K' Y( n6 ?6 t, D9 p3 P" ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4