嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 l( ^3 ^. W8 I- l* S+ N- x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* H& E7 O) | C: r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; P; F3 E0 w5 m0 `, r3 U6 ]
" t# X5 J; s3 M q/ x6 I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) P/ \' d5 d6 k0 S; `6 k- Y
1 O- }5 W, s3 a+ v1 D% l: |$ \# n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 b; a! k$ C0 |+ |3 B V+ C8 R
/*
$ ?1 l, W3 L, o6 {( D" j; ~
* Check memory range for valid RAM. A simple memory test determines
2 R a. D7 G9 x5 h5 n: U6 s
* the actually available RAM size between addresses `base' and
' p; ~ g- }0 j( O
* `base + maxsize'.
, f) X% ?# p1 [* H' V* U4 P) z* g$ Q
*/
. }! S# y$ F6 v1 X. L) d" b
long get_ram_size(long *base, long maxsize)
. Z/ J+ ]: }: x3 ~2 d0 b8 o
{
/ _8 T! x4 V/ Z) a
volatile long *addr;
1 l9 X2 B' n8 J
long save[32];
5 K0 I: e. S1 ^- X1 u
long cnt;
! b& b% H* @1 s) _
long val;
0 J+ Y' ], `& E2 S L
long size;
4 F7 Y! R7 m8 x6 s
int i = 0;
( A' M8 O; T) B4 z# V) v: o
1 z C/ W: [+ z& w8 K5 G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
I0 }6 E0 e' P
addr = base + cnt; /* pointer arith! */
; q7 z; x5 j% N, m6 g! I; ?
sync ();
! }, G% L1 \, z$ J# |$ B
save[i++] = *addr;
9 q2 ~: E" g6 q M" `5 Z
sync ();
) ?% k- @7 i' a, _2 [
*addr = ~cnt;
a# h# @3 N" X4 R7 P) W& A
}
) q+ X! x: m. k# v$ S: q
8 [4 u' b7 X* f, i/ _1 ]8 V
addr = base;
0 t- M. M5 j/ p: J5 ~
sync ();
_+ C! k+ I5 s+ Q+ K
save
= *addr;
5 i) Y4 l0 W* a3 o) }: N4 `5 B
sync ();
$ ~. ~+ o+ x+ Z8 e7 T* y
*addr = 0;
: i7 h1 ?9 \* i; g7 N
4 ^: H% `) q/ W+ Y% M7 `. A$ a% Z
sync ();
6 I" u0 f3 p3 B* s) H% I
if ((val = *addr) != 0) {
" q- w# v9 a& H, [% {$ Q4 M- |8 @) |
/* Restore the original data before leaving the function.
& b6 Y( \2 G0 `
*/
; ?/ K& G3 E( L4 u5 [ X
sync ();
; M1 Y. K3 Z4 U0 ^9 @0 p
*addr = save
;
/ s% b! y2 c4 Z! N% o/ T" F5 P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Z* x7 k+ w' s( F
addr = base + cnt;
4 r$ V6 v% @# R) k. C
sync ();
3 T% a' ~! Z! ^' v' P2 d. ^/ N9 B W
*addr = save[--i];
% c4 d ^' y# [5 t
}
1 n+ Y6 J* Q0 m; b6 ?
return (0);
0 j4 I! |0 G: B( L9 c3 e0 Y7 n
}
; X+ w0 _6 |* Y: _9 A3 q7 P3 H$ ?) s
$ k0 r: m% V( l% t& d
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ^" i' X' Y6 b, ]% M! `- r
addr = base + cnt; /* pointer arith! */
1 s/ x- P, P$ X% Z% Y
val = *addr;
5 c; j5 V t V" j. L
*addr = save[--i];
* X E( y# X$ {; E. T( |; Y1 S% @
if (val != ~cnt) {
/ |4 H/ n/ D' v- c( y* o
size = cnt * sizeof (long);
) S* L; k" G2 d' L; m
/* Restore the original data before leaving the function.
8 w) V. g: M+ l: U7 r5 Q
*/
) ]& ^$ g2 d% b/ }) o& D" E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 o$ h# ~8 `: t$ d/ Q: ~
addr = base + cnt;
3 @# w d5 }8 l* b- _' N2 M( \6 ^, \
*addr = save[--i];
+ E$ e, D% E: @; p3 [1 ~
}
: F3 r2 W5 r1 N% d+ J
return (size);
0 ^; n* c6 {7 x7 z
}
. }4 l3 j0 n4 I
}
7 V4 Y) f% U- z3 `: E
3 p( A1 i# j0 ~8 t1 V
return (maxsize);
1 K& x' l, ?$ i! h( |
}
% P! X, c/ M& I1 t; @& `
int dram_init(void)
5 m0 c7 I1 e# T1 z N6 y" {
{
4 F+ P5 b- L& Z8 y0 h. a2 T
/* dram_init must store complete ramsize in gd->ram_size */
* _" A4 e% {5 J
gd->ram_size = get_ram_size(
* |- \( C" _1 I1 ~8 {- k
(void *)CONFIG_SYS_SDRAM_BASE,
- ~5 p; U* v: L9 ]
CONFIG_MAX_RAM_BANK_SIZE);
+ p2 ?( A! g! Z& a. q% s
return 0;
& J( e7 z( ?1 H* q: Y& W
}
* X& B* W3 m, T0 Y5 a" W
: {1 o$ G" X5 A8 F' I$ k2 d
, u3 ?* [% C$ x0 {
/ m$ _, x y7 X' `8 y8 i
N2 l x$ x* A
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( Q6 c p5 X: l$ a2 g& _% ~
7 b T0 M. C& Y! T& s
# F/ [& W2 j1 V4 _9 D6 Z5 H1 W$ }2 {
! y8 i, |4 ~' v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4