嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 |2 m+ s4 f5 f5 [2 X: P
核心板2:DDR2 256M Byte NAND FLASH 8G bit
" D5 s1 c# h$ N0 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 p- G- E/ b2 r7 b/ \5 A" X$ L+ _
m2 H! R& G. {- u* a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& D0 _- C- L- U
! Q/ ~' U- s+ D, Q# z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& p0 s: {" C' @% [ [
/*
- a8 M: F* u) d$ ^3 U/ z
* Check memory range for valid RAM. A simple memory test determines
+ z. o! W& U; g. R5 G. I5 c
* the actually available RAM size between addresses `base' and
8 C' a; w { m
* `base + maxsize'.
% N, s- s' t6 @- Q5 I! c5 _/ M
*/
5 z- E! [! W; q6 |2 v2 ?
long get_ram_size(long *base, long maxsize)
& G0 X4 {/ @9 @3 I& f
{
, J8 i# r( [8 e" H. k+ L
volatile long *addr;
+ `5 |1 f3 z1 O8 T
long save[32];
: S9 Z7 L) Q5 d$ Y. k
long cnt;
8 E) r; [ F+ A4 L/ L9 ]
long val;
! |* B) Y$ D) J p) E
long size;
/ c. E( _8 T* ?( }6 y
int i = 0;
1 _& v% c. i. s0 y
3 f. A6 H3 R- B D! L) d" k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) T4 ?0 w( f2 A0 ^; y
addr = base + cnt; /* pointer arith! */
: K6 h8 s) s& }$ ~+ x" M
sync ();
" i' \: w& i7 ]5 c$ i% ]
save[i++] = *addr;
( T( W5 X |& L
sync ();
) A. o% u- r1 x, }( n+ X+ t9 @
*addr = ~cnt;
$ {* r2 o( G% v/ i
}
& j) {! }* Q8 W2 n1 u
9 r9 @: }8 ^4 y- K3 x% l
addr = base;
; m; ?6 b' K8 d4 K
sync ();
' ?' \2 x+ Q1 d% B4 G' g% |1 t
save
= *addr;
g! I/ A" _4 s" e8 q
sync ();
5 F' R9 H" o2 {6 w6 D
*addr = 0;
. _! W5 f# Q# w9 V# x. k+ q3 E/ W
% L! ^' W# V( b1 C7 q
sync ();
. A4 j- ~' v( C; d
if ((val = *addr) != 0) {
* s4 B, `6 g6 D3 T1 c( e9 ^7 Y
/* Restore the original data before leaving the function.
: m0 h2 H( L* P$ o. H4 G$ F
*/
/ y; b1 r) v+ v
sync ();
( l1 b% y& c* C. f& b: c) {7 O: r
*addr = save
;
1 X: |! O7 o# s) y# i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" J: @6 i; b0 f2 q6 _
addr = base + cnt;
2 a! T4 s6 \; v |, z1 c; l4 V
sync ();
1 o3 D8 f# O7 z- [$ A t& |$ {
*addr = save[--i];
( _+ X/ O& @% e; w* l% d
}
' i+ a( L/ L4 ^3 K
return (0);
6 K3 R% R. p" I4 k9 w) H8 _8 g
}
$ j* y1 u. d/ m# k' c! o, }) U' Q
+ L, m, g% C$ {5 H- R
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! j& c# s s" J! j! a( L
addr = base + cnt; /* pointer arith! */
) e1 ]; a& U9 x% W7 w$ W' X3 h
val = *addr;
4 y7 C% Q" \4 D5 v# T( _
*addr = save[--i];
/ B2 T, X: Y6 J6 a' F
if (val != ~cnt) {
, o6 H q/ X4 b C% O* A
size = cnt * sizeof (long);
0 {- L0 y) a/ p6 T# ?
/* Restore the original data before leaving the function.
0 U$ V2 n0 e5 K6 c% l/ o$ T
*/
: ~1 g; S+ _ ?+ N3 h% E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 J5 X- \# @8 n; y0 J8 |
addr = base + cnt;
) v$ O* \4 [6 ~" ^
*addr = save[--i];
" A' W9 y% r' ^3 n* E3 S
}
% m% ^1 d) B2 r4 M) Y
return (size);
% l1 R! v/ r2 z# X; j
}
2 K! Y$ v6 e& F% ?$ k
}
0 ^, M7 {* `; S: {, X: z
) ?: I% j4 b; U6 r |7 f- _
return (maxsize);
; N P5 F& e+ O4 `' I8 x
}
8 E, y) r, w, V _' a$ e$ Q& w
int dram_init(void)
0 L: z e2 }' a( _: s7 [
{
' B: c# O) A8 k% b
/* dram_init must store complete ramsize in gd->ram_size */
3 \% ]% {: f( V2 c# y4 {; d% y
gd->ram_size = get_ram_size(
0 r6 Y& d5 W- i! m
(void *)CONFIG_SYS_SDRAM_BASE,
% b& Y8 R( P/ n$ V& L3 {# O
CONFIG_MAX_RAM_BANK_SIZE);
; x0 s' d/ I8 e8 \% `0 D
return 0;
6 ~, I' d# O( i6 {! D* S
}
5 z! H, T8 X4 F* o4 q5 ~
; g$ b! H6 N; _
' J& I4 F) x; F% k6 ?# \* M
" M% w' h: i8 [ j/ A* J
. P+ j! V/ R- Y$ x6 t0 `* n- b& c* @# w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 R+ m, Y7 c* W& U' m: y* ^5 f8 }
{ e( E1 L6 {* n$ t
8 U n' I$ P; E. _
6 n! {2 W+ `' D+ [3 q% O4 N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4