嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( \6 B+ L9 {3 l# l
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ x% u1 ~& ?/ M6 f3 ^2 p0 [3 d# C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 N0 ?$ F0 G. z. @* f
+ j! Q5 o, n2 D: B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: h- h6 R* }9 H0 Z
5 P; e U2 a/ B* j/ i" l& G5 e" m
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 D2 ~& r: v1 \9 ~0 X
/*
1 j' O' j1 t3 G) p6 O2 g0 l% p
* Check memory range for valid RAM. A simple memory test determines
6 J6 y8 A2 T: [- T. S* t# I9 _
* the actually available RAM size between addresses `base' and
% U3 u( t4 _2 I5 p" L
* `base + maxsize'.
. Z* @7 j! Q; u, j# n8 \: E
*/
) G! q6 [" V0 t) H L
long get_ram_size(long *base, long maxsize)
f0 A4 _4 v% @0 L& i, G( p
{
! ?/ Y; K' L$ b
volatile long *addr;
' ^( j5 H* R: D0 y" ?0 v/ O
long save[32];
: n8 O& r2 _( k( s" U
long cnt;
' R: u4 R; M- a! Y% ^
long val;
+ p. \) d" S6 r% w7 {$ r! X* g T
long size;
% V0 @* \2 g4 w g6 ?
int i = 0;
9 q4 s2 p9 c* ~4 j1 P9 }
2 k" e5 u3 @0 Y+ n: q
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 ~6 \3 M, W/ D" O
addr = base + cnt; /* pointer arith! */
5 Y# w6 ?+ S! w; \) q
sync ();
3 N7 Y7 ]+ l, q' [: \! U
save[i++] = *addr;
$ G% |7 K0 {* B" ?" H' w0 v
sync ();
; j; l" O# e' F: M
*addr = ~cnt;
) P* `6 k& j' o% u
}
, `8 Y( @1 c) i+ q+ Q$ }4 E4 l
! s1 ^1 {8 S' {4 P" d$ M
addr = base;
! v' n6 L M3 v% s- e @+ g
sync ();
2 J+ l+ z; a- Q5 D! f1 d% l
save
= *addr;
$ F8 D+ Y" c: M; p
sync ();
! G3 ^$ e' G. j
*addr = 0;
2 S' A2 I. y: {5 Q$ W4 }+ C: {) ]
5 Z1 ^/ }) v: e7 r- i' j
sync ();
1 `( G7 \* r) ^; F N
if ((val = *addr) != 0) {
z8 ]8 k. s, k4 J% V. p
/* Restore the original data before leaving the function.
& i z7 n8 c \0 M2 J
*/
! T, Y# h! _4 {2 y, Q/ ]
sync ();
* e7 a1 U& |! t8 g5 ?
*addr = save
;
0 |) s" p9 b; R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 \" q# J" [1 y7 v2 k {3 M' h
addr = base + cnt;
/ E# ?- T& O: Q8 U* r, K& A( r9 V
sync ();
" f1 p7 k/ K4 u
*addr = save[--i];
1 T7 J6 ~8 U: n& J
}
( j5 ]# r% N: Z5 U; w( n' L
return (0);
K0 O/ `% x5 l7 _! b" ?2 @
}
4 u2 {: T# W. R, ~7 W4 z/ R) I1 f
. o1 h( F# @; w5 e" }. L
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' ~9 D. |" i* m( _
addr = base + cnt; /* pointer arith! */
- M# f9 `: F/ ?4 I
val = *addr;
/ W. W% H }1 M. ^: S" g# W
*addr = save[--i];
" n/ V! u: `, n9 a. b0 @
if (val != ~cnt) {
8 ? q- P" p" k. o' @2 n
size = cnt * sizeof (long);
$ O0 g- a* W# o7 y
/* Restore the original data before leaving the function.
6 Q* n1 M, {7 \( G+ Z
*/
, Z' t# g. e" ]" `+ T2 C" I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 x0 M" y( ~7 P4 X; ]& D4 h+ P: ]
addr = base + cnt;
( X% e8 I1 _5 h0 C6 h
*addr = save[--i];
. ~" Y% C2 o5 [1 ?. Z' E M1 J: B
}
/ N2 w6 a( [$ I
return (size);
" p+ M7 ^" z2 q$ w$ x+ E" g8 l
}
. V0 h( W; L6 ~9 B5 d( ]; H
}
/ _/ j' C' }7 J3 a4 _% n! w; }0 D; @
4 d8 `0 F8 `$ R6 j
return (maxsize);
# S' i0 i3 w, Q# c( L1 F
}
% p) P& r" K$ j1 v& P
int dram_init(void)
' j: ^! m: w4 m2 b( y
{
& {; N$ W# a5 I% p- h* i
/* dram_init must store complete ramsize in gd->ram_size */
5 B5 |1 u) f k& w
gd->ram_size = get_ram_size(
1 ?* r) D) N: |( J
(void *)CONFIG_SYS_SDRAM_BASE,
8 Z/ X1 M3 E8 c: h, s6 d
CONFIG_MAX_RAM_BANK_SIZE);
7 Z; P0 l1 t) I7 n7 p. G
return 0;
, U$ G# _! ]+ y$ y1 }0 c
}
) W2 o2 x$ L6 y. x! m
- f" n9 Q4 G0 j
8 Q Y5 z4 v5 I
2 I7 G, R: m9 P' g. @7 T# E
- x$ r1 F) ~7 {2 M- F1 Y' Z' s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; i9 \" ?4 d# C) G7 N
9 N, w& r% `( W6 L2 t" |8 D
* V7 e V! ~6 w) X3 m, P+ @) N1 ~# L
. i. T5 h$ C! ?6 ~) I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4