嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 [: H$ w% ~$ z+ Q* H( Q5 {$ w
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: V$ ~; L6 o: R: c7 [3 Z8 P( z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- p6 k( L8 g* g) ~; c
4 h4 N, z8 ?# K; N& G* O+ E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! T; e2 _) r! t
6 d: Q1 B3 w5 |; i* F9 A' @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. R+ [0 Y. ^4 o* n) d# [5 R) R
/*
5 @1 g# B& J$ C5 U0 q5 q
* Check memory range for valid RAM. A simple memory test determines
7 C- _% @1 y; F8 Z+ L. o Y( q
* the actually available RAM size between addresses `base' and
6 h4 C1 g3 C/ G0 {& E
* `base + maxsize'.
4 P/ v3 D6 `* ^/ a3 p% f
*/
; o1 F5 y8 |2 F: L9 C O5 y
long get_ram_size(long *base, long maxsize)
5 S( P( ]/ _3 [+ U
{
& S* e, J2 ^, K! S' g6 z6 _
volatile long *addr;
% C7 _& m5 a' a [* B
long save[32];
6 x6 W: ~1 d# r% t
long cnt;
% A0 n9 I& ? b7 _" v) Z) m1 ?7 X
long val;
* D1 B% d% d7 K: l9 j
long size;
" h' M6 y3 s: m0 d0 I! e
int i = 0;
+ o: g, v+ [; J; b6 ^9 E4 V
" H2 v( c5 g/ H( k+ @9 B" ?& Z7 `
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& `. `9 J% F d/ O
addr = base + cnt; /* pointer arith! */
) s) s3 E3 m' A) D& r
sync ();
# {, P5 k( f$ s" E4 \, L; A; }
save[i++] = *addr;
5 ~0 @/ \/ e5 c; V- c2 V# }7 i
sync ();
- }, l+ M) K* H
*addr = ~cnt;
. m) H2 C5 R- [/ A+ ~: A, d
}
7 Y: Y) I( V/ F. i. j
1 j1 o4 U/ o, y& C" a
addr = base;
; ?4 U* B, B1 \( z
sync ();
( u7 U$ C7 ~- v, ?* c% }9 Y8 J8 R
save
= *addr;
! i$ n( A, q9 c ?. s: I
sync ();
- k) o. V8 M! R8 E6 Q4 k {. R+ l
*addr = 0;
2 l5 f% Y+ ~: d
1 q( R4 g. z% {) J
sync ();
8 I& ?, P$ ?3 l
if ((val = *addr) != 0) {
1 N# h9 m+ k% Q3 U" v! Q: @" O9 @
/* Restore the original data before leaving the function.
3 f! S2 o: S5 @: w, }$ c# M
*/
3 K% B3 c5 _: ]5 [ f( `
sync ();
) Z# E8 m7 n. I7 V' X; m: k
*addr = save
;
5 B/ @9 s: E. Y$ m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, P3 @1 x* V6 K! ?$ ?
addr = base + cnt;
; w8 n1 ?/ e6 F6 U
sync ();
' z& C7 f" L$ d4 a$ V4 A
*addr = save[--i];
" A5 r& S8 e$ T- }! q6 F
}
+ D; ?' I8 y: x) S: }
return (0);
) y! T+ I( P- x1 h6 \* D4 A
}
% D) k R! F# w) A$ a: {
3 X% F+ w* j6 b5 y' z. T+ H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# A# `- z' T8 \1 r0 ?
addr = base + cnt; /* pointer arith! */
7 m. Q+ j# E; V7 Y, K' A: k
val = *addr;
/ L1 e1 b+ Y/ \7 A$ o- ]
*addr = save[--i];
; v+ |2 U: W u$ Y& _
if (val != ~cnt) {
& G/ U- ] I( z& c3 J0 h
size = cnt * sizeof (long);
' \! x+ H" p \, a' L. Z
/* Restore the original data before leaving the function.
9 `4 F( c4 z1 G1 ^, ~6 }
*/
' d" {& F4 `8 r0 C6 O# u" D6 D
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ d; D8 ^! h9 `4 {0 K/ z- `
addr = base + cnt;
; O7 l+ g; A% p; O
*addr = save[--i];
* m N4 x0 d$ n4 e
}
1 k @# H# K) I0 l0 `
return (size);
2 A k3 Z# x4 k* I3 k# g
}
( @$ [' m- g9 B( C7 Y% R. m
}
5 C: E3 H; y1 }' A' r! Y( X
' h, V9 Q3 K' c. {$ s9 E( h
return (maxsize);
t; b8 Y9 o/ Y% X! g/ M! ~
}
" W$ |* \, J, _! `/ @! G& F2 k
int dram_init(void)
* O/ r/ ~ G/ M2 f( \
{
! K B( [% r4 C2 g! p
/* dram_init must store complete ramsize in gd->ram_size */
7 {% o0 s. d P
gd->ram_size = get_ram_size(
0 ?1 b; H: N) O+ [: t
(void *)CONFIG_SYS_SDRAM_BASE,
2 x$ z! [' C+ X+ Z+ p2 J* Y
CONFIG_MAX_RAM_BANK_SIZE);
+ a9 m5 A0 ] d% e/ k! G. c% h
return 0;
, v5 n9 y! h+ t& Y
}
# K3 T$ C3 y8 V k( H. i
! v* Z4 {- H6 p; Y
# z$ u a3 P: \% d2 p% W
! c4 n2 ~: q4 h9 q
+ P* P9 h1 H( G9 b% ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 m8 Y1 h' M9 P- c' g4 e
( d9 @# ~0 g; i( {
! }9 C P' A$ ~6 |& u) D
. A5 W* U% a0 a, E/ I$ p2 U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4