嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 \/ g1 s; f0 L3 r# d
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 J0 W" ]0 l1 Z- ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 E: o/ a) T/ e/ `3 h
5 D! d8 \) \- V6 ]! t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# P9 t4 m/ X9 ?: O
2 P1 L, v) f4 i3 t. O, d+ B/ h: i
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ G) G/ u$ X% G4 b5 X
/*
5 j6 k! s2 t' u8 |8 T1 O3 ]
* Check memory range for valid RAM. A simple memory test determines
P+ ?% N" i) K* |, L2 H5 }
* the actually available RAM size between addresses `base' and
: p! i5 _* j- ~7 ^6 }6 y
* `base + maxsize'.
# K1 S$ m" B6 o
*/
0 b4 u0 o+ K7 x1 I' S& A5 ^! I
long get_ram_size(long *base, long maxsize)
7 q* D9 V) t3 F* ~& E6 G3 P# a
{
) t0 K& }& N8 [( f3 I$ y2 I
volatile long *addr;
$ K/ m' }3 u) K b7 s# D% Q. e/ |- {
long save[32];
Q3 ?( ^; @ q* a; P* F
long cnt;
( C# k2 {5 U* W% y- y h# }
long val;
2 N: k! R; u: ^/ K' m# f7 v2 v
long size;
+ n0 P0 Z" Z# ]9 Y# a) E# E$ o" ]
int i = 0;
* u0 ?9 Y; n5 S$ f/ M. ~" f! {
; v( ^$ L6 V- t6 F2 W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ R' {8 z3 A' t2 H C0 f* z
addr = base + cnt; /* pointer arith! */
) N" Q* s g2 C( P2 z2 p' E7 M
sync ();
. \ e7 o( N; ?: I( y0 O
save[i++] = *addr;
! h# [' {7 p1 Y: B
sync ();
+ [- J+ ^7 y2 |( t+ [0 |
*addr = ~cnt;
' C: C2 C# H9 r2 V8 p
}
4 O6 {0 l p4 j. e
0 W d6 E1 a. l$ z5 B0 I$ J; D
addr = base;
7 i% Q$ }" P. i/ q* n1 w) M
sync ();
8 a) i e. p5 g# [3 `* q& R
save
= *addr;
) s: {+ m, X* z% `% c
sync ();
0 p) J4 F# _" C& y0 m
*addr = 0;
0 p% X+ o& Z$ [ \. I8 B# r0 d
) i) O2 s2 [) Y; S7 F
sync ();
J9 q6 E3 N! ~2 e+ Z! [
if ((val = *addr) != 0) {
# N4 b1 `4 V/ C9 c# U( @
/* Restore the original data before leaving the function.
8 \# Z, ?" E; I$ v2 O
*/
9 {+ b1 Z- m2 k2 E6 v1 n# ]
sync ();
8 X/ M; w2 u9 `& g6 i
*addr = save
;
% i$ R/ g5 Y% C. s: M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# o/ f3 b' V. _% h( t) }2 q5 ~
addr = base + cnt;
5 l! e8 O F L0 b S$ D" g
sync ();
5 S; z6 j* z$ O' Z f9 P2 r
*addr = save[--i];
o! ~ x3 A5 j/ M. ?2 u0 \
}
+ m$ G9 m! K* ?; t% D+ s
return (0);
8 C i6 ]$ g" J4 T" Y2 T9 g
}
& E/ A, w' ?2 r H3 \
) l) c& e0 D& z8 d# J, e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 X9 D2 T; R1 ^4 e% z0 f- U5 |! e
addr = base + cnt; /* pointer arith! */
# z2 Z5 d8 A2 g- a
val = *addr;
! r4 q2 \0 J" l1 g" P
*addr = save[--i];
" v! R2 w! i! X: X6 A
if (val != ~cnt) {
D$ ~+ E3 q1 H* J" `
size = cnt * sizeof (long);
0 ]2 O! g" _% ]) Z! g7 C& x3 @% c
/* Restore the original data before leaving the function.
+ G& |' K. q f+ ~0 v. B: W% [) G
*/
# [5 Y% y% L. B/ [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ e. e* A( k% |3 f1 {+ n5 N9 w, ?
addr = base + cnt;
" D& [3 u2 y; s {0 U
*addr = save[--i];
) R0 F1 ]+ A: _" E2 ~) d: X* t
}
9 R; \( P( h3 u* W9 O0 F
return (size);
+ {1 g0 H! }" `' P) C
}
# ~7 k1 W2 z8 ~) U5 N' l2 I
}
% H* \, U0 o# d- D+ }9 s4 Q
$ z/ C) _: [+ H8 a: ~( I7 |
return (maxsize);
- @+ i% H; t5 G' F& a% i
}
- Y! z$ Y* Y; P2 j0 c2 ]0 |7 D
int dram_init(void)
- m" l: Q* P: |! z% j9 l e2 L
{
. m* T! W% v+ \" E& i
/* dram_init must store complete ramsize in gd->ram_size */
5 a! j7 n) e/ D+ J& R5 {* e
gd->ram_size = get_ram_size(
* ~7 X1 \, f& x
(void *)CONFIG_SYS_SDRAM_BASE,
& F8 B r# N, P
CONFIG_MAX_RAM_BANK_SIZE);
* }; E/ v/ {; h5 x. ?; F
return 0;
2 @ F4 B! J; D
}
! l _! g" P8 h4 J
4 B% |& M2 r5 O
$ ?3 \1 s+ v. b2 j! X; F- S
% {4 S8 L2 G3 T" B0 _* a
% Z) b6 t7 }7 D9 z* a2 q* U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 e* {0 j; m, W0 R* ~
1 A/ _( J" g- g7 _' f
- ^! \5 C, B6 X9 @
2 @' o9 Z/ I, X9 V8 @. Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4