嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; p( H# C3 V; l' p1 q$ @$ d
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 r5 w. @ l) }4 b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# a8 a, e! o5 E: Y! F
+ M( ? x: F+ u* H" J1 i# q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 e# V5 R! n- k) [) N! S) X
! R* b* ~4 f% B; h# O$ c3 e
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 R8 a# V+ H3 x& `& L
/*
$ f1 T+ X/ |' _- G0 g( }7 }2 u
* Check memory range for valid RAM. A simple memory test determines
- G* S. {7 B, A8 L* r
* the actually available RAM size between addresses `base' and
5 |1 A; q; Q9 ^% D
* `base + maxsize'.
* g6 J4 s6 i3 u( ?& T
*/
' ?0 ~# k w) r) Z2 m
long get_ram_size(long *base, long maxsize)
- x# ~# e& w. r. e+ r2 U3 m
{
- F1 x' p) h$ Y- L M) ~/ ]: m
volatile long *addr;
# c2 X! o% M# v
long save[32];
+ C; Y6 }( \+ }2 Q f
long cnt;
$ W6 Q; c' s) k( u# l
long val;
/ X3 M4 q+ U& j
long size;
. T O# K. a7 s; y% T9 s
int i = 0;
% A9 P; R7 W% ]3 y9 H8 u, W
( x- @2 ?0 Q9 p6 W9 [1 u. J
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ \% \- S- i! h8 k, i8 W, P4 }7 e
addr = base + cnt; /* pointer arith! */
1 H0 y: Y' _% ^
sync ();
/ P. h8 \4 q: f$ q# j2 _: |1 f. w
save[i++] = *addr;
6 E' S' ?+ S. i3 G. [* Q$ ]8 @& T
sync ();
0 d R2 S& I: G
*addr = ~cnt;
( F: s: J3 h6 y( y1 W
}
% T' f" O) ]8 ?6 A R
& q0 B B9 r+ o: f: v p
addr = base;
( t0 P% r& v" y5 p
sync ();
+ c* \7 T# \" {% M9 j
save
= *addr;
9 ~9 h, C# J+ R$ P2 K! ^
sync ();
4 c8 S7 l# E5 Q0 t5 }
*addr = 0;
8 _, z2 [" ]4 a, Z( w! @8 F
- H& Y s" N- @& S
sync ();
R" ^6 ]/ E- M* K W
if ((val = *addr) != 0) {
: F$ w$ L [* J; M
/* Restore the original data before leaving the function.
& z7 Y) z9 k4 b* o0 c
*/
2 u! q) N- P6 G, `' _
sync ();
. ?1 A* l# Z/ ~) ?( O2 |7 G% g
*addr = save
;
4 j) u' {% I( p$ b$ L
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
~( Q9 w+ F' ?5 ~# L$ \: O7 m
addr = base + cnt;
; P7 u8 I/ I. H8 e% L
sync ();
* a5 X/ y' ^# Y4 v
*addr = save[--i];
9 V$ U7 [+ j( S3 w
}
7 t7 k. t- J) G1 s6 F: h2 s( ~. \
return (0);
5 U3 j& L% ~' q) F2 X
}
$ Q0 i" K' t& t8 b! b" D, i
" `: D1 P P& V- U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. n/ c6 d! @+ n- t/ }+ I) Z! q
addr = base + cnt; /* pointer arith! */
0 K3 {9 m7 u. B
val = *addr;
; Y1 ~3 d1 p4 z6 U8 ~
*addr = save[--i];
. \9 ?6 K9 b; o1 R
if (val != ~cnt) {
8 v. o+ t4 `& ?& C, ^( z
size = cnt * sizeof (long);
% x8 H5 |5 R" }- P
/* Restore the original data before leaving the function.
2 t5 r: o0 r; i9 z4 r
*/
* d& G4 ^# l$ Y$ n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* z" @, S! k. S. t
addr = base + cnt;
- @- n1 p" L7 V$ u# [
*addr = save[--i];
. Q7 L# C# G$ W+ e) ]" Y& a
}
1 U- P8 O; X/ M2 k+ w& o- G) o
return (size);
( s, W, m/ ]9 P! q0 Q4 `& t6 p
}
$ x! T1 I$ u& O5 _, x- D3 y
}
$ ~, n [' s4 f9 h6 t7 r9 Y* u% W
* m+ H7 A+ _& H% C' Z
return (maxsize);
* z! H2 j. J' B& b% K5 W8 a/ ^
}
% d. A G% E' u8 v
int dram_init(void)
0 G- N% `8 R3 Y u' {, r. \' T
{
1 W/ S( ]' g2 O. I- R
/* dram_init must store complete ramsize in gd->ram_size */
& }8 X5 Y$ f- @( f! B4 t
gd->ram_size = get_ram_size(
) p: O0 c& E5 U( p
(void *)CONFIG_SYS_SDRAM_BASE,
6 x- T7 v* r6 |
CONFIG_MAX_RAM_BANK_SIZE);
& _; u8 |% r+ K1 F$ ?" {
return 0;
, R" c) v: B; \" r. `
}
3 C6 o. P! \# r5 N- w9 v" Q% \
: s3 \2 Y9 p- m. T& Q
$ O# J; ?6 L+ P$ A
! G$ z0 Z; _, \2 B
7 ]1 t* |) G9 f; D. Y3 w0 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 t0 H h/ K, X1 y F, s+ ~
n# X# n& v, G) f0 p
) p# m& I3 g# s, a! | u3 `! U. P8 E# l
) k+ ^# W+ W1 ^9 j" l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4