嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% X3 A/ Y3 z, y2 Y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! y6 u: Z a/ I8 Z v$ B( |1 A8 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ B0 d8 B [0 f* v
! T* X: u( Q+ [5 e D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& Z. r) C K* R, Q
0 F* l* T7 X' R. N9 \6 ^6 c- H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 ^7 p9 Y8 N$ a5 @7 U5 M
/*
. I. d3 }: L1 o' P; a
* Check memory range for valid RAM. A simple memory test determines
3 }# t% J0 q' T3 L3 G
* the actually available RAM size between addresses `base' and
- Q; Q+ @6 p Z+ E% P
* `base + maxsize'.
3 m# I3 I P6 X. O0 m# l# K7 K
*/
4 z, w. H9 @9 F1 V* u/ k$ G! K ^% ?
long get_ram_size(long *base, long maxsize)
5 [) \- D: J# m2 A4 b W
{
# k' t! s3 u: I) p. ?7 S& z* a
volatile long *addr;
: g1 h+ e% c. D8 G! ?7 e' ?
long save[32];
K" Z% r2 e# j) R
long cnt;
3 d2 y. a; t( Z4 T9 t& k$ R
long val;
8 V8 |% k( a! _5 M# v D# i2 Y& K
long size;
% B" Z. \. W( a/ q0 D3 J8 C! D
int i = 0;
4 E$ U7 z7 g; e% x3 A! t& e$ A! b
. F$ {& I5 s( y0 {1 E! g
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' c) `# G. N1 v$ K6 q. ?% V$ D
addr = base + cnt; /* pointer arith! */
: S5 h; N* n* j, ^. W
sync ();
8 E: v0 A1 p7 B* r: Y6 I* t
save[i++] = *addr;
) @0 m4 A# v1 A9 w
sync ();
}: D+ V6 ^6 I6 I: ~) D
*addr = ~cnt;
# F4 |8 R# j( o
}
' ~& A" N) Q, c
# A' \9 p: Y% J. n; a
addr = base;
; o/ t8 k' h9 j$ Y5 ^& q* {
sync ();
' g7 M8 K$ g4 g3 O
save
= *addr;
2 O' j% U5 e) A& y" M2 p
sync ();
# i6 c7 h1 _5 r; ?9 j
*addr = 0;
( W3 l# f8 k% C' T9 }. }8 T
( w) n& L0 K7 y. M: M( F# w
sync ();
3 ~; F! _$ @3 z& s% {
if ((val = *addr) != 0) {
& z: g* w& s, C& C: d3 O
/* Restore the original data before leaving the function.
4 P% `) l; b( l9 h" p; h8 u9 Q* K
*/
! P. }" f+ f( } X
sync ();
) k; C% c3 I1 c: V
*addr = save
;
/ z3 @: @$ H# N7 ^4 h& @; {5 o
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 c0 Q. u* |5 E/ f) Q$ |& ?* U8 d* B
addr = base + cnt;
: ^5 @% d; y+ s5 e
sync ();
" b3 ?! ^7 j- r' ^: @5 |
*addr = save[--i];
' a! s2 \' B2 h) V" C0 w% H' o! O
}
/ c( [8 S: J. }' g- A
return (0);
9 Z9 _) M: M- i9 q) r
}
. Y" C! |% K2 `# G
+ O: K8 C# r* C0 k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 B0 A' [5 i: I0 {. w$ i6 W
addr = base + cnt; /* pointer arith! */
2 k& s9 w9 p7 x6 s" a
val = *addr;
' }# A# s* ^4 p7 ]
*addr = save[--i];
5 n0 X3 K7 A2 M
if (val != ~cnt) {
3 d: P. k9 p( D, P, w$ q
size = cnt * sizeof (long);
! Z9 S8 `, k; G3 x4 t$ g$ N9 {
/* Restore the original data before leaving the function.
. l# ?" U/ g; Q) d
*/
8 `9 K1 K& z* Z6 j- _: m5 F) |+ o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, `7 ?, B8 i5 E: B+ k3 _; [
addr = base + cnt;
8 L$ a9 d" i! K0 I6 F& D1 i
*addr = save[--i];
) n" H6 u: o5 k9 X4 |) ]
}
* R7 I+ w( g9 ~
return (size);
. U; w2 \6 U1 o' w
}
/ p- o+ Q' u* B4 k4 n& u
}
$ T6 H/ Z. H* ^% [( G p
# f. s3 j8 Q- G* X
return (maxsize);
& h$ f0 o- f! T/ m* G" ~: L
}
$ Q+ h6 Q7 z; q! y
int dram_init(void)
( W% @: S! ?7 t) @! Z) D
{
/ o. ^, p! B! l- X
/* dram_init must store complete ramsize in gd->ram_size */
1 B2 Y! ]% a2 _1 I1 j
gd->ram_size = get_ram_size(
2 e+ n1 Q2 K0 c! }
(void *)CONFIG_SYS_SDRAM_BASE,
: Y& }& F8 ]2 o3 v; Y
CONFIG_MAX_RAM_BANK_SIZE);
7 A: I- |4 f3 G' T b' U$ ]
return 0;
4 O7 t! [; r7 h8 S3 E
}
+ t+ i) P! U+ t- T6 `
; c9 {8 ]! K6 q j4 ?2 P6 E
9 _- h! Q6 B. y, P
u3 N1 h d1 v P9 e
$ U& s' g7 O. f6 A6 s _1 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' C5 i0 Y1 P- w' v3 I; c _3 r
* n* u) M* r8 w
* f4 f, a% v, q0 N8 s
, h" k- }2 o9 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4