嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 O3 K7 Y, W' }8 V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* E' g: E! _3 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% v+ C; a6 l4 ]$ ?& }! v
4 l4 `# z j' s8 j* B' V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 m0 r3 p) p" ~. i9 T" U5 P
3 q% t4 J1 T! [6 B6 x% P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! j1 b# s2 n+ D$ b7 c
/*
- X& T0 b, ?# Y6 [3 m. v* S
* Check memory range for valid RAM. A simple memory test determines
& Q0 |( E/ |& J* B! x
* the actually available RAM size between addresses `base' and
% h! ~ T4 V/ o4 _3 s* y* q
* `base + maxsize'.
& a6 f/ x+ u. L; M" q2 T
*/
% g3 Z) y& ?+ k" U
long get_ram_size(long *base, long maxsize)
: g; F9 \* y& ]+ r
{
9 |5 U: g3 s4 N% [' t
volatile long *addr;
: I: X, K" e& U( e
long save[32];
( o3 ]- Q, P" q# K! J
long cnt;
! X" U& }8 d3 f' U; b1 ?/ t0 e
long val;
1 O# k" `( T: t4 d7 Y+ S9 P
long size;
' [& C% W7 G, b* N' ~# w
int i = 0;
$ u( m7 z7 P% V+ I0 a' q
. d$ W5 O* R( t- d8 t# c! m/ T, C% W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 f8 F! p$ n$ y( e
addr = base + cnt; /* pointer arith! */
- Z0 h. ]0 ~. p2 a. @! ~( _/ D/ d
sync ();
" \( ?# H7 R' o/ o* y+ Z" n' b
save[i++] = *addr;
2 O( j& F% Y1 L @& l
sync ();
B) }5 ~1 m. K4 Q" x* u
*addr = ~cnt;
( B& t0 h; `# p6 v% T" P- ~
}
6 y9 u" ?( L3 I4 S; E, j& M4 a
5 p0 i% e4 o: E3 M! l+ Z
addr = base;
7 Z! Q4 z4 L. s% T. K, K m
sync ();
" ~0 B( y6 R. l- n& l
save
= *addr;
5 d$ y3 _% v4 w- W( ^* |
sync ();
0 q( d! f J' k/ Y& j: e! c
*addr = 0;
% X! l, N) U( W5 h+ A. J* }
N6 V8 E. k& r! `: \
sync ();
1 T0 ?. A3 u/ N F$ y3 G4 _* Z
if ((val = *addr) != 0) {
3 N$ R/ Z0 w& a, T* s. P9 v
/* Restore the original data before leaving the function.
) R& m9 }7 z" T6 V
*/
1 k7 s! j$ ]- C3 v+ N, t
sync ();
: g1 r! d9 t \9 q6 C7 y. b3 L
*addr = save
;
% a0 e$ C r* t/ c7 O( a q6 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) J, j# D8 X, Q, c# N5 F
addr = base + cnt;
$ H! Y% f T' J) {4 `3 \ t. N
sync ();
6 [1 |5 i& w- J3 V N: S/ }! [
*addr = save[--i];
) \: X3 N0 S) P
}
. _; j$ E+ m% x1 {5 h3 H9 {, u
return (0);
# O' ^ X1 f* ^( w" ^: x; w5 M
}
: J- n: B( I) @" t1 d+ i$ ~! n' G
: W. F# `) H% }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" J. H4 I" Y6 {* u) W
addr = base + cnt; /* pointer arith! */
6 o1 i( y$ J- w% y7 Z
val = *addr;
5 L! d1 P8 o: ^1 _3 ]8 r5 P% t
*addr = save[--i];
2 k. d8 G8 L. D# ~3 N4 |
if (val != ~cnt) {
: I) ]7 C, d$ Z- E9 W% I! z
size = cnt * sizeof (long);
/ E5 X) M0 j8 z
/* Restore the original data before leaving the function.
, Y+ l; v- s8 ~7 j* s
*/
* s* l$ m- P6 D1 Z0 \4 _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" v$ H3 d# T5 I" x
addr = base + cnt;
0 y* b9 s( A0 e/ O# O) d
*addr = save[--i];
8 R+ _: O% L* Y' E) a
}
4 _0 |% u) h. o$ U0 T* r
return (size);
1 f5 P7 O# v6 T% }5 \; y" `6 s
}
, {) ~$ G3 Z b, @, Q1 ? |
}
& B. S% r& F! o4 E8 ~1 k
6 E) [2 ?* J1 ]: b! o
return (maxsize);
3 n* Y1 I, U4 m$ d/ b
}
8 R# V" [( o' y* f
int dram_init(void)
* l% z' G0 ^) c- U3 B' b
{
; l/ o# {5 p8 Z
/* dram_init must store complete ramsize in gd->ram_size */
* N3 [; d, ]0 O7 `3 ~
gd->ram_size = get_ram_size(
0 Q, m6 L$ Q8 _1 D/ d. A
(void *)CONFIG_SYS_SDRAM_BASE,
! p3 u/ D% G; @% w, N! t$ d. y% D
CONFIG_MAX_RAM_BANK_SIZE);
; q& Y* w1 L T. v4 N) j
return 0;
# f# l* l( a) \6 ]$ K* r) k1 ]4 E
}
2 v3 G$ W4 A p' S6 `0 W
7 Y! R; _. g8 g' b# W
6 f# }" I- E6 v* f" T
: \9 {0 M( K# ]0 ?( ^0 v
+ g1 q7 @) z+ t0 o1 p% Q. g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 m0 B4 ]/ w5 Z" s! U/ G
5 Q) s% m4 j8 l% k1 Q6 x* W
" T4 X# G# `- R9 m. V8 [4 b
, }7 [( `" x6 k: N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4