嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ s& C0 u9 _" ~0 X% N6 S( |; L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
c/ o5 t& C. L! T8 S) k, y' T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& _7 q& `, c! k2 j# x) g9 N
4 M# k" l7 R4 N* T- C& } f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 x0 p8 N5 c: Y/ C- l* Z
' _9 t$ U$ I' l0 z o5 D: X) F
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' ^$ b( P: g# |( U- \: p+ P& Z( G
/*
) ]6 T/ H. o4 [
* Check memory range for valid RAM. A simple memory test determines
6 k& p" @$ p, {2 [2 S: B
* the actually available RAM size between addresses `base' and
. _0 e9 }& p' L# q' H) g0 P
* `base + maxsize'.
* ~/ t' ?- ^6 y( ^$ f' G% l
*/
: \9 e8 k: J/ E- I! F
long get_ram_size(long *base, long maxsize)
! f) t3 g, h/ z( S, B
{
% k R; N+ k. E1 B5 E; \$ V: x9 k) V
volatile long *addr;
6 [* F1 p! K* w3 q8 t2 d# U
long save[32];
1 Z8 d" m; w+ e6 q- b
long cnt;
5 ^) x' V, T; m7 b8 H
long val;
/ @( Z3 z7 x5 Z
long size;
( J9 t# k X) c! m
int i = 0;
4 q& P& {3 x) `: Z# E4 x. A6 W
3 G/ W4 W4 z8 i' n8 g/ y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) ?9 J) d; O, p/ T0 `
addr = base + cnt; /* pointer arith! */
( Q1 g6 |) f! {! p
sync ();
5 A$ E+ ]# Z* Y5 F. @
save[i++] = *addr;
' m% e4 M% Z) e& A" C+ Z
sync ();
# g7 ?/ ~' ^ i
*addr = ~cnt;
/ K- U1 F3 E% }
}
* m1 y D3 |/ Q' T" t, w
Q( s+ V$ Y# R7 l7 X7 Y9 e* ^
addr = base;
! h' i( Q2 B% U% U7 _) a
sync ();
2 i+ {' m& `: o: v) q% s3 P: x3 N
save
= *addr;
+ {( \: Z/ W# e
sync ();
4 i* M; j( Q" W; N
*addr = 0;
* r3 q3 s# h7 N d5 s2 `
6 @- Y" d( @3 y4 Q. B% G
sync ();
9 p1 z, ]4 x, G
if ((val = *addr) != 0) {
. A6 H% x3 Z# a0 ~, \ N3 X
/* Restore the original data before leaving the function.
5 T% h r4 w; ^+ E( |% O
*/
+ v4 G: U* }9 c; p9 i" u
sync ();
' W/ M% O. |- K- J& u
*addr = save
;
0 W: r! t. k, I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 @2 q8 y6 V, y7 ^
addr = base + cnt;
6 |& B) |( s& I3 F0 J6 a. y
sync ();
) b9 G" ]4 }; r6 j+ q5 C
*addr = save[--i];
4 u2 m2 Q( N$ r& v3 ^+ z
}
7 }: N' R4 a5 ^1 h4 l+ A
return (0);
/ U {* D+ ^( }' e
}
: e1 f9 O& @, w9 H, {6 D
5 J- Z/ n5 v7 c5 r# l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 f e+ ?# a1 W$ ~
addr = base + cnt; /* pointer arith! */
2 j5 o5 B% L, f+ x) C0 F+ v" w
val = *addr;
3 I3 u6 F& T N7 Q8 ~; N
*addr = save[--i];
+ V4 M+ G3 R' G( H' O3 j
if (val != ~cnt) {
2 l: u( x6 q' V$ _3 h
size = cnt * sizeof (long);
- l9 R) \" l: y) t
/* Restore the original data before leaving the function.
2 ^0 c$ `# @2 \0 O) _* u: p- k( k
*/
" x* \$ o- T! l3 ~! ^ y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 O. C. h+ e, x# C) \$ y2 L& M
addr = base + cnt;
2 A' o9 n! n( V4 x8 t0 K+ E7 V
*addr = save[--i];
/ j4 T1 k5 ^6 C9 x3 H# b7 Z, H
}
+ z0 u9 a7 p. f" ]
return (size);
! J: k8 w# D! \7 F8 T6 m
}
2 o3 R [" I: x" V- P% W
}
- c! L8 i g% [3 y
- w1 _) J; b& E" g& W5 Q
return (maxsize);
. v4 k6 e5 ?6 B0 Y
}
% x3 h: u4 j7 P9 n
int dram_init(void)
$ Z9 w$ w) Q7 `1 h% m( X3 P8 s
{
) P1 z$ A; ]0 F
/* dram_init must store complete ramsize in gd->ram_size */
9 s7 `! L" i [
gd->ram_size = get_ram_size(
3 h1 q0 J2 v( U/ I3 j6 z3 X
(void *)CONFIG_SYS_SDRAM_BASE,
4 n6 Z/ o9 y3 @; z
CONFIG_MAX_RAM_BANK_SIZE);
: A; Y m2 T. Z- E- \0 N
return 0;
: V: G+ r) H5 b5 O! k
}
4 L) Z/ b( M4 ]# |
* D& E# }. _5 j0 X0 }
* k; ]0 r& G5 Y, Q. _* }
" ?. I( r# z% |! A5 M: S5 X
$ a: w& w [3 C" m& y5 Y5 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ N$ e1 S8 W* y8 ?8 A( ~
8 U7 A, A) m; _
- M+ K' J' b* n+ d' T8 n6 s' q
% p" Y3 S) p# P/ h3 J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4