嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
0 z! a% i k; ?+ a
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! q% a' j- u a" b( N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ Z) e' b0 B% m
4 O8 \1 w" G" w* k5 i8 H7 R& A3 M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: j0 k w! J- \5 J/ \" {
/ S3 G* d+ E$ o6 N2 g* V4 h
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ [; u. F2 c2 h+ {% _
/*
2 y1 D. s" O7 h! Z0 ?' t% \
* Check memory range for valid RAM. A simple memory test determines
4 @7 e9 L6 F B9 k
* the actually available RAM size between addresses `base' and
/ r, w4 l7 i( y" C5 C/ C& H$ |+ {
* `base + maxsize'.
6 z) C) p0 i8 v1 }9 J* g
*/
% [6 z! F- f' q3 J
long get_ram_size(long *base, long maxsize)
& [8 A; u2 V0 q
{
( m! b9 h2 g1 z' W
volatile long *addr;
; V/ e" U( v5 l" r8 P0 V0 X9 v
long save[32];
0 {/ }+ ]5 Y2 D& p. x# j, s& S& M
long cnt;
# ^% n- {% p* O+ ?( r$ H
long val;
( e i- y2 z$ P" W9 R8 R+ B
long size;
1 g8 F7 O7 p. |# Q1 j7 T
int i = 0;
. `" H4 s T- M9 v
! T; a9 ?# A6 W+ d$ t
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# _: H+ g+ m& h% N. G
addr = base + cnt; /* pointer arith! */
% n5 ], a( N N# K9 ~8 x! u
sync ();
. g8 i% p/ X' J A; p
save[i++] = *addr;
; y7 m( u. Q0 K( k/ X5 n8 P: `
sync ();
7 I: J y. K8 M/ O: ?
*addr = ~cnt;
9 F# |* [( j, _. P% O. [4 `
}
- R7 `& T, T( R b& r: F% S
; \+ @0 i: S( J% l7 k0 I; [
addr = base;
! L: Z/ d" Q* B6 {( [
sync ();
5 P4 D: O7 I( w1 P6 m2 A8 v$ X+ A
save
= *addr;
% j ?* D0 N/ X/ U7 m
sync ();
9 X' U6 r* ^6 }0 n# P0 A" H6 n" f
*addr = 0;
. W3 x5 T' ?, x J/ Z# s% L5 y
& X" ` m: z3 o! }- x
sync ();
8 u, ~. N. x) W a; |/ v
if ((val = *addr) != 0) {
: m( W# l( e$ d% N
/* Restore the original data before leaving the function.
) o% o( V1 d) Y: `. m
*/
; C# e( f4 b& [9 T
sync ();
) Q9 K. e1 ?' U
*addr = save
;
: U. M. ?5 B- G; [ B
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( N( U* [% L; ]- o* o0 }
addr = base + cnt;
- x: s. B+ ^+ A) [1 t# H
sync ();
" q! C7 L* T0 e. }
*addr = save[--i];
4 s2 ^* Q- ^' Q' h8 C7 g5 p5 J
}
+ c8 t; b% y) t/ R, o4 V0 `
return (0);
: P5 o0 g& @4 `* G" u5 c, w; }+ a
}
9 b8 M i4 d2 O' f; a" z$ v
! A0 r: {& ~) l- E/ j# A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- A: A' `5 V) z3 s' i
addr = base + cnt; /* pointer arith! */
7 _- y1 x, T/ g& W% [4 V
val = *addr;
' g* Z0 P* F3 j* |
*addr = save[--i];
n+ R- j* b- W1 t* R m, @
if (val != ~cnt) {
4 z/ S. n8 [0 r
size = cnt * sizeof (long);
) A H. ?: L, k ~- L* D0 {! D
/* Restore the original data before leaving the function.
" b; @1 Q) M8 T) D9 [, r2 j
*/
; y3 A5 G1 W+ n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 i! H9 K7 @3 B: ^5 s/ u7 y: b: J
addr = base + cnt;
; H' p( q4 U3 O# E8 v9 c5 f
*addr = save[--i];
8 h& K( W8 m/ d# @
}
- g: [' G) p5 ^8 N) r
return (size);
% J" l9 j4 B! p
}
% l' x; [0 Z/ C' G( x$ @
}
! b9 n& v( o" H* N9 Y7 R/ V2 C& w2 F
6 E2 _! N8 D/ g6 w w" g# O' @ n1 }* S3 ^
return (maxsize);
) W- H7 ~1 [# z; o
}
( X/ V" @3 h, y( y# \
int dram_init(void)
+ E5 A/ V% d9 n& P
{
' p8 {# i) U G) }, L
/* dram_init must store complete ramsize in gd->ram_size */
$ ^- F) Q: P$ Q$ o! M, s1 U' h
gd->ram_size = get_ram_size(
6 m! U( s+ V6 e! ~! E1 |( B/ P
(void *)CONFIG_SYS_SDRAM_BASE,
) r( S; ]! a3 Q y
CONFIG_MAX_RAM_BANK_SIZE);
; R( k. Z/ [- E% n7 N6 c
return 0;
# L# p n; i; a6 U4 T( F
}
# W) `3 Z' F* f, O
2 g7 _4 ~ S7 \! M- W$ C. E
D; {9 e+ N2 T" n; w
5 f6 Q& c2 P. F- G$ B
1 T m/ _( x/ V0 G
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, h5 J3 y4 @( Z5 F" v, F; I
" {3 l& }" c% L( X" e
" P5 _, f, K5 [& f) O( S
% X, P3 q; Q2 l, L% R. T; g
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4