嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- w# t1 W8 Z, l" \1 H6 U( x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
3 p- D* ?3 U, v0 K
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 P7 [2 E- G3 ]5 e+ p' s
+ e5 U6 x8 x2 t. a4 K
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 C, O5 u6 h$ F/ l' C5 Z
, J* H" \' B; A. A$ ~* w
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- M% j: N5 F: \6 z" H0 x% B
/*
' Y2 j3 q" b v/ Z g& s% M8 T
* Check memory range for valid RAM. A simple memory test determines
8 L1 ^: ?- w. R
* the actually available RAM size between addresses `base' and
$ r, Q* g) y1 N" b F# I( s, j
* `base + maxsize'.
1 v/ ^# N! R2 P* B1 l
*/
/ Z: L5 ]4 z9 I' H
long get_ram_size(long *base, long maxsize)
0 V1 S; y% s( F! |
{
+ D7 B h1 B" T: V0 O# \
volatile long *addr;
3 w; R0 U2 C# [
long save[32];
9 i% P; c% O, m
long cnt;
" f7 g, k d z1 i
long val;
& a) }6 \4 ~: t1 o
long size;
# r, H/ c* ?% B( I9 C
int i = 0;
5 T- z1 x. m" |. k _) A
- {- W9 x) c, T9 x% [3 F3 Q9 _! O
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 j! t& E! g3 ^
addr = base + cnt; /* pointer arith! */
- M! a5 G/ Y4 B1 j; r* r' _
sync ();
( g# n7 g7 q, u4 A9 U& s
save[i++] = *addr;
: L3 F% t! x# `7 j" O
sync ();
& ?( N! n T0 n
*addr = ~cnt;
* K- Q! @& m, R5 ?5 h% N1 J1 ~. e
}
, A! t4 X: [6 j, w$ l+ Q
7 V( \3 F7 i8 \4 ~, N% w
addr = base;
( x: i0 }: z) h) |
sync ();
. t+ c/ }; H2 z: \8 C
save
= *addr;
7 \, ]( Q: m8 j7 k3 w- Q7 a- y+ l
sync ();
* o1 h# m; c! r8 T L( X" ]( `
*addr = 0;
: S8 N* n, S6 K
6 G+ f( j2 `4 J" U6 @7 u$ Y( k
sync ();
2 l! [/ [# f: ^ H% `; ]
if ((val = *addr) != 0) {
! ]2 l* ~* [! E9 M
/* Restore the original data before leaving the function.
% b* o. K7 n6 d
*/
1 l+ |, z% S& w) @% [9 ?: h
sync ();
+ E8 y# C0 l p0 x6 @
*addr = save
;
4 v. d) D- A# m- }5 p( U$ S' {: |$ K
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: G( v4 P2 w5 V& {
addr = base + cnt;
6 p @+ Z5 l& N: ?1 V4 {
sync ();
5 V, e' H- d; u" {% u
*addr = save[--i];
. {2 ]5 v, G6 U2 k: b- M, ]
}
, t* O3 m. h. i7 ]4 b# c0 z
return (0);
, y' [* Y3 e5 M6 v% E2 R
}
+ N2 ^+ J) c, f) D; X
0 V$ Q) R- }. i: k
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: c; G, K6 m$ M- r; D4 Y% {' c
addr = base + cnt; /* pointer arith! */
4 f: [) F, M. ]# e+ d2 A k
val = *addr;
1 p5 m/ z d3 u1 O% m& l
*addr = save[--i];
( u! Y0 e H, ^( u: Y4 i7 A
if (val != ~cnt) {
( F6 b' `+ b. y" N
size = cnt * sizeof (long);
- k( l0 t; I5 b x) C a
/* Restore the original data before leaving the function.
+ V( q. P+ n" N, l* M! p, k
*/
% p. m+ t' J6 X. V$ ]3 \
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% L* W3 r, b3 Q U
addr = base + cnt;
5 z" }, `1 h! ^1 f. O) D
*addr = save[--i];
# i3 E% L8 ]: l; v- x
}
! M8 D' ~6 v+ q+ _6 x* R( a$ J# U
return (size);
S3 l3 |( |* B8 j
}
/ o1 i, [) e o1 D- o; X
}
, ?) }9 E( l9 _. n) C
+ K- ^. i; j+ I' m/ ~1 \3 ^6 \" o
return (maxsize);
5 p8 X7 R! q3 h
}
, M/ `# w/ H) O4 D4 y ~
int dram_init(void)
/ P4 f: y; N& t0 M+ m2 V$ q; G$ U
{
. Z) Z/ P* F7 J6 @3 }+ Z% J
/* dram_init must store complete ramsize in gd->ram_size */
* ^$ R2 k7 z" V" h% p1 U6 I
gd->ram_size = get_ram_size(
2 P$ m: |2 n% O6 r, d
(void *)CONFIG_SYS_SDRAM_BASE,
& H$ v5 P- j' M5 Y2 W' D4 n3 r) v
CONFIG_MAX_RAM_BANK_SIZE);
1 E6 F. ^: [# s$ X' D
return 0;
5 f% [7 `5 O6 T E5 K
}
3 l6 x0 O, n5 d; @" N, N& \
+ l J( e4 n2 k$ Z' ?% n
- B( t; \2 Y" p/ X2 ]" N* y: I
! u' b0 O1 N9 P+ K1 s& X
4 q9 @7 W" |& J: y5 W3 ^) D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; ~1 |: x2 U. }; h" v: D2 Z
8 D3 B% O+ X6 p8 A) w# ]* y
. r+ \) T: ]$ G9 y
R- p% l9 S; A: X1 B* Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4