嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- j. T/ l' i0 `4 g# h
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ `. S1 O( Z$ ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" s2 _7 w) M( O4 ]
8 I5 [- Q9 w& X$ ^# L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& u; D; G9 Z7 `3 {
0 G4 f4 V8 h( l+ d; Q$ T! l
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 C) U- A: T& H+ g
/*
3 j; k, \7 ?9 ]0 V; N
* Check memory range for valid RAM. A simple memory test determines
6 @) m" h2 p+ V
* the actually available RAM size between addresses `base' and
, b* G3 M5 H/ k8 {" c( U" C; O
* `base + maxsize'.
/ i1 W5 x+ V" i9 {% f
*/
: N( `8 t9 R; C- h% f; \! ~$ _6 n
long get_ram_size(long *base, long maxsize)
9 p1 p5 V; ~. K0 t7 j7 R# S' U
{
) E; P7 @8 t; J1 S$ B; C o7 F# _8 K
volatile long *addr;
! h- ?( q w5 A8 o" J Z
long save[32];
! i/ K( m& L2 I3 A
long cnt;
7 w; a3 w9 @7 F" x, ]. q
long val;
- \" {0 b* u' [' b, J% ^
long size;
: E0 H; P8 @7 m3 A/ c
int i = 0;
% i. g: L# w7 Q; b
+ ~1 u. a" E7 _9 h
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) J& G3 ?2 e( @
addr = base + cnt; /* pointer arith! */
3 S2 }$ o8 K! O# U5 }7 s) @
sync ();
1 A9 G v# m. _. \! q
save[i++] = *addr;
5 x7 u, d3 k m+ Q% _
sync ();
& D5 B$ j5 E6 ^# M) n* h
*addr = ~cnt;
- f! B9 R1 ^# ?# j
}
( C7 B5 s, B; ~1 a) ^1 W$ W% @
( t$ E8 M: X7 |
addr = base;
3 J, D- X6 _- M( o; B# \
sync ();
9 i/ F* ^' F3 g+ B
save
= *addr;
! [8 H! D# d+ V! }
sync ();
, n* I U0 F9 P2 E- a( Q* h
*addr = 0;
1 J( q$ t/ G5 p7 h6 R
* M9 e( x3 b. H. K' S, g
sync ();
1 K% B" h- T- A \# K8 W$ X" v
if ((val = *addr) != 0) {
! `* e. e9 O5 e- J
/* Restore the original data before leaving the function.
. j6 L8 q, H& X$ }5 s* Q1 d6 Y, i
*/
" F# G8 ]$ J& G9 o+ a2 B* i
sync ();
+ O3 A, O E6 m* n% Y P
*addr = save
;
`, i+ P6 b- n+ t( `5 b& B' ]
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
?% e, ]8 a5 {
addr = base + cnt;
9 O6 e3 N7 m/ t
sync ();
' ~1 [) G+ ^: r& I
*addr = save[--i];
1 P( T* T# x& ?+ W
}
2 N6 I" N4 u1 v0 D, A# D. ~" [
return (0);
5 x9 ] _! ]4 N6 c Y
}
# N. k3 [* R7 J& ^3 [
/ u. q' i( L, H# B+ Q( W, @% U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" N9 @4 P5 g; y% d' _; N, A' u
addr = base + cnt; /* pointer arith! */
0 k- \9 e( B% b6 N
val = *addr;
; j: I6 v; \" J0 `
*addr = save[--i];
! _8 V8 R# g, d5 Z9 m, ]
if (val != ~cnt) {
+ Z2 G+ o% C3 @3 e3 s% v. i- z
size = cnt * sizeof (long);
& \) X c- n2 v
/* Restore the original data before leaving the function.
! g! w3 I) R! U& a/ c0 \
*/
% a0 k3 G: L8 D9 Q6 ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
B$ L4 _/ F' B1 J! [
addr = base + cnt;
$ @7 R! o$ T' t1 e) `
*addr = save[--i];
7 p1 h; Y) `: S8 x" f( q' r
}
* f+ F% j' h$ E0 P# `0 t
return (size);
' }& E. S& W- z
}
, W2 q& w7 r$ g$ |+ U/ h* K
}
# P X. n# ?) J" e. \8 ]
4 R! K6 H; J( }$ {
return (maxsize);
6 z) A0 H1 G" Q. n- O
}
3 u" z w" i0 ~( X1 \* ~
int dram_init(void)
5 {2 a) _1 W7 J# Z3 [
{
( a0 a: `$ f# }( [& x% q) l3 N
/* dram_init must store complete ramsize in gd->ram_size */
, x$ y* Y6 n4 ]& |: Y8 i
gd->ram_size = get_ram_size(
9 i+ I. x: T$ O9 ^/ g
(void *)CONFIG_SYS_SDRAM_BASE,
. @) g* \' J$ j4 Z$ F8 e" E
CONFIG_MAX_RAM_BANK_SIZE);
3 r; d6 s7 l4 |. ^+ @' ?
return 0;
' \6 j9 {2 I' c2 o+ x( g2 q
}
+ v9 X1 r$ _& E4 W- h6 L5 i
* ~4 T1 P+ L, G
' j, u3 C, @2 c6 E6 x. m# C/ [ }
$ h& [- R, c# i
9 Q. d( @3 I- Q T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 v j8 w: p0 i, \9 }2 \, {2 B
* ]3 T: }3 v2 Y; K; A, D
' `* b; [0 [; }+ l" a9 U7 k
% p* s8 _7 k5 r+ N9 A. U
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4