嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ a; C# i! O% J% X) X
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 t: k8 j* g" B! ~& X% t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 A: s' k# @8 o1 X$ w
3 ?9 ^- Z0 T' u# Q o7 I0 O" K) N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ a5 } {+ H0 {3 Z7 _2 T
- S4 u$ ? O2 Q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. q/ _/ d' i2 K1 l, A3 E
/*
+ e( i- o* d `3 D. Z+ X
* Check memory range for valid RAM. A simple memory test determines
8 d5 w- _( Y% I+ _; `) k, \0 Y
* the actually available RAM size between addresses `base' and
5 }/ o' k m9 q9 `
* `base + maxsize'.
& L3 [3 Z. Q" s$ n. j' l
*/
4 _3 j3 I+ g1 b" L8 `+ @
long get_ram_size(long *base, long maxsize)
% t+ J! \% v! c: m8 ~2 a
{
+ W7 F" C6 A, l' n( E4 K
volatile long *addr;
1 w7 _/ j& z: }- |
long save[32];
/ W' u1 R# \: ~8 T3 C
long cnt;
- U4 u9 ~ W* ]- a% J
long val;
5 K, T; S1 Q2 C3 H* J" Z3 I
long size;
. p4 H1 j4 B: n" q8 L# n
int i = 0;
/ ]& q- l, e5 e+ W
( {; y+ b5 i1 U. O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; v. u; a) ^" g! l8 |/ j* |
addr = base + cnt; /* pointer arith! */
1 }3 H Z- g2 f% z4 f
sync ();
& L% a/ ^$ A9 r3 `. N: I
save[i++] = *addr;
: o P4 ]6 h9 O$ N
sync ();
, R# C1 h: p+ ^" d. B0 {1 }
*addr = ~cnt;
7 r9 X5 o% Q7 H) f
}
2 D* x( H0 T, l3 s3 L1 F
8 |2 [3 l% B: B5 ]6 f
addr = base;
, h# P* x0 `' U _5 d
sync ();
0 e9 r7 w5 P! ]8 |( T H' k
save
= *addr;
. m( t4 F: n2 n' F9 ~
sync ();
( H/ [7 M1 ^* d' o
*addr = 0;
# C" t3 Y5 z4 V1 {' t
4 ^9 i- `8 O& e( _
sync ();
5 a; j$ J( C+ u% G
if ((val = *addr) != 0) {
9 v @' V. F |4 Q
/* Restore the original data before leaving the function.
$ b- A+ J& y% o1 m( e
*/
' G& c0 s$ P x; a) F! K- _
sync ();
, C4 C+ Y* ]* K) _
*addr = save
;
5 D& o' d+ @+ |. `$ i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( Z! X& ]5 \5 p
addr = base + cnt;
4 e0 r: u- C. ~, `; J2 K1 e
sync ();
+ g* [" O2 d4 C* y. Y7 A( ^% S- _' g
*addr = save[--i];
' G: ?9 o. S* H& s
}
1 r, i7 }0 _4 c
return (0);
9 b$ w6 ] j' h* e. M# b, y* ~! x
}
3 o. l* Z+ z0 b/ M
/ G" `/ f7 c) V* H% G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 N1 S( E2 b. f. l! ?7 w' G5 q
addr = base + cnt; /* pointer arith! */
. }. U+ w0 l" Y! P. j
val = *addr;
5 a6 H% I$ [$ |9 h! y e2 {
*addr = save[--i];
) j2 O. \3 f2 ?# y* k& L. _% V
if (val != ~cnt) {
2 r4 B( e/ }& i4 @" f' h0 \
size = cnt * sizeof (long);
/ E- F. y, Y6 q5 v( V0 O. S2 w
/* Restore the original data before leaving the function.
, C+ q: N2 V' g! J
*/
! f% f, t; n7 W6 i% c0 F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 Q# Q# q/ H7 y" W
addr = base + cnt;
1 `% r3 y2 ~. K8 A8 b' g
*addr = save[--i];
5 G; w/ \4 ~& X
}
& G" z" B/ o& i
return (size);
4 k: B3 C: G* X8 U! a7 D! h
}
3 b4 j! T6 w# d1 C3 H; M0 X
}
) u1 Y6 r! Y& |) M( G7 p9 t
" u2 \9 U- [# e. D. ^7 b t
return (maxsize);
* V$ v! }' s, M! E9 U2 a0 I4 w1 U( r
}
1 a* R, O, b+ G" K# B( g% Y8 ~
int dram_init(void)
$ s5 F! k) E. C- M7 E l3 R7 P
{
9 y3 O$ S" l6 B& ?% H- _
/* dram_init must store complete ramsize in gd->ram_size */
* Z5 x; O: E+ ?6 T
gd->ram_size = get_ram_size(
: U8 @6 F7 [9 u
(void *)CONFIG_SYS_SDRAM_BASE,
( ?5 `% @6 d: @; f4 G( H
CONFIG_MAX_RAM_BANK_SIZE);
3 t" i b# u) f6 V" {
return 0;
4 K- b G) P# j8 k
}
* H: ~9 L/ z$ I9 f# g/ I1 Z
( A3 d6 B6 V0 T( L" G# ~
7 e" A3 t+ d5 t8 g5 H: |
. a6 Z0 W$ ]4 M% K0 e7 d. s
2 G/ F3 ^: H) c5 Q) u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. k8 a5 P- M8 Z- \# }
' w, ^; ?& ^5 T
, {3 r0 F; t0 n+ m1 K
6 a/ l$ u, N9 F! _: s1 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4