嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
) _& Z) K; w( M" Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 P2 J) s) _% ]" y9 }0 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ x9 ?! y- f# C2 @$ o# p1 Y1 o1 P
' @: V' j6 g" X( V) \% Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: H6 u ?: [+ M( p* S5 ^
- j+ l( ^/ p6 _% b
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, O9 @% [ E/ ~0 V; L
/*
6 z" D) Q4 D- K- t. A( D
* Check memory range for valid RAM. A simple memory test determines
- K, H5 a* I+ g% D K9 r0 n
* the actually available RAM size between addresses `base' and
/ ^' E2 y/ {" A
* `base + maxsize'.
* X; p7 ?7 `8 R2 s0 U1 |8 O! w% E
*/
& Q: W3 t. n, X' z
long get_ram_size(long *base, long maxsize)
* _! P4 _" x. L) s y
{
6 o$ [& c# z2 a$ A7 d0 K! V
volatile long *addr;
3 S0 X" O& P5 l4 A# \( [. p* ^4 v2 _ [# @
long save[32];
* t, [+ S& M: u
long cnt;
8 | M, H/ }' }
long val;
* @+ v+ w K$ r: O' k+ j; \* `: Y8 \
long size;
& }" ^& l# d9 W9 d
int i = 0;
' _8 V+ c9 h+ P! ]
2 w7 [2 j4 o$ y" \: W u/ H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: M; l5 N2 Z+ V0 B1 B( ]
addr = base + cnt; /* pointer arith! */
7 A Y/ p. I5 b7 q
sync ();
3 }- B5 ]$ r4 a: i; ?$ |, v
save[i++] = *addr;
2 \" F% G4 T: ]! N3 n. y
sync ();
1 e. i5 i; K9 G
*addr = ~cnt;
0 b* K! n- i' M# {$ G+ L& ?
}
( \8 \) O6 j7 l/ N
( V5 ]& ]/ M& F5 W5 D) {
addr = base;
2 o7 f$ l1 [- n" m2 n6 b
sync ();
/ w! r$ `* D, a# ^
save
= *addr;
9 y l4 a% J/ F1 H$ E6 k
sync ();
0 b( e9 Z4 p$ N0 z) z% s) f
*addr = 0;
7 ^+ R) _! g) l
7 O( t/ E ]' |8 k9 u$ O5 C
sync ();
, U$ [ g1 K, }5 @
if ((val = *addr) != 0) {
2 y" ]) j6 A6 ^
/* Restore the original data before leaving the function.
& f' p; [. q& r) p5 W2 m) f$ k |% V
*/
3 v9 G3 @! N9 N; F
sync ();
* X$ B( c2 }9 ^$ K
*addr = save
;
9 H) d, o! ~* j+ D+ C2 |0 G7 g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 l* s% Y# R! O* k5 w
addr = base + cnt;
% P& k. S- k: n4 i2 g6 w
sync ();
- a) x$ ^' x3 w% L/ p6 S+ g8 J
*addr = save[--i];
+ R# Z. g9 }, I3 w6 I! @
}
5 h" N2 r6 ]# K0 d0 C) M! D
return (0);
8 g2 ]5 g Y' `2 ?- \- I: d; u. H
}
3 Y/ Y7 g% Y9 G3 a. S
4 N, E; i) a$ P! t' v
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 z. M4 @/ W7 O
addr = base + cnt; /* pointer arith! */
- J# i& @8 H2 {: U$ W
val = *addr;
, O+ ?* I7 K! ~7 [ W+ t
*addr = save[--i];
_, u) G$ ] g
if (val != ~cnt) {
. j: Q/ U6 Z8 Q& a2 i+ K% H
size = cnt * sizeof (long);
/ d) p' l8 J/ h( ~
/* Restore the original data before leaving the function.
/ o. y; S2 c2 ]$ K7 ^
*/
1 W' B) B/ u7 z( T- h$ {
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ U6 z7 h* b8 K, B# s
addr = base + cnt;
' x! `2 E3 H5 E0 L
*addr = save[--i];
6 ?( N$ e) \; Q5 x0 M& Y* o4 J
}
* q6 p! E6 G( L: P$ q
return (size);
+ \+ y8 J; ]+ r# f; \! E
}
! [9 A- |1 e: W L- }
}
) _3 C4 e7 }2 O' o2 x6 n J
9 h0 Z% G) f; W7 \. r1 A D
return (maxsize);
" _& P# t' @0 d9 [# P; g# Q* I
}
( a( f }% q1 ~! l
int dram_init(void)
, |3 }+ H! X/ W$ B6 Q4 z k/ R
{
/ \+ f! i0 v7 b0 W
/* dram_init must store complete ramsize in gd->ram_size */
+ N) |: |' }; c u1 d
gd->ram_size = get_ram_size(
% a) d/ B/ G. d' e
(void *)CONFIG_SYS_SDRAM_BASE,
# {* ?/ I' R7 {7 J3 x; H5 Y! @
CONFIG_MAX_RAM_BANK_SIZE);
8 N( `9 [' S7 A
return 0;
: Z1 I$ }, Z3 z }3 ~* m, o
}
! q9 g5 ]3 t6 g/ z! I! K
8 i) @6 C4 g5 N4 l) | S
$ D5 C6 `" D2 r- k* J1 v
, u$ z% Q% j% h( B' y4 W7 i
# e9 T& W {4 [0 G0 {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* N6 h! s x/ K; F) L) d' e$ C6 }
. y) Y' K+ M) x2 s! L: n
0 |$ x, B8 @$ H
$ x, G8 t$ s( ]* a4 C8 s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4