嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ X, j) H2 R2 C1 q' t: Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ N: a. z, s+ x* A! i# ~& T, B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 |4 `. f/ Z- M: [
& M# k7 g2 J3 T- L" z7 ~: x+ K+ Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% R/ ~6 }5 r& d" d) e. Y4 P7 X/ L+ p
+ G! C0 o) y7 @4 k# [
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 S0 q/ R: b# W$ X/ B8 C/ [
/*
* _- |" {. H$ ?6 [
* Check memory range for valid RAM. A simple memory test determines
) r; d$ J- u8 f$ L8 ^$ h
* the actually available RAM size between addresses `base' and
+ h, o8 G& u0 C/ W
* `base + maxsize'.
0 r+ E6 ^- p' y) V4 U
*/
4 h1 O7 B8 y& l- t0 e/ E
long get_ram_size(long *base, long maxsize)
6 `; H' @' u1 r( V2 z# j" z
{
0 e- c1 J# \! O% i
volatile long *addr;
# I0 {0 F/ B- f) E
long save[32];
* Q1 K' K8 t7 B& e B; Y+ N2 y i
long cnt;
8 }/ @5 {& |! y; H8 Y6 l2 L
long val;
% v" q" t. W+ t2 F6 L W! F
long size;
2 D }9 Y% j- W- w8 j4 P+ ^% c
int i = 0;
- @# j; ]1 y% p% H
j' L, i A, f/ N* c8 _: f8 N3 R
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* D' [" h. H9 N/ {- x
addr = base + cnt; /* pointer arith! */
( _ ]+ m2 m. X+ `
sync ();
% V9 B i: I5 ^+ q3 ]* ^+ G6 t
save[i++] = *addr;
' a' x1 W9 e& g5 ~) z' l- z+ z. t
sync ();
) E$ @/ b. K1 M# n7 `2 q4 e; _3 g7 S
*addr = ~cnt;
: d( C0 l, z2 _! \8 \, k
}
0 G1 N- Q# l' a0 b. b. z/ l
1 h- k+ P8 X s0 C4 A, }
addr = base;
- ]5 [+ g, T! t
sync ();
" H* z7 T# P* r: R& v
save
= *addr;
$ c, F+ Z9 I8 @5 i3 \% B8 r& n
sync ();
- ~# P0 h7 w, G# M2 `: a' M" o
*addr = 0;
8 h2 M& z- B6 x' i1 ?" o, d. M6 }! R
9 [' r p$ k& X; |9 B" L! ~: h
sync ();
9 J9 n4 R5 O6 p& U9 M2 J: V
if ((val = *addr) != 0) {
; K: k5 j* E' [0 I6 O
/* Restore the original data before leaving the function.
* |) n8 j( l+ E$ ~
*/
: }3 q# C' u3 \ Z* f8 A+ B6 _% l
sync ();
/ ^: f9 A# F& E# Z3 u$ W& n
*addr = save
;
# A* D9 d c8 m1 d% H( ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
@; G% i3 |1 b, q, i
addr = base + cnt;
) f' m m: z- H. S
sync ();
T u1 n# i5 E, J8 `) G6 a R
*addr = save[--i];
2 F' e" e5 c; I2 [" p5 z! S
}
# ~4 G, V1 E% o# O9 h
return (0);
( D5 M. m: k* W7 B
}
7 Z& } d8 g4 ~2 h
, ~# ^: x; X2 r8 |+ g8 S* o5 g
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 w( p# \0 G+ k- n
addr = base + cnt; /* pointer arith! */
2 E2 f5 z. A/ ?; L
val = *addr;
$ f7 `: n- ?/ F: Z1 ~
*addr = save[--i];
- w5 x. m+ h- e. _/ S
if (val != ~cnt) {
2 S6 {! p! O7 i" t7 H* J2 V
size = cnt * sizeof (long);
; [3 \9 k# T# `* }* l' L8 x3 V" p
/* Restore the original data before leaving the function.
- Y, [. J" {; O% h! x
*/
0 q5 M" Z( B" N
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& U& H; M7 e& P$ u- t
addr = base + cnt;
; U. {. U' T1 Y' J/ B9 s6 r
*addr = save[--i];
3 F' }- I& f0 Q% P' {
}
. \) I$ c/ \3 S I& e7 t
return (size);
4 W: M& E: p' O
}
, _( O5 c- G1 V7 `
}
/ `4 m0 }3 Y6 t# K8 K
) h" e5 I- E$ t& l
return (maxsize);
2 X1 r7 J$ W- | ^8 P5 [! [& r/ c
}
0 h6 y7 t0 G( D* k, O
int dram_init(void)
# z4 |. [! |' D" V+ Z+ n
{
I$ M& k' t/ Y/ {; X
/* dram_init must store complete ramsize in gd->ram_size */
6 a, u; m0 N- B" x
gd->ram_size = get_ram_size(
* o( G. X& M4 P- d& B i. v. `" B9 R
(void *)CONFIG_SYS_SDRAM_BASE,
) j) K" c% S } W8 F
CONFIG_MAX_RAM_BANK_SIZE);
9 [4 K# N) z8 V5 _/ w
return 0;
! k+ q! y D" Y# C2 U* J- y0 L3 B
}
& ]5 o( l" Y2 Y$ _6 k% ~6 b
5 g2 b# ^4 u4 }" V9 _
8 d, _1 W: [, [* c
- w. d9 M% f; r. F6 b
: ~& ~0 u" ^6 H1 H* K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 r: d5 r& e G2 u# Y
{; m1 R5 O; b, b
( N- J8 t9 b. S
) E& N7 V) ~$ q2 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4