嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* K& p7 V+ t/ w+ q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 X P/ h) ], E! k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; X7 c9 l+ C6 q- \" d
2 m4 Z7 U# y6 v6 g* l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( L+ w( @2 d" g, G4 ^* j) ~
9 F. {5 d% o5 _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) R) }9 I# b3 O& R7 J
/*
" I! g' A$ @* Q! ?* w& s
* Check memory range for valid RAM. A simple memory test determines
- m R( R2 Y* b9 N& w2 ?
* the actually available RAM size between addresses `base' and
% G7 M! }) K8 U9 H
* `base + maxsize'.
! V) _ Z9 W7 L0 P: T, J
*/
: E5 Y. i) l; l6 ?# ~8 _4 ?2 }
long get_ram_size(long *base, long maxsize)
% a" O4 G( u% | k4 B! u
{
0 g: M, d3 e6 J8 T7 l0 r
volatile long *addr;
( ~+ b7 F" O9 W! _+ L& r
long save[32];
0 a2 o% v: |5 P, H
long cnt;
- N8 K& b: X" H# e. `
long val;
+ d# c/ N. K6 j* A5 f
long size;
* D' |! y5 K- a& g6 ~; z: G
int i = 0;
5 q c3 |) {) |; l) g
* d' N' ?! j# H8 J O' G- S' _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& s; s- k0 N A8 m0 n; O' w4 |
addr = base + cnt; /* pointer arith! */
/ M G; P# e6 B0 a* G4 H* |
sync ();
3 H; B, o) I$ ^' k5 G
save[i++] = *addr;
! [; a- y8 e7 V2 v. \3 `) I+ E
sync ();
, a( w2 e" l# b9 j4 ^) n
*addr = ~cnt;
+ W8 J/ P8 t6 r/ u; O; {0 U9 i
}
, l8 Y' \0 j N( F- f9 q
) t9 u8 b* E- w; |. _- \3 k; }
addr = base;
) Y8 Z8 B7 R* Q* }
sync ();
, q3 q" ~. E4 U8 l$ D1 |) z
save
= *addr;
, I8 W2 `5 F/ [
sync ();
5 }" i. }- t, j) p
*addr = 0;
L1 `( n+ O& N" e: ?6 a
B: c# [/ Q9 ?
sync ();
. R1 r/ ~ \# L' u. h
if ((val = *addr) != 0) {
1 O. a L& A b, s# W
/* Restore the original data before leaving the function.
! p3 ]7 [3 ? k2 j: F
*/
! l6 Z! \# ]& u/ h, E* }
sync ();
, l {* K& o! Z2 S& u2 O5 j- p
*addr = save
;
9 M6 _) E$ ~0 P5 b+ V3 r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% o) O5 ^$ Y, P3 q
addr = base + cnt;
( r/ E; ?8 s; W q' q2 [
sync ();
9 T0 c4 `5 p: S9 ], s- Y1 a
*addr = save[--i];
4 W* v! h" Y% X8 ~& G- g4 X
}
}' v. Y2 k: d3 S3 a
return (0);
% J8 q& H X7 e
}
9 @, J' G- E6 N% H( v
4 t% d) m$ P9 ~! E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" f6 ]5 n& g# u% E8 G3 `& z
addr = base + cnt; /* pointer arith! */
. ?0 G, X1 l/ X3 Q
val = *addr;
! d' p# y. |7 z* q- N
*addr = save[--i];
& j4 v* E% U A* |5 p+ V; k/ ?" }
if (val != ~cnt) {
/ a( O1 f x. P/ @! L1 h2 J! c7 O0 W
size = cnt * sizeof (long);
/ U, ~2 a* I& w) W9 u2 V1 C, J
/* Restore the original data before leaving the function.
* N: i$ z% B" j" h( y! Q
*/
* [1 n( k; e- N/ b* Q( P
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 V* c/ V$ |, X% l
addr = base + cnt;
, t* a+ I: w( o U/ B& J+ m
*addr = save[--i];
. ~( J2 a2 S, q
}
! Y; B2 Y5 m* E0 b K
return (size);
/ z8 Z+ ~( Q2 |( L" {, l4 ]
}
) [6 c; U1 v" Y. ]' C6 L
}
_/ ]' c, B- ?8 ^5 X6 r. p
0 i6 o/ p; i$ C
return (maxsize);
. L! E c% s9 [
}
" J5 w* f! p" r' V1 m D4 ]. L- B
int dram_init(void)
! ~/ x, s- I' r. Y1 g
{
* k. Q# ~) v1 F9 ~* a( \
/* dram_init must store complete ramsize in gd->ram_size */
! ^& w4 z m" T& i9 K* ~
gd->ram_size = get_ram_size(
; \+ f/ [* }1 E* ^5 l9 ?) a
(void *)CONFIG_SYS_SDRAM_BASE,
# g7 T& }1 S4 m `
CONFIG_MAX_RAM_BANK_SIZE);
( {- I& |( w/ g% |$ v1 C
return 0;
( e2 Z( _4 c0 R5 Q( l& A0 j& V- N$ D
}
. C6 b; j* r6 u4 U3 P
# O, c5 @5 l! v+ Q: i d! \
% ]* t) ^6 m& H' v. f
' I$ {" O n; R3 m' a, }6 [
% i" l* h, ?9 s: T) f8 [ S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% \. q) B" V- Q0 g! U1 Q
( }8 d/ M. b! r0 W4 l& {6 v3 }
1 R' u+ _& z! w& ^# w
: B5 U& l4 C0 _. J% m5 [( _/ f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4