嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 z- B! h+ G( Z- ^' n9 h. \3 d _; U
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ f2 Z( v f4 R2 ]$ J$ u. j. e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) D% g( D& ^. D# R! k$ t7 r
9 ^0 p2 _* ^( G# E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* M0 |2 B1 }' H, e: _
7 `: T6 F, ?& [6 S& q: `' {8 K* K: H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 d# M- }# a# V* g9 ?. [: `; A
/*
7 Y! Y% w. x5 t6 N# O
* Check memory range for valid RAM. A simple memory test determines
$ J6 X. {, P( M/ ^1 x M3 w
* the actually available RAM size between addresses `base' and
5 |! Y D, x. Z0 @4 }5 ?
* `base + maxsize'.
( b* F4 F! ~4 E6 i0 o6 D
*/
3 F% z5 n: b8 d- c6 Y/ h
long get_ram_size(long *base, long maxsize)
?7 w6 b. v3 P- v0 B* @
{
2 Q3 B* R, k2 Z4 G; U+ \3 E
volatile long *addr;
9 }3 J( V* t, t
long save[32];
+ ]5 E' V( C; N" s9 m! C
long cnt;
W+ S# J% D# B5 _8 G7 ^
long val;
! C/ I) N0 }# P- j C9 O }
long size;
9 i2 q# p% p6 D) O2 ^0 g
int i = 0;
3 f: z; x. ? s# u& {6 S) b
# W2 C& h- {% H/ o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( q! _3 j& ?, ^' @+ q
addr = base + cnt; /* pointer arith! */
4 Q3 F" Q. ^' W; [3 s! K( T
sync ();
# x9 B4 w& k/ I k" c5 L1 K1 i; F
save[i++] = *addr;
$ v, i3 @# j: A2 x) |& k! w& ]
sync ();
, }) ~/ T- ]5 O
*addr = ~cnt;
$ U2 D v E7 L1 p s; m i
}
D% i" Q! L3 p# g7 t
" W0 L* A# v: i
addr = base;
% N% }9 U8 F; x8 ?" y
sync ();
! e8 M1 r$ i& L6 G
save
= *addr;
6 o9 W6 Z1 P- y
sync ();
. d; a- p3 X+ |
*addr = 0;
! [7 E+ x8 [$ N) p$ V4 J
+ F W G8 Z3 E1 C" h. }
sync ();
* y# ]5 q% ]( p% L0 t
if ((val = *addr) != 0) {
. H2 X$ Z/ \8 f+ _" b9 t! P
/* Restore the original data before leaving the function.
1 l( U: q! s! t2 n
*/
, S: f& P# z# j0 V3 o3 @% U
sync ();
9 z+ l3 E9 n* }; @4 S# }+ H" [1 e6 h
*addr = save
;
: L1 u' I8 P+ ?( P0 P* ?& c8 k4 T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; s( I* S) h- P
addr = base + cnt;
& ~7 L$ R9 D5 h" N; v; \3 k
sync ();
3 A6 I% }0 y% m7 z
*addr = save[--i];
0 G3 `- L# u- P- Z
}
) T0 `) n) K% R/ F
return (0);
6 n5 `" O8 f8 f5 l: r7 r
}
& B! ~' p( \+ c: U6 L# T `
" _; `! _* O) {. I1 z) E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ {( H9 o2 [2 n( @3 p
addr = base + cnt; /* pointer arith! */
0 O# G' g/ m B% n
val = *addr;
' k+ u" i% I5 ?
*addr = save[--i];
" ~4 l3 @" v$ a1 h
if (val != ~cnt) {
/ e7 p$ T' C2 x" N4 k7 a9 i& O
size = cnt * sizeof (long);
0 M% f- K' P* Z3 I& k) I7 d4 |9 n1 z
/* Restore the original data before leaving the function.
* r2 X5 Y8 B- I$ g5 p# C
*/
- @2 v- r" ], U+ W9 y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: R" S. P$ `" M+ y6 o+ e1 a& {
addr = base + cnt;
/ H/ n) n8 y/ ~% a+ \
*addr = save[--i];
+ B' {0 j: [' D. a ]9 t1 z
}
& x& d" }3 N/ T' W; L: z* z+ w
return (size);
% c: g K+ B- m9 Y# e, j3 ?
}
2 w+ R+ A; w1 w, {* p: D1 Z' s; [
}
' x' F+ Q6 H1 z9 R4 o. |
4 i6 J: p Z8 G" G2 H2 @
return (maxsize);
! c6 r8 X) q9 \" m5 Z! ]( |( O7 a9 @
}
0 j6 z8 E; a$ O( a! a/ B
int dram_init(void)
; u3 a- s. d; x2 i$ e Q/ r
{
6 x! H/ Y+ E( C5 V* p5 \% w; o8 o
/* dram_init must store complete ramsize in gd->ram_size */
# U. J8 e2 t$ C8 ]# R9 u
gd->ram_size = get_ram_size(
`1 U0 v6 H% d5 ]) p. u! F6 B e- z
(void *)CONFIG_SYS_SDRAM_BASE,
9 D3 ]( q ^, V$ B
CONFIG_MAX_RAM_BANK_SIZE);
$ f* p- i( b# O
return 0;
# w# j! U/ w1 r: G2 O' W$ h) _
}
S" @! V( h' }3 \ Z. }
4 y8 p z0 H7 ?( g+ {' X- T: C* i
0 M$ J' {: [, c- I- s( s5 s
# K. N% x3 E" v# H2 Q( x
5 _( V6 i0 ~, `, ]# w6 J6 Z+ ^9 ?$ X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! E$ [9 B% N$ ?+ D4 ^$ J3 ^6 d5 o
% [) @7 Z) H3 _" ^ }& j: ^
$ ^* n& m8 }( h2 {+ ~6 K
; o u0 W! k4 L( g5 u* o0 [
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4