嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 ~2 I0 h* H% w/ g' I' F. q4 e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 t4 V7 N3 Z* `" A" H8 R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 s' I# Z/ m2 t; b! z' B A
% E9 G/ J" v1 `4 o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; R( f5 ?7 X3 L. g
F" r7 W% ] j/ _: ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; p) r3 B3 ?$ v# V+ H- B0 u J. K y
/*
; @2 {. @( K3 g) w+ S& V
* Check memory range for valid RAM. A simple memory test determines
& ^. x; a3 k, @: D( j- G
* the actually available RAM size between addresses `base' and
) E+ ?5 P2 P4 d! a1 k
* `base + maxsize'.
( o6 I* [4 s+ @4 T
*/
) z4 I* f* ^/ X& J
long get_ram_size(long *base, long maxsize)
. ?; ~3 s) R4 }. I0 D; `9 [
{
% p6 P* p8 ]' K( k
volatile long *addr;
2 `5 c4 T1 l0 l1 H; ^! I
long save[32];
' @% j4 L8 N+ V% Y. c
long cnt;
" g' k" z4 x3 N1 X5 {
long val;
" L; I# @1 e. i' X- h" s
long size;
1 B+ B* b$ s3 h9 ~. t& |- V, m
int i = 0;
! r0 m. U9 s2 d( n" m" o# O1 T& F
8 u4 k7 t3 G* C( N, u( G1 S
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 X( b7 s* b. g2 i
addr = base + cnt; /* pointer arith! */
' G3 ]8 N; q+ v0 @% {& s
sync ();
/ h- P! Z$ L2 o# V
save[i++] = *addr;
4 k1 t- f) }- O1 t" ^' T3 [/ P
sync ();
. k! F" U$ F7 {
*addr = ~cnt;
9 l. H$ ~. L1 T" ^) }8 C
}
$ p/ c/ J2 L" R" e
9 x# `! o7 ^4 c5 ]5 W
addr = base;
3 L& W. ?5 x% p
sync ();
: q' K, F8 x5 E: I( V4 A# c: x4 P
save
= *addr;
. W' w$ x a1 @6 P3 F$ P3 z
sync ();
K& O9 c7 K. G: h8 ]
*addr = 0;
2 k: R- Q* C6 ]1 |, {1 e
, b- @& v" R$ c
sync ();
: K, Y6 L" f- R* o0 e
if ((val = *addr) != 0) {
5 V1 \( {& }: z
/* Restore the original data before leaving the function.
) b9 x* n L; D. m4 T# `. E) ]
*/
+ U( q& O; A* F2 X6 [0 U9 s: u/ k ~
sync ();
0 g3 B/ b0 R+ J4 D) R& U
*addr = save
;
, a+ F8 y9 q8 B" V: m/ q8 b* ? z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, `4 t Y- z' m7 a; a% r# K, R0 M
addr = base + cnt;
8 |% \4 z# a' W4 V
sync ();
8 E% X: x1 I5 `2 C. n* X
*addr = save[--i];
7 C2 p& l) ~/ e9 x
}
* ?0 N$ y+ l2 \# b
return (0);
1 \$ \+ m) Y# ^6 L0 Y; V0 @0 e+ c5 y8 H
}
% l3 @5 U" u5 u& {
0 l+ |' z2 E* R7 O, \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 I( m, m. J) R$ o* @6 ^
addr = base + cnt; /* pointer arith! */
$ C* c& h" U8 k1 s( ~
val = *addr;
' [7 X1 u' [, Q5 F6 y/ P0 @8 i0 j
*addr = save[--i];
9 r9 W7 h0 z( w6 T) g
if (val != ~cnt) {
# L% g5 F+ E& m
size = cnt * sizeof (long);
: X6 Z4 ^, N7 W. I) w6 v
/* Restore the original data before leaving the function.
/ E6 I* x: C% ?: K8 w
*/
$ x: z5 R: l* [5 t4 `
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( b6 o4 N; E8 U( F) m* X
addr = base + cnt;
* k, y3 p4 p7 G# ^/ }- H4 o$ s2 i
*addr = save[--i];
5 O8 p( s8 u$ ]
}
0 V$ D; ]3 k9 }+ u4 n0 ?6 |
return (size);
4 P2 _$ Y, Q+ G' R* }
}
; @% C5 v2 F1 ?. Q4 f; L5 D; ?2 Y$ d3 X
}
0 g0 S! H+ L& ?8 ~1 x7 n% O, C
5 N/ e4 D8 d/ [& o2 ~& H. `+ @4 a0 F3 E0 O
return (maxsize);
7 B( k: s* t7 Q7 t& U
}
2 x3 k! y4 z6 @7 j' c! ^
int dram_init(void)
" I) E9 \, U5 d8 M: ?1 }# h' e
{
8 X6 Q' U3 y7 X2 r
/* dram_init must store complete ramsize in gd->ram_size */
H ^: l8 H+ N
gd->ram_size = get_ram_size(
# S F8 p2 ]0 }9 c
(void *)CONFIG_SYS_SDRAM_BASE,
2 m0 P: X0 o- C N/ C
CONFIG_MAX_RAM_BANK_SIZE);
6 U& V; H' G/ v
return 0;
& p$ L! J R# G
}
* `9 b0 S1 z/ N; P! X9 ]) Z+ S
4 \# p$ ^5 J0 Q: h
[! ?5 l8 e( ^$ p" ~, w9 h2 h
) b3 u2 v* `5 c8 `6 t7 h# ~
- W8 }5 B2 T( R } z2 `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 T( v( C( D$ r' P, U- h
" {2 @6 L! f& o# X% S# K
0 Q- m+ G" k3 i* m- K2 f
4 ^1 ?# _) Y0 n( E! b( E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4