嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
3 z6 H( W' ]- A @1 @$ R) W' B
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( k: C5 h! s# E( q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- o2 h$ | {! Q/ E6 c. n
; K" Z' s' G5 O! `# {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. i" ~7 N; R( O
& Y! i2 H1 @: s5 e6 q; @- }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% n# ?' i! s6 d4 c R
/*
# ^$ ?+ O2 C# y$ |& f X
* Check memory range for valid RAM. A simple memory test determines
+ T/ @* `4 ~5 _6 n* a2 T
* the actually available RAM size between addresses `base' and
/ r7 g2 H: P/ E& |
* `base + maxsize'.
& P7 [. k5 q" J j
*/
5 D n' I% k) @7 q
long get_ram_size(long *base, long maxsize)
) R/ Q, d O* s% J# Z- h
{
3 j+ A! ~ z8 Q X
volatile long *addr;
: J# l$ k2 v) [! ~4 g
long save[32];
5 q$ W" u4 U1 s( e
long cnt;
* h+ O2 v$ u: t( x! q) w: b
long val;
4 Y0 S& i T8 B% u& X0 P
long size;
5 C+ L) ^5 a" w0 |
int i = 0;
- `3 x8 I# M6 A2 W. O# U
- s6 E6 ?7 _" u3 Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ F( m. `8 t$ o. `9 ]8 j
addr = base + cnt; /* pointer arith! */
B3 _2 w' Y$ A4 c
sync ();
+ G/ W2 M. O, H l! X: M
save[i++] = *addr;
' e2 b. T. }. W. s+ X9 C& x1 V
sync ();
# X9 q! W- ?3 \+ S9 {% T/ h) _8 ~& y
*addr = ~cnt;
. Z3 e9 P* ]! b% W
}
$ X; v# [7 n' S: V- p) M' H
9 j: i# y5 B( N* P
addr = base;
8 v; h) w l7 t" W; K7 E, w9 g
sync ();
9 b. e l5 {8 c# T1 Z. @
save
= *addr;
3 e# _. V, m8 ]0 H; w
sync ();
/ J2 W2 \1 |; l7 c1 U
*addr = 0;
( N' o7 O8 e$ X7 e/ d+ y
F0 ]% @+ R4 R) @. {! c
sync ();
- t' f- _6 ~; o# t: m6 [ b
if ((val = *addr) != 0) {
! ^5 h0 L. k! J9 Z, _8 Z
/* Restore the original data before leaving the function.
7 N# u" p- F5 J
*/
; X0 ]& C9 `8 I4 i) f
sync ();
) U5 i/ ~) [2 T' n
*addr = save
;
[. T% g0 Y5 C: F* R4 t4 L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ g9 |8 S4 z1 D7 @
addr = base + cnt;
3 ^. k! O) X* u+ N: Q$ _
sync ();
4 Z3 t- y' x, J% z) d
*addr = save[--i];
- S( v. g: V- j
}
, p9 `7 ~) Y2 _) d
return (0);
# i7 v; \1 I. K8 M# i. g
}
0 m# \) u% P$ [! ~; [
; R" [( M- q5 C/ M7 z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# a2 B3 A3 H) k7 R
addr = base + cnt; /* pointer arith! */
: l3 N7 v- C( Q) J$ E
val = *addr;
5 P a6 \" R+ {5 x' c# N$ g
*addr = save[--i];
8 z3 g4 i$ f, m/ ?; p' N7 {
if (val != ~cnt) {
7 z3 o+ R2 n3 y& U/ ^( U# T( \! f
size = cnt * sizeof (long);
5 g/ I" p: e# Z0 D
/* Restore the original data before leaving the function.
5 ~6 W; P3 k( Y8 \
*/
6 k* g- k1 m) J2 w9 e c
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ c* k5 z w9 z8 t0 v1 O6 ~: b( d# H) I
addr = base + cnt;
5 T ]# {* D' X( w$ b/ D
*addr = save[--i];
) V' C" U2 W# e
}
% O4 R+ R T+ p# e; d
return (size);
( c4 } h E" S9 U5 M; D3 W, i
}
- `9 l6 ]3 L* N9 j
}
" [4 [+ }9 B! v; t. M [
; J L' j( F9 I( t
return (maxsize);
$ ^4 e1 @6 b( L5 |; J5 h
}
& r4 b3 N) X4 I* H0 b B+ {2 [
int dram_init(void)
. q G, {9 c1 `7 c1 \% _
{
9 T; c) C% i: S
/* dram_init must store complete ramsize in gd->ram_size */
' t7 }5 R+ d+ V- r
gd->ram_size = get_ram_size(
; b5 C, y2 q: W% u5 {% }7 j
(void *)CONFIG_SYS_SDRAM_BASE,
; k" t8 F8 p2 `4 S( b6 E8 u
CONFIG_MAX_RAM_BANK_SIZE);
' v! l: t' {1 y* b; `3 w- w
return 0;
0 T/ O F6 U k+ n9 ~: I
}
2 S5 X% J j; e' l% [5 g, y1 z* N
- w9 {. L# x. ~% {3 y
2 d% k0 {+ o6 {( B U `
% K$ b9 v4 q+ p6 k' U# @, E
, S' ]9 M9 c/ p! ?( E& n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. c8 O" l& v; r$ j. v- B
+ R+ {9 ?4 p2 E' e, b
! n- P2 O5 {4 q8 F6 B. S8 }9 E
" y n3 C- f0 Q2 b& f8 b: Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4