嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 \ E4 Q: N$ M! Q6 R4 G8 Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 K+ }+ i4 F. x' y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& u' V" P. h& K
1 Z9 Y. q2 \$ U3 y/ L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" w V6 ? r8 |: A
7 p* u; B9 \) J6 O$ P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 r- s3 ^) `% \6 U
/*
' ~ I- i, M. L9 Q0 p0 w6 H
* Check memory range for valid RAM. A simple memory test determines
@* v5 Y9 J) D8 o( V& {
* the actually available RAM size between addresses `base' and
+ F5 ?: w6 {( y0 A4 _# p* n0 u
* `base + maxsize'.
6 b! u; w1 D9 v9 X
*/
+ q; O4 `: ]. Z ]0 T
long get_ram_size(long *base, long maxsize)
& ?( P- z/ j; @5 _
{
6 f- [7 Z( N3 t( g0 S* p; K. r
volatile long *addr;
/ X6 h9 Y ]. L6 c* d1 J) } c
long save[32];
8 U, }- Y$ n- ^8 L
long cnt;
$ F6 R% V/ Y2 U! ~
long val;
; W8 o/ v( r) f" r
long size;
0 g# b E# I/ w: O: r6 B# p. M
int i = 0;
) C& G- l" W7 `0 s0 ~' e
6 G. H* h6 x) s
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) A% q, l0 x( K4 t; y
addr = base + cnt; /* pointer arith! */
; ]. P& P0 _# D m
sync ();
3 @2 p( g) E# P n# ?
save[i++] = *addr;
3 [' A v& E' o0 ~ Z, K; n
sync ();
, s' g Q1 e" V
*addr = ~cnt;
/ v) E3 \: E3 D8 M* ^4 w/ D
}
+ `! p T+ S! `, ^! z" r3 ]
6 y7 ? j; U% s# q
addr = base;
1 n1 d, N; a3 X# P# r+ }
sync ();
4 H- Z- [1 ?5 O
save
= *addr;
, t0 s& c6 n7 Z. n; E3 z
sync ();
4 i3 m% M3 W0 }4 [5 l
*addr = 0;
' m4 R: k2 z( [) j2 U2 P
* A6 s" o5 ~3 `$ d' m; G# t& I
sync ();
k. v" X) E4 p
if ((val = *addr) != 0) {
4 |# q- K2 H3 K3 x, o* b% G8 s
/* Restore the original data before leaving the function.
3 Y, _7 l3 W, W
*/
2 S3 _2 C- F" T" |
sync ();
; }8 s. O! a: k
*addr = save
;
! w, m5 O. j. E" y# Z
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 ~7 X9 R' u; m( S9 W, |0 G6 a& {1 Y
addr = base + cnt;
/ x* i' T# b$ ]6 X1 B
sync ();
* Z" Y2 M# i' E& u2 I
*addr = save[--i];
' E! A7 p6 i4 t$ x6 M: x- a4 z
}
Q1 U( u8 m3 W8 z0 X
return (0);
# W4 r' G# T$ O# Q: G" q- \
}
( L) e9 J2 o1 v- O
, k. H8 M3 z8 m) k' b
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ }1 U! a) ~/ x: S/ }) @ C9 C9 e
addr = base + cnt; /* pointer arith! */
9 n5 ]6 a% t2 c( J! V0 \/ }. B
val = *addr;
) x1 B( x/ C( j# {" ]# t% v
*addr = save[--i];
1 O2 m, H. `8 ^& v7 ^
if (val != ~cnt) {
: r6 }2 L6 S" @# j$ Q
size = cnt * sizeof (long);
1 N K% O7 u" j
/* Restore the original data before leaving the function.
- x9 {7 B( P2 ^0 ?. ~
*/
# P5 H' x+ d# ]' O0 W
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 q! N; O) A2 l. Y2 h0 i
addr = base + cnt;
% H5 I* @) B/ |7 D. d) ^' s) V
*addr = save[--i];
+ y+ S3 @9 q% L7 {9 S
}
% S1 [" _# [& r1 F8 e y
return (size);
9 E# n4 c8 |! }: f; N% q5 ?* g
}
a/ X7 J; u! n$ D; L; D
}
& G1 l2 X5 d# G6 y6 {
1 p1 F( H. b3 h; v" b
return (maxsize);
2 i6 G7 ^; f( ]" ~9 n( m; ~
}
1 }8 w' [0 X, b7 O% m( N3 C
int dram_init(void)
+ v- _9 w! z. `& N" W7 D
{
& ? y$ p1 ]/ `, k! A7 G8 E- y
/* dram_init must store complete ramsize in gd->ram_size */
' i% C7 B" [4 V1 s; r3 \# p Q
gd->ram_size = get_ram_size(
, f! Y S6 g+ G3 d! B& e" X
(void *)CONFIG_SYS_SDRAM_BASE,
, ]1 [" M, U' v# Q
CONFIG_MAX_RAM_BANK_SIZE);
+ W7 T. V' N3 y7 b8 h) R+ J* g, Y. F
return 0;
3 {$ e1 Z# g0 t; M% X
}
! M4 ]/ G' U0 y
7 ^0 j: R5 N# E) t- K" Z; [
- U3 F) y7 j a8 r' H
0 {* _. l" P8 t4 S6 Q) W! c' B
- v2 g# Y: V) p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 U. H* Q( ]8 r& c( J4 Z) T/ v/ R
|$ j% m. g) Z; a5 _: X$ H) P
- \$ `2 ~; `1 m
' J6 L. ~/ d/ i, ]3 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4