嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( b% c; f7 x5 z, j; ~" N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ I% E1 O- M2 u0 a( k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& d" j1 C% y: |6 U/ ?; {
, D4 K5 Z$ Z6 u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 A$ ~; U J/ w/ S! C8 G D4 U
4 O- H3 s2 \( Y) D
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ i0 M. i! t; h5 n
/*
/ P! r4 l% ?9 z% s8 o# U2 c5 R5 K
* Check memory range for valid RAM. A simple memory test determines
g. t" r& V* k' _! e' g/ j8 e6 _! b! v4 j
* the actually available RAM size between addresses `base' and
# E7 K$ |) ?, `2 S) ?) V3 q
* `base + maxsize'.
V+ n5 y* R. c5 T2 u
*/
' H% {- C- ^1 V; t
long get_ram_size(long *base, long maxsize)
" E# f) Q% |, L8 j n
{
* ?3 F7 p2 ?8 ^+ Y! `" c
volatile long *addr;
( w, I! z- W6 ]% r8 f) D/ k: `
long save[32];
, ?9 h: W8 t' M6 d
long cnt;
9 ~* Y4 B, W! y( P6 Z1 @+ h Q
long val;
9 l4 B' f6 G5 |: \
long size;
: p! V( d/ E" W3 A( k4 T) Z% `4 }3 X
int i = 0;
' { i+ i4 I8 {, G) z. N8 e
" H- m& D `" g( c5 f4 D
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* J, r3 s. I9 j' g0 Y0 O" J
addr = base + cnt; /* pointer arith! */
/ I% r( w- X- L! h' `1 o
sync ();
" x, T! d/ N# q! b3 w0 J
save[i++] = *addr;
5 Y) T& w O# l
sync ();
" {! e2 P, y& | j) A+ r. T
*addr = ~cnt;
X5 ]5 a9 l9 j. D- o/ A
}
U, U+ ?' W# a, y, b; i
6 [' k7 d1 S8 F
addr = base;
! [4 ^! o, s' }2 {
sync ();
2 D @* S5 A1 @* {+ u7 W, R$ D
save
= *addr;
/ i4 K$ i7 {, V0 O& d, e* E
sync ();
- r v' @" l+ A
*addr = 0;
8 j' Q( l4 J( C8 Y }# g( C
& |7 W6 `) i- m9 A- b
sync ();
" g: c1 Y1 _* n5 \; x5 P- z: \
if ((val = *addr) != 0) {
; F, r" T% ], ?/ e# P2 d1 X
/* Restore the original data before leaving the function.
% | b2 D7 o [! B
*/
. ]+ i' P8 j2 j( n* S. A8 P
sync ();
2 D. Q2 P2 E' Q$ Y5 J
*addr = save
;
2 G( r- c& b8 e( ^$ u( E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 r8 T0 F* p' Y$ X) y% m+ l" F3 @
addr = base + cnt;
6 @! K1 C' E. d0 l1 w/ r
sync ();
& j/ h( ~8 l/ A7 ~: X
*addr = save[--i];
8 z3 s$ x `& \( M8 q! D% |+ x
}
! g- {2 ]- l2 U- Q
return (0);
" M" M' H& u8 C7 I% h
}
; g1 z& D0 h5 u3 L, k3 f/ h3 ]
8 z9 Y' j! t" x( u" Y2 T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 s i6 d- c4 s! R- e
addr = base + cnt; /* pointer arith! */
( A6 h4 c0 X$ `; W5 j
val = *addr;
6 y1 v) L" J, D% u: A
*addr = save[--i];
& K$ @! |+ d3 ^+ X. s* ?- t
if (val != ~cnt) {
8 p d" C* N( }* i+ w0 Z
size = cnt * sizeof (long);
8 N' A: R0 Q m$ ?' x
/* Restore the original data before leaving the function.
2 D, l" a" @7 m0 z& \
*/
) z- C( l( _7 G/ D5 [4 @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 C9 P7 j8 F# @) @
addr = base + cnt;
* f2 r9 c$ } y. Q H; c/ _( m
*addr = save[--i];
5 T8 Q5 E. L" S# j" |: Q4 s+ H: O- ~
}
. [, \( Q3 e/ I) k! C
return (size);
; g$ a. X- e# D* ~6 v
}
$ V/ }- z$ G' @4 G1 p: o; G- V
}
; t' u# I9 x9 I, d- Q; j7 P5 Z
+ D) O7 L" n* f, ~: P C
return (maxsize);
6 O% e+ t+ h, e( c5 ?6 T
}
8 Z9 |- _. z) W2 a2 O& Z, Q4 {2 Z9 A
int dram_init(void)
3 q" E3 m! H4 ?) G( t' _
{
, B: f: P" V6 I
/* dram_init must store complete ramsize in gd->ram_size */
" u( k$ L$ p/ M: R) B
gd->ram_size = get_ram_size(
* F) e; {3 L. u' l
(void *)CONFIG_SYS_SDRAM_BASE,
. O0 Y# \3 W1 d% a' e, x! K
CONFIG_MAX_RAM_BANK_SIZE);
) T& E8 H7 v& H0 g) j
return 0;
9 f& y- D: R, B7 T# b3 l
}
% y" u3 {- h% q* S* _+ ~
3 m5 [* y) l& h. O9 e8 W
' X& L* f& C( H. [8 \2 s* ^
2 ]( B% D% Q% R; V8 y
6 A" z" D7 u! k% |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* t/ P$ v2 A! a; E; Q: T
+ v& `; G/ x8 C! ~4 M8 u
- [! `; B1 R z* S( i8 J
0 y% j+ m5 B5 @3 y: ?. J$ o6 s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4