嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
l. D( `/ ]7 `- ]
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; m" w6 l, c7 R8 w. ]$ f, c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' c0 ?8 r( e6 s" H F
8 s# [& _ H& q: A b! [; y9 u5 C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. R; M4 ^& o( x
v$ \* W, @9 k, a" e
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! A2 g ?2 s9 }+ ~6 }4 G
/*
7 H/ H( o! Z6 [. K3 F% w
* Check memory range for valid RAM. A simple memory test determines
) z" |( C$ s4 C: Q+ @( @2 C, \
* the actually available RAM size between addresses `base' and
7 v7 K" Z5 \$ G s8 O
* `base + maxsize'.
7 o' @8 B/ r' b" E8 m+ s/ f
*/
u0 `# p; b# X& M: ^" d B: Y
long get_ram_size(long *base, long maxsize)
) {8 ?2 e: p0 }$ w$ }
{
; l5 H2 r: o( c. I# t
volatile long *addr;
( m, W! ~& x0 {: p$ j2 t
long save[32];
2 A/ J! `; v7 b! K" c5 v" V
long cnt;
4 @5 q' x+ g1 w, L9 Y% U( Q7 i! L5 b
long val;
+ O8 Z& h$ r( h
long size;
" Z% I1 R6 h8 s- U
int i = 0;
+ {9 {' i( v/ T! y( `/ S G, O
8 j: z& k6 ^9 z0 ] c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. P0 q; \; u3 x, }* k. h
addr = base + cnt; /* pointer arith! */
8 a. Z: Y j5 q( Y7 C6 e5 X4 k/ H; w9 Y
sync ();
' ~, y. I, _$ y4 F+ r# e
save[i++] = *addr;
/ b1 Y9 {" M, `- Q1 v
sync ();
7 Y, S' ~' \. I# e
*addr = ~cnt;
; _0 w- N4 a7 E
}
% S$ F; |/ G8 N
$ \0 B& x' x, m; @$ R; {8 k% Q
addr = base;
1 P6 i7 U- U E' v! C) I* p7 b# n
sync ();
! g' \8 T6 D5 w; J
save
= *addr;
. K/ z6 \5 }- W3 p6 P
sync ();
( ?" }+ e+ l& l! M
*addr = 0;
4 F2 f0 @- i* _) F, Q
, p" i5 R/ l7 E- ~" R* }& A
sync ();
9 R+ o* u G& y! P; A# ^
if ((val = *addr) != 0) {
8 M, A4 j: g- y; C) K+ Y
/* Restore the original data before leaving the function.
" X$ e& ?: z4 W& m- ?& S4 V# f6 F
*/
( G6 j' D, ^- M
sync ();
% I" ~" j. T4 F. J
*addr = save
;
# T0 J2 l# Q; N1 }! ? A* ]. K" a
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% ^8 f. u- y+ S7 q( _# m5 A
addr = base + cnt;
3 @; j) f/ G1 m( X5 f$ b* B
sync ();
# z" m+ f* e* G' k1 @$ V p1 w* M6 k B
*addr = save[--i];
8 u, R, \( u3 W$ J: T4 v' l
}
# t4 }6 x7 b) P1 \6 k0 `
return (0);
. x7 h$ X; t" o# H
}
! i7 \9 X' n% U
* h/ W7 ^' g$ v. b3 N# p) k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ R9 [# c& u2 a* R! M4 x. |
addr = base + cnt; /* pointer arith! */
* E# H4 S5 _" n' @! O" D- s) m& d
val = *addr;
4 |( J" D9 E9 W; c9 f; W
*addr = save[--i];
9 c5 K6 _6 U) _7 x. S
if (val != ~cnt) {
4 o6 j E* ]1 f% p
size = cnt * sizeof (long);
7 _- L% D; n1 c: ~
/* Restore the original data before leaving the function.
1 N& W4 e0 _. t; `9 V
*/
W2 P2 n1 h4 o9 c9 \3 w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 _2 S7 G5 A. v; l5 F# f
addr = base + cnt;
7 x" B# Y" \! }* c( N4 L0 V/ e' _
*addr = save[--i];
. o! u7 Q$ x3 F& A
}
& }7 N2 v }6 L8 [, Y1 M6 w
return (size);
1 H* z. h# g$ P" A! f' v/ E
}
3 H# w" o4 `! F2 H
}
6 A7 i7 r l h- P% q& y$ J# w0 ^
2 I8 m* D u6 D( V
return (maxsize);
9 m' j) s) I, h: P
}
# [* r: O' _- a) a3 c: \
int dram_init(void)
% `8 p& \* k: e9 o5 e2 C
{
, n& l% M Y- g& t3 ?
/* dram_init must store complete ramsize in gd->ram_size */
8 t# g4 A* A% c6 r, z
gd->ram_size = get_ram_size(
4 a _3 n$ b: v" b+ ? _
(void *)CONFIG_SYS_SDRAM_BASE,
2 L X8 O5 l4 R1 ~
CONFIG_MAX_RAM_BANK_SIZE);
+ p' v! z' q9 ?% B8 W7 W ^# \
return 0;
) K) U9 D. i9 k1 I
}
, D$ g% c1 ]0 r
0 T4 f( T; b$ G+ ~& g# z
9 Q, U4 q6 H: Y0 A$ J5 F
# [6 r0 k5 H. h: H
3 D3 I n3 J& ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. k; D$ ~; a$ i. ^
% ^ l/ f' Y; T8 a
% x6 C$ x1 ~' t) _+ G
4 R( `% ]* E0 B8 \( s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4