嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 s% y8 k2 ?( t$ B$ q% E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& m) J, M4 W! F. F, m R7 n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 v/ Y/ G. x1 z& W( [
3 T6 B$ O0 A* R8 F, {$ d+ w+ E. @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' R9 m' z7 Z3 I+ i8 @* |
# P1 I3 ?: n: h+ O$ \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ T& O+ T1 F0 ^3 L
/*
4 |3 F O2 D5 ]' r& t7 B( w
* Check memory range for valid RAM. A simple memory test determines
5 `, x" b, L7 [
* the actually available RAM size between addresses `base' and
* _7 u5 a$ ]7 v1 d1 _# C/ F
* `base + maxsize'.
. F2 \8 ^! `# Z) q; X# G
*/
2 L+ T( V" m$ t: K
long get_ram_size(long *base, long maxsize)
. m/ U; ^# e: `
{
1 Y# Z% S+ N. _" B) S, m0 O) j" m, t
volatile long *addr;
7 K/ W) X- k5 q2 ~9 W( o7 M
long save[32];
" ]9 }' g& @$ ]
long cnt;
; o3 z1 J, k* `% I1 D/ u
long val;
q0 w! w2 J- w# R8 _
long size;
+ W1 {! [/ c# h; n0 L
int i = 0;
8 _& L; Y" c. D. C
: J0 T- o1 V2 S7 k
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% }. q/ C" c% }, t$ {+ w
addr = base + cnt; /* pointer arith! */
/ j$ b3 _* H. K8 o/ U8 y
sync ();
. P4 b( m6 _# X2 s
save[i++] = *addr;
; x/ ]1 _/ Q5 |, d: x4 B6 Z, g
sync ();
+ }7 U$ B4 R0 e: c" K9 \
*addr = ~cnt;
/ R& \- ~/ O- r! g% h
}
7 b2 E& s8 H* z1 Z
W0 [0 G+ m. Z( i" R2 L6 U
addr = base;
# l9 s' g- e3 ]4 B3 o# T A
sync ();
8 x/ M H) Z$ j
save
= *addr;
0 g! M/ ]5 E6 y6 ] u
sync ();
& J5 a+ Y. v& V0 N
*addr = 0;
4 i, M0 Z/ t" S5 Q
% _0 t- E8 P+ d L6 d& s5 H3 |: a1 }
sync ();
/ a" V! Z( C' d7 h9 c5 M3 N
if ((val = *addr) != 0) {
' N Q$ J$ V% ?, I5 ~6 ~/ }& F
/* Restore the original data before leaving the function.
) h" j% \' S \) _
*/
& p4 b$ a) O% R, V# w
sync ();
- g5 }/ @2 g' o3 q1 u& \
*addr = save
;
# U9 N3 G3 G7 w- m
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ g- @8 s3 N, B$ U* T/ F
addr = base + cnt;
: \; f% c3 v/ Y5 u: g' K
sync ();
1 D) Y0 L1 Q: o
*addr = save[--i];
" }% W3 {% b1 H2 @
}
9 `+ ^$ M' ~9 ~6 V
return (0);
9 j4 k/ ?' Z" C9 u9 a
}
+ ^ ?* t2 B8 h9 F
: z2 [$ l8 x5 x- G* [8 _1 p1 A% s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' v/ N# q4 E3 s; k
addr = base + cnt; /* pointer arith! */
* R8 T4 c2 H* |8 U0 E
val = *addr;
: H' H: h: r+ x/ @. y2 C7 O1 O: D
*addr = save[--i];
9 W5 z2 _0 k t5 Z/ O
if (val != ~cnt) {
# K, X' C& a# ]
size = cnt * sizeof (long);
1 z- M6 @, u' \% @1 e8 h4 j
/* Restore the original data before leaving the function.
& h# Q* a/ F$ M) j
*/
6 I+ E( R4 A, S! W4 ?$ a, G9 W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( w0 q8 o$ H" d/ C9 X3 ?% J7 h
addr = base + cnt;
4 W1 Z8 a& D( C& b. J
*addr = save[--i];
& n2 E6 r, }" R! `2 z7 Q6 H$ R
}
5 g# ?- E5 E; R3 R5 G
return (size);
. E0 ~* A0 e' Z0 S. v
}
( V: H( _ o, J
}
8 _' Z$ Z( R. Z* T/ ?8 d& S: Y- \
0 g+ n, B* h! z4 m
return (maxsize);
f; ^; c; L) U& R
}
: O% F7 O& J8 o# V
int dram_init(void)
% f2 j4 W4 \! _/ t9 R
{
) c/ _6 Q z/ C5 n
/* dram_init must store complete ramsize in gd->ram_size */
9 [$ o+ f. u, Q' p3 k' l; @) E$ C
gd->ram_size = get_ram_size(
8 x: _# D3 A* u2 |) G2 r) X
(void *)CONFIG_SYS_SDRAM_BASE,
6 C! a( N5 N% j' V E$ @
CONFIG_MAX_RAM_BANK_SIZE);
0 w! z; C. A5 |5 ]
return 0;
9 s6 m& N2 C4 X9 j6 X% a2 ]8 N
}
3 @* m/ k; W: i2 @$ W
/ n% \) O p, m( M3 j0 m0 X# C. x
! y4 f! G6 [- k$ @9 r! v
: T6 u: ], ~. `- I
: O) f+ n1 N' h+ x. k9 X( z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: v4 ]; [4 k8 }" `& x
2 ~5 s+ D) s6 _! @
0 Q$ K/ w( K* `8 G" V1 s
. R4 E3 O+ U) F b/ j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4