嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; l! r/ A& p" P% F, D- v: t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ D; A' R- Z; f1 M/ m* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ H' S9 h( ?7 r4 P8 @
" B `+ j3 Z2 u% z: G( |* Q6 T
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; c0 K/ R% R1 ]+ X4 _+ R# k
6 L4 J1 |5 ~8 `5 l! R7 _0 S0 o. D
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 [6 i( v' i( k! \# k
/*
/ b& S/ w! L" l8 z! t; n* a
* Check memory range for valid RAM. A simple memory test determines
. ~$ N; g4 _1 t! G( n; r
* the actually available RAM size between addresses `base' and
6 k2 O: K0 z6 @& r
* `base + maxsize'.
4 G3 E4 p9 x8 _: o
*/
7 ?( s' U3 p1 U( G9 Z! B4 h6 X
long get_ram_size(long *base, long maxsize)
, A8 M- x; E$ I1 w v C
{
' g1 ^* i' S5 i! h: l4 f
volatile long *addr;
6 f' W8 N' h$ T B& g0 F* f) B Q
long save[32];
, G$ E% q6 T! R$ C& @+ u) l
long cnt;
; H, J) X5 A6 T
long val;
$ S, m, h. F; t8 _& q5 K
long size;
( c: e8 v% M6 s, x
int i = 0;
) ?4 U5 d- s' k0 n
3 E" z* E6 L$ |+ @$ M# Z+ |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. K2 k4 t9 [8 r* \+ c# s# o9 b
addr = base + cnt; /* pointer arith! */
$ d$ |& X& g. H2 X6 C
sync ();
- F0 A; u: o' V5 R
save[i++] = *addr;
! w" B, x; p( i# M p3 v6 m: a, p9 T
sync ();
' f9 W: @- B' F7 t8 }6 z
*addr = ~cnt;
7 F) y G V! ~; G+ o
}
/ W% j* V: k# g
" L: q! N, n1 D8 U
addr = base;
4 P4 @0 U, g9 m) C. ^
sync ();
3 x. z: x* i9 p# A( |
save
= *addr;
, ~' @: V' k& [4 S V+ p# q. G7 \
sync ();
5 p! l# N" S6 R
*addr = 0;
P8 @! N7 ?6 C! C! t7 }1 I
0 I; C* i. @) ~3 c2 [
sync ();
9 |# q1 ^# c& P- j& d/ T) ^$ e: \
if ((val = *addr) != 0) {
5 [& ^4 E6 k) u6 P% `% X$ C- E
/* Restore the original data before leaving the function.
, E2 l. Y! w% h5 x& P# w6 B
*/
( S- p2 }" P6 ~ @$ x* G
sync ();
3 H. `. [& h/ A, [$ @& A' z# z
*addr = save
;
+ B9 ]; P! }, N; r" D6 V1 ]1 M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 N, C* u; m4 Z, D- o6 v2 A
addr = base + cnt;
, F4 ]6 r& }$ t; ^ t
sync ();
" x0 B5 h& O6 ?+ n. K
*addr = save[--i];
$ s- G- s! G0 M0 _
}
! Z! e9 Z6 t, k3 Y4 _
return (0);
; d; q& p; E( l$ J3 F+ X# B7 I
}
, I5 C" j X9 U. B) b% P
8 a X! S9 S$ w* K
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 C, c0 H$ m; C% @% F
addr = base + cnt; /* pointer arith! */
8 a- ~. U9 J& [. n! }- I/ D
val = *addr;
+ F2 R0 J* w2 |: k& S( H/ b) k/ F
*addr = save[--i];
f8 ^. \& V; c% P' V9 T
if (val != ~cnt) {
1 U/ D7 B! J# I2 r$ Z
size = cnt * sizeof (long);
9 K" B# c2 k! H% F/ q4 H3 `/ | r
/* Restore the original data before leaving the function.
, b; R# w1 U1 h0 ?/ T
*/
3 g. c) g x6 O$ ~0 e. v0 h1 _ a
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 L* ^! ?# X2 u ^2 Q( Q* U
addr = base + cnt;
* B+ m$ g$ G* a& o3 s ?
*addr = save[--i];
: @* _& ?# W% H8 m
}
3 g8 ?* j2 T; ]/ I: o3 ~
return (size);
! {! Z* h/ c! A( F
}
/ |! K/ z) d8 \- S, s0 n6 F
}
' t3 @7 ^1 g2 }4 r9 D" Q3 F+ ?
- ~& S7 R* M6 n. A
return (maxsize);
' I0 J4 v) m) C& c& J
}
7 y* h! D/ ?1 A: [; k8 _
int dram_init(void)
: n! H2 H/ }# Z/ {% C
{
% G6 l1 ~& Z" l) @6 F
/* dram_init must store complete ramsize in gd->ram_size */
) @, ?/ h, \+ E& m/ Y3 S& }
gd->ram_size = get_ram_size(
8 U4 ~ v7 N6 p+ N8 O
(void *)CONFIG_SYS_SDRAM_BASE,
& ]% ~5 L) J% Y- G
CONFIG_MAX_RAM_BANK_SIZE);
$ ~; [% H/ f$ d7 m3 e
return 0;
8 d+ b+ F' N. E+ V! k+ `
}
8 e4 S% ^: H/ f% u6 b: P ~
8 T8 l: l# A3 k# j
( q& w" m5 D; V
5 O! V5 ^: r0 W0 |
5 _0 L% j$ b3 B' B+ P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% u/ O. s- m" y# ?. @& w7 t- {
: M& n- z9 u: d, c; y
9 l* O! w6 r/ v
4 o/ Y: ]7 E7 @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4