嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 y$ x4 b7 v% L+ N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 i% c U# @+ n& \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 o" K( w- n2 g
- b! V* W/ S* ] i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 h6 y7 D; d, C' A6 L. p: o
/ t& U" K/ }5 w9 ^6 K
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& T) O3 C2 |; }
/*
& T/ x9 z$ ], l* e. B* C0 c5 C
* Check memory range for valid RAM. A simple memory test determines
1 L$ j) Q, r; j
* the actually available RAM size between addresses `base' and
% l! H! W7 q7 U3 {7 u+ Y% ^% q& U8 H
* `base + maxsize'.
5 T$ W6 g# r6 |
*/
8 \4 H/ s% q4 X/ x7 g4 D0 M
long get_ram_size(long *base, long maxsize)
1 `' h2 B9 [8 ]
{
' D- D/ y7 `3 k6 l2 ^' Q# B
volatile long *addr;
4 k2 P; w& y9 i
long save[32];
5 ^4 d1 }% ]0 O' }" G
long cnt;
* o. u) S* |/ Q$ c& \
long val;
" Z6 P' N8 b: E2 w4 V8 E
long size;
. k- A6 s$ I9 X y
int i = 0;
! B5 }8 n1 Z0 N- w
) l- p( `# ^$ P: Y+ {
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! T% e1 H) Q6 }8 b1 w
addr = base + cnt; /* pointer arith! */
5 F1 q8 N3 B7 p7 Q4 a; G0 c" U; B
sync ();
7 b; B* r% A- @6 l
save[i++] = *addr;
2 F6 u+ F5 {) ^0 N
sync ();
, s7 _/ c! F/ q
*addr = ~cnt;
/ |' c; ^0 Z9 N% {
}
& `6 ^- R: ^% L! H' f
2 u2 b( E2 e0 W. _9 b& h# _
addr = base;
8 Y! C* N8 @$ y
sync ();
$ X+ ?; h6 p$ \2 ?% I
save
= *addr;
, n0 C, t5 h" u" H0 M/ ]2 X
sync ();
( a* S! Q5 b' ~+ c D# E X
*addr = 0;
- U0 W/ O2 \5 [& z2 T! ?& `
7 d. D5 f) ^# ?- F* I
sync ();
$ n8 J. ~! w+ ~0 x2 K8 |9 H7 W
if ((val = *addr) != 0) {
e+ G6 A# t7 ]
/* Restore the original data before leaving the function.
/ [. o9 e, P. W% p( `2 f
*/
8 M. b+ D4 c6 O; u. W
sync ();
0 P N. p/ O/ R& ~+ J
*addr = save
;
3 `: j3 T. C5 i+ K' @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, b- P4 @+ p$ j9 E4 O8 J, c) w
addr = base + cnt;
/ Z5 K" T) i1 e8 y
sync ();
$ c9 u# V& U# W, k: z4 W
*addr = save[--i];
* c! ]" l. p7 X( t! Z6 n, e( U
}
0 ]6 ?4 R" V- h& |* z% V, c( X
return (0);
/ v0 E# M0 d. E$ C$ i0 ]' q' _
}
# L, E% m- \5 I
* h4 R) a. D7 a$ p; a
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( W6 c2 l3 o* R% s; a; v
addr = base + cnt; /* pointer arith! */
2 h9 P0 \9 @. N" }
val = *addr;
, ^7 N5 o) G( m( s& [- G x
*addr = save[--i];
/ T% b4 r' v. d' E
if (val != ~cnt) {
: a& h _9 X( u
size = cnt * sizeof (long);
% S3 a6 ~$ y3 a# A. J; u% B! ]
/* Restore the original data before leaving the function.
- C6 T' w5 |% p$ f$ \% P" j, g6 ~1 i
*/
1 \( @- x, P; }. i- q' t5 {8 Q n
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ {0 Q6 t. [4 E( g1 s' E. L6 n3 P
addr = base + cnt;
- R9 {% o! k5 ^0 [4 E
*addr = save[--i];
5 z' M( [. _: Y1 i& ]) y4 q' P
}
% I: ]% e B) ]" g
return (size);
- ]( b7 J, B" `# g! \$ I
}
+ o* i# @1 ]! y& W9 B, U. f2 e P
}
) ^; _* F3 k6 f! [! b( g" N( { o8 [4 y
1 U0 B. e3 H5 b2 O' p& c7 H' N
return (maxsize);
" u* P2 f6 h2 B' b: ~
}
5 m. u, X6 J/ }
int dram_init(void)
* w# q, f8 W- B2 ~: `6 S7 e
{
' F7 j- m2 e7 k0 S- k; A2 d
/* dram_init must store complete ramsize in gd->ram_size */
5 H" f! P1 M/ R
gd->ram_size = get_ram_size(
& Z$ X1 r+ f+ O6 a# E! i& n. w
(void *)CONFIG_SYS_SDRAM_BASE,
* z3 K4 y0 t7 N j% g. L
CONFIG_MAX_RAM_BANK_SIZE);
9 K* K1 N5 u! U2 ?3 [
return 0;
. ~/ \; ^; w6 @% b: h5 k3 }* A8 ?
}
( F( N7 M. `" y7 `
' Y. r1 k& L; j2 j* m% I
\0 O1 Z) s* K1 J; y' V; X
8 ~1 K/ J# ^, S1 t4 J4 I
" \' l2 l) c, e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 I4 ^! E, x1 p4 b4 h
* J+ }4 Z) n2 c- q# Y
4 ?5 ~! ?7 @' [8 ?6 `
" E+ _( T" {9 d9 X# j% D) l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4