嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
, e4 }4 K! e& f \7 }
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 ?! y4 q; R8 z* y) U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 R9 q- t9 Y5 d0 c5 u# \
& n6 I1 h# t) _, p$ R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# Q0 _+ Z% ^ v$ n& X+ ]& ?
$ n# u1 [+ q/ ]* w, z9 ?0 _
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ c0 i4 U. o1 S, o* p
/*
: k/ y* o# T' z4 ]; Z8 h
* Check memory range for valid RAM. A simple memory test determines
0 T& t! |- d# u) W, h9 E) s+ E
* the actually available RAM size between addresses `base' and
$ y |" A9 V8 d0 o! o# d& Q( N
* `base + maxsize'.
4 i. A2 s! W9 R$ u) X$ o
*/
% p0 O! I* V7 e1 a0 u+ Q% c* C
long get_ram_size(long *base, long maxsize)
$ D# w: I6 f7 n4 p* j
{
5 u4 d) ?6 I2 x1 S# D
volatile long *addr;
! i( E/ o( p( f7 @3 v+ r
long save[32];
9 k, W1 N7 h, ^- }, j
long cnt;
9 {$ V' u! \5 d3 r5 ^$ V; L, ~
long val;
}; N) T1 ~& \. v" J6 [
long size;
8 p. B! U' ]! s& o) [) J ~% c5 s
int i = 0;
/ n) p$ n: @9 D) n4 G; m# X
5 p: _' K$ o) Z% [: s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; P: t. u- v" q# I5 ?
addr = base + cnt; /* pointer arith! */
# j" R& F) x4 p# G e% P
sync ();
$ q: a- y. R* s, k& [3 c2 b
save[i++] = *addr;
8 w! P# v: _ s* B* t
sync ();
: m9 L0 C6 x; u- H* o& n2 L
*addr = ~cnt;
- ~( I; N! I) j
}
/ k( L4 B7 u$ W
7 B j* e. A5 _. P! }+ U
addr = base;
) V T1 f1 u, \0 T8 Q1 [4 n- s
sync ();
+ K" | n& ~$ L5 t
save
= *addr;
# T9 p& H1 |) D) W3 S
sync ();
; _; |* F; g& y% G- c* T
*addr = 0;
- v/ \& j6 p: K$ Z
1 ^1 }4 A6 x! f' H" s% K5 t
sync ();
2 G' j' k2 k- ? r# u
if ((val = *addr) != 0) {
. M5 I! ], |' }- I! c* _, b6 O
/* Restore the original data before leaving the function.
6 Q% @* {4 K' F( J+ B; h+ ~
*/
: s1 l/ i2 {& e# s" a
sync ();
* |, b q9 L. f0 V1 m# a
*addr = save
;
! O) l- M Q9 ^( ^/ ~
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# V) t E q! y& r7 m' S
addr = base + cnt;
9 t/ o& D8 x; x% Z5 W7 @
sync ();
( l7 A1 I0 |% Z6 q- S o' S* D
*addr = save[--i];
# x( H2 \3 a s- { t# L+ O
}
/ @7 v- C( q4 J3 H; \, g. c
return (0);
1 J5 v: V5 G& {; }; f% Z& Y; @
}
+ m/ r2 a2 h7 d$ x0 M
1 F) L; h/ h. V* k j, `4 `9 e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h+ ?/ y! b5 [5 D
addr = base + cnt; /* pointer arith! */
0 v8 `$ [: _) h( V
val = *addr;
9 L9 ~- j) }9 c) @
*addr = save[--i];
. R6 j0 C0 R3 F, V
if (val != ~cnt) {
/ q4 f: a' I" k& o
size = cnt * sizeof (long);
, O5 w. h$ T) W
/* Restore the original data before leaving the function.
4 x2 C/ P# P) c' t. B
*/
# R' z( i8 v. h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 F$ q. f" n4 Y3 M; u% f- C8 O* L' m2 h
addr = base + cnt;
: o/ j* L$ L6 l+ n
*addr = save[--i];
( X3 C/ [9 ^* a+ a
}
; ^1 J7 Q3 r E. C( u, ~- W* x3 q
return (size);
: V6 `- {- e2 D3 H4 |& Q
}
5 e3 R* U7 h1 @2 q
}
4 ]$ {" f* v4 ~) m9 f$ a
8 ?/ w* N, w% O$ t7 h; r' T; `
return (maxsize);
( e5 O7 \+ W$ H+ ^1 |* \
}
& s# D" H( d" d
int dram_init(void)
8 S$ T. r) ?8 C/ Q+ h. l
{
" Y+ n9 g8 B4 l
/* dram_init must store complete ramsize in gd->ram_size */
1 _ k/ y1 S, k3 }6 u0 @* K
gd->ram_size = get_ram_size(
- Y. c* r# `! |" Y, k' H' B3 I
(void *)CONFIG_SYS_SDRAM_BASE,
; v0 D3 |* W7 l2 D2 U8 o! L) m8 {
CONFIG_MAX_RAM_BANK_SIZE);
! E+ K. X' w: M6 y
return 0;
. x1 P5 u) F% Q0 ]0 V4 e+ ?) f
}
( f$ B# r, P% m1 H
% k% N" E0 K. k' R3 K) `
: U! H( a4 e# ^: O* L
, j4 U: F% \6 m. P/ P' u! V
/ D3 O( x9 A+ l7 U# l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. X; Q! j' W7 @5 n7 [& P" W" y" C
' i6 u& A( G( c4 ?
" c) j c8 u& ]( c0 {
( E& o x& X/ V+ a. O
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4