嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; L u: j6 E A/ E T( I. o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
- U3 W* O1 V+ z* ? X1 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 _6 r$ G+ J- V3 u0 _: S6 i- J; l
! i" O: C% f9 F' \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 q- U7 K, c) Q. M$ r* N
* t# F N! W% G* Z7 B
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- F) h" i: R, Q/ H! ~" L5 `
/*
7 @2 M5 U. T' I; ]# _ Y
* Check memory range for valid RAM. A simple memory test determines
0 V: v8 K$ q, z) r) t- ^. O
* the actually available RAM size between addresses `base' and
' f' ^, O: b# d; b7 d" o' x. o
* `base + maxsize'.
% {" }! N" N% ?! i
*/
" \4 V- Q! B( M2 u! _8 ^
long get_ram_size(long *base, long maxsize)
3 {+ @+ a: C5 K. g
{
5 L' N0 y M) F4 t- }
volatile long *addr;
; c0 R/ Y8 s# m3 O5 i
long save[32];
$ l5 x4 ]3 g$ r2 i; @2 G
long cnt;
. L' @+ G4 @- }& _
long val;
P' V B$ }2 R9 b2 X
long size;
+ v6 m+ Q" n, N* V6 Y0 x
int i = 0;
# N( s6 R B3 k/ n
$ h1 u. Q! F% h3 E, S& W6 D
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! U( s! B. ?1 h+ r8 r5 E- [+ F
addr = base + cnt; /* pointer arith! */
" T5 |: C; d/ [# N8 k! a
sync ();
/ P: ~3 M2 ^1 [/ N- N
save[i++] = *addr;
! U6 B3 N# V) \% d+ {! G' Y7 H
sync ();
1 w" t! L1 M; t5 A, R
*addr = ~cnt;
- s+ N8 h) O$ N3 [, \
}
; S3 [8 L/ ?; O
' v5 r. `+ S$ P, P' u& V: U, j( u
addr = base;
% P0 r' V. P& o
sync ();
5 C" e# S# u- x
save
= *addr;
# W3 \8 T/ z: ]$ P+ y8 w7 F3 T
sync ();
. g* i) [( R5 W& J. { l
*addr = 0;
4 z( @; C; j& o# j4 p
, Q. |9 w5 P1 j! |' @3 @
sync ();
- u/ c, a6 r8 n6 o
if ((val = *addr) != 0) {
$ W) h4 {& ]5 d% ]! F
/* Restore the original data before leaving the function.
3 I: l' R }+ M, q
*/
Q b# O2 D/ C0 m5 Z! S
sync ();
, ?4 l9 I3 w# W
*addr = save
;
4 h2 y, }# I2 w8 P* [7 `- l8 y
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% h; O4 n) {9 n9 F& q* `
addr = base + cnt;
@' }* B0 r" u. a; v+ r7 C
sync ();
9 p) w* x& C& X7 O0 T _
*addr = save[--i];
2 }2 \% F( |& c! D% {. J
}
/ |; X" d# H+ Z! P: E. [; l
return (0);
5 d* J. P. o; t5 d6 k; O5 G. f U7 w
}
) u7 Y# u1 N' H0 l/ V. n
( G+ G; c: {/ q$ H2 V! H
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* b; H- X# q: b+ u4 p2 i
addr = base + cnt; /* pointer arith! */
1 _: O* C' Z8 l* `- p N4 L
val = *addr;
$ T- Y$ B+ }' X6 o2 [7 R6 N2 }5 T
*addr = save[--i];
' b1 m% x: y! [1 Q+ C
if (val != ~cnt) {
" @2 Z+ G, X0 V e, M" _
size = cnt * sizeof (long);
6 E! q8 w0 Y! K0 M$ v
/* Restore the original data before leaving the function.
3 {3 }, o; P5 E4 X
*/
W) t1 _5 ?' ? X' r6 l$ ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 s$ _ m. k) w) J- _1 Z; _5 I
addr = base + cnt;
1 Z9 j4 D5 e- B% ]# X: K
*addr = save[--i];
& ]+ M0 v, C7 w0 ~- U
}
% X* Z+ J5 H, k. l
return (size);
, J5 y; I7 m, o
}
# E# ? x# d" E4 `8 j
}
8 L* n8 f3 P, a$ |" Z6 `
0 _+ ~; |) e3 _6 A
return (maxsize);
2 o- O+ X* H& A
}
7 O/ n; U* A) L+ K4 X6 s
int dram_init(void)
5 q: d: K+ g& A8 M2 I( J- F; c+ X
{
7 ?( s& k! m* s+ h
/* dram_init must store complete ramsize in gd->ram_size */
) `) M+ \" P# t6 E$ ]& |" Y- c5 Q# g
gd->ram_size = get_ram_size(
& o) E4 _0 @9 `9 K7 j- G
(void *)CONFIG_SYS_SDRAM_BASE,
- d, D+ l/ |9 @) Y i x
CONFIG_MAX_RAM_BANK_SIZE);
9 b8 Q/ q: Q: P) B1 e" A8 f3 {
return 0;
) u8 U; f$ {, |/ i. x
}
l. S; j( O4 }6 J" j. H
( Q( R# R x& i6 m3 x+ B. l
$ u, H9 Z) T* K1 K0 u4 H: Q
) R: D' b F! n! p7 m; c5 B7 v
/ G6 u1 a; r: m0 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ a: V9 P6 Y* Y4 V0 |& @# O( I2 `! Q
+ `/ [# z8 A. C5 z* M2 p
8 J/ Q6 r7 W7 K; ^
( O) o" P2 E3 n, e/ C V" Q/ S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4