嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 P: N4 N T2 C K4 ^9 R* c$ @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ z+ R- \+ X% I1 N$ J {. T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; m" e2 _6 w7 c! v0 d9 A0 L
' R1 e. |4 s7 C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# C7 |9 G$ T# m% f
( V7 b6 L! X. M& U5 t
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. y- p. N0 h z! T
/*
& N/ K" \7 o( b. x6 f1 H
* Check memory range for valid RAM. A simple memory test determines
# I8 }- o. k$ J7 m1 j! q$ C3 \ F
* the actually available RAM size between addresses `base' and
; @7 F8 B7 Q, @3 V4 D |9 ?% `
* `base + maxsize'.
/ R- Q0 J" B; e
*/
J) E. t. u! h9 V9 g
long get_ram_size(long *base, long maxsize)
. W& y5 R; b# m# z: I
{
( |, x0 h5 w1 A. ?+ g1 h
volatile long *addr;
+ ~' {- j7 z; _ D+ _# Y4 N
long save[32];
f" J! K! f- T. @- M
long cnt;
9 x- C5 A+ h C* M: W2 ]
long val;
% x: e$ l6 ` g7 s8 p! p. s, g& k
long size;
) C% z+ e* C/ f; f* w
int i = 0;
# Y' V3 Y; j- L7 A" z
8 h0 M" H: B2 M
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) g. S: s1 B- G
addr = base + cnt; /* pointer arith! */
- D5 r0 a6 o4 @) f
sync ();
' i% z3 S3 Q r4 E- J8 x* j
save[i++] = *addr;
- Y" N8 I2 C' g T2 }
sync ();
: W7 t) j" E" B5 r/ s8 r
*addr = ~cnt;
. B1 m* i/ z) G; V1 U; H1 g
}
( B) o6 o J6 Y1 |% X
' N$ x- T6 [6 W9 S4 `2 o
addr = base;
* [, T+ {, }" ]
sync ();
# o6 t8 n- Z" |3 b9 Y
save
= *addr;
1 j# r8 W! A* K) L( x+ b; U
sync ();
( x) l( z, s0 w; O& j" v6 o1 d
*addr = 0;
! {7 {. L) ]& Q( d! f
0 F j" K3 ]8 J! m, }
sync ();
8 j c! `$ t3 V; M2 ?
if ((val = *addr) != 0) {
" }0 L6 u7 ]& J) _+ i$ b1 M
/* Restore the original data before leaving the function.
7 d6 ]0 V$ S1 W% l" p
*/
- ?; z n7 Q% c& a0 h4 [0 V
sync ();
" ?: B; x: I6 I
*addr = save
;
2 U+ S5 Z0 u2 a: t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; [6 Q/ @2 c1 s/ Q+ [0 L5 u
addr = base + cnt;
9 M& j( Y+ E" ?% ]0 r) @! @
sync ();
6 Z5 I+ A7 i, F/ E- E& {5 {: i
*addr = save[--i];
& @1 h6 ?- Y1 I6 O* V
}
( |7 w8 L5 v6 z3 q
return (0);
4 A2 H0 i/ x6 ?9 A# N4 e0 I
}
6 T/ l( J5 M9 g4 W: h+ z
9 a) W' A2 T& H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ j2 M& z' C8 E: y
addr = base + cnt; /* pointer arith! */
: X# c) X% T2 j4 i# R3 {
val = *addr;
& P {* d( O4 t% m& D9 O) a
*addr = save[--i];
g1 b0 T" R: ~6 _. n% @4 C4 ~( B
if (val != ~cnt) {
6 Q5 c, ~4 c& l& _5 }3 H
size = cnt * sizeof (long);
* `1 ]* U9 f# f* G* P" n; Q- `
/* Restore the original data before leaving the function.
: Z4 i+ ^' }, I' v$ `5 M% s# Q& u
*/
: |' C% l- f* i6 n0 X( I- ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& V1 x5 I# _$ {
addr = base + cnt;
7 G5 F; u3 x! M
*addr = save[--i];
% f7 u/ \. B6 z5 N% k
}
( q& k& @0 [8 w' Q- k6 k
return (size);
2 }# \- e* K6 |/ m- Z
}
9 R8 j! b% s; B5 L. C
}
% \8 T" J" F% s$ J' h9 @
' J& _5 b3 |/ W
return (maxsize);
) H2 A" I9 O$ i, P
}
) g4 ^5 }8 g1 o6 f
int dram_init(void)
3 ~) ?6 X. v: M& d
{
& K. d/ R% O8 {5 \- B( b) `
/* dram_init must store complete ramsize in gd->ram_size */
0 c5 a6 O# @7 y' \
gd->ram_size = get_ram_size(
5 o& w/ e5 z/ E; _$ K
(void *)CONFIG_SYS_SDRAM_BASE,
- i/ f. a( g( c3 j
CONFIG_MAX_RAM_BANK_SIZE);
/ Y/ e. [* u- o
return 0;
4 w# O$ n8 u2 Y, h. l# u6 r
}
$ J. K) L3 W9 ]
3 w9 i: r7 P% a( l& H, }, \5 a
* v1 e, k# G# I6 Q% O
) X3 F; l/ `9 g& P" B5 k
" A" ^3 O' U/ p) ^/ c: |$ f7 N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 h3 y* x+ W& ]) c
0 E8 N& ~9 k5 `+ o
+ t! c$ `1 e2 P8 i
% B, T3 e5 l; M; A9 _! w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4