嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ l7 s" H9 M9 w# }& c
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 F/ n) c0 O; o' {8 a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; p# L# _: g) Q; r* C
( W2 L9 f. W9 ^3 Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 I+ V% ~2 i% `7 Q
! V5 a* Q8 f3 b# e. N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
G( j* P, B& O. Y& d) H
/*
$ r* f" v7 a+ c. w9 S( n2 e
* Check memory range for valid RAM. A simple memory test determines
" C6 q4 F5 d0 u; x2 H" q& ^% p
* the actually available RAM size between addresses `base' and
% D% Y' v2 u( {7 t( J4 X; n
* `base + maxsize'.
3 i2 e/ S% q& k0 v% [ Y, U
*/
6 b6 T( ]* y7 K: N
long get_ram_size(long *base, long maxsize)
; M) J! \& w# J6 @" l1 b, g: E
{
7 _! v4 i' R& W7 k* n6 w
volatile long *addr;
9 M8 d/ q* z# F, g2 n! o$ B
long save[32];
# O2 a7 |. g. q% m! Q
long cnt;
+ K: W* `% P0 g3 x* ~$ L2 Z* B
long val;
( y, P ]7 M' y5 O$ M
long size;
0 e- b+ b1 C3 B0 X
int i = 0;
0 X: S& |# f1 Q3 a7 {
/ S/ ?. [( I0 {7 \& d5 S
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ i" H! P" |5 x3 m5 G
addr = base + cnt; /* pointer arith! */
+ [0 Q/ ]6 m3 z$ j
sync ();
+ C7 `/ N, U- X
save[i++] = *addr;
& z5 J5 z" J, ~* L+ _6 N0 ~; g
sync ();
# Q3 K) k9 }2 f% W
*addr = ~cnt;
" k6 p; ~% g' n
}
! ]9 L& `6 t3 Z* [; @
8 F! C$ [; a0 w0 U1 v4 s5 Q8 z
addr = base;
5 X0 X/ L6 o. Z0 [9 r8 S
sync ();
" u5 P! S9 z6 _$ J
save
= *addr;
$ c$ |' g! O0 C g4 O& y5 H
sync ();
4 y; K: f2 p* |* j% \ N/ ]
*addr = 0;
9 c/ U% h" S$ |$ @ {3 k
( q9 T3 ]6 r4 H9 V& F
sync ();
+ y9 D) R7 R, F' v
if ((val = *addr) != 0) {
+ s# V: C, ^; P% {+ P" u
/* Restore the original data before leaving the function.
Y! Z" s* Z) ?! M
*/
1 U) b3 J) |, _" s0 s
sync ();
" p; x5 D& I/ n) O8 S
*addr = save
;
8 ~$ e# H6 P. Z; U# p- w3 _! x) e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ G' `6 f) f2 p2 l! H; x# _% @
addr = base + cnt;
& _: p7 R8 Y, J% m
sync ();
! N. s) ? V z+ N1 g' N5 h" j
*addr = save[--i];
" K1 G4 `# h- }8 D7 q' _
}
9 {' I% u' u9 G! V
return (0);
- B, p+ O2 T& G, |9 G. c
}
5 v, U1 _) n1 F+ s) O; `$ X7 s+ X! J
, [1 ~- _ w, b& i/ Z# G0 l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 s2 I2 i w( m% k. K1 K
addr = base + cnt; /* pointer arith! */
1 ~' z3 d1 k! S, i! d& K
val = *addr;
4 ~( _4 U! t$ T- S" F
*addr = save[--i];
) f, {9 \' D7 X/ x
if (val != ~cnt) {
5 U ~) F2 j: d C8 J+ B {9 G' q2 v
size = cnt * sizeof (long);
$ \$ y, m8 p- R$ W5 e0 H* H
/* Restore the original data before leaving the function.
1 ?3 Z. e" l/ k, S& ^4 H, q& w
*/
/ [+ C% N0 x$ O+ s
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 a; A7 m$ i2 ^* W6 P7 C' x
addr = base + cnt;
4 w: M b9 H4 c
*addr = save[--i];
2 b8 s$ V l0 Z" `, R* m1 Q- v
}
2 W$ p7 \ |( m9 j) z
return (size);
- b. ~3 u, ^, U4 t' u2 R
}
) n' k; H5 t1 I- m$ ^( u7 P8 L
}
: i7 x L" P, F! z! C) }
0 H7 `" i5 i |- [: L0 p9 w
return (maxsize);
6 T: ]9 ?5 x7 K9 ?7 k
}
0 x m$ y1 G/ r. L) P( \6 B
int dram_init(void)
8 z: Z' s: l/ [* q
{
" ]7 j% A8 A6 s: H, s O
/* dram_init must store complete ramsize in gd->ram_size */
7 G# p, {/ g: n2 l' f
gd->ram_size = get_ram_size(
7 O+ z8 p* S6 J5 C' o
(void *)CONFIG_SYS_SDRAM_BASE,
% u+ G1 I% F& ^, H: @/ C2 h
CONFIG_MAX_RAM_BANK_SIZE);
8 W+ j' W$ M; U# v. W8 Q% ?; F
return 0;
# J7 |) b- G; E3 W$ ^
}
% i% f1 P& R, f+ z% \0 v
/ y+ Z; Y& G. S$ q, L
" z& \- c' y, ^' a M3 ~" m
2 q# w$ A" z i) U
3 _" l' o! k) ]; L/ t0 i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; T, X2 V3 r6 }' z; _
: c& j8 c; N' B. L2 |2 h
; R, v0 D( n" Q* r
0 l' o2 ]0 Z9 E2 `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4