嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
8 X* R5 e t) v" E- F$ \2 L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% W q0 O6 W O0 m# G _3 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ H+ r7 D+ H$ z* ^% A3 w3 P3 I- t
+ B4 {: |+ p9 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 o4 K3 U8 d% P- u2 ~& ]8 n: S
3 K) Q/ j5 { A5 w) y7 \0 C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 Q9 C6 t( `0 e( Q( K9 H, r- {
/*
3 P9 z. B9 ?7 R9 y- {8 h
* Check memory range for valid RAM. A simple memory test determines
6 b W1 Z% ^: `: o: M5 w
* the actually available RAM size between addresses `base' and
$ O% c0 W4 @" n
* `base + maxsize'.
" T" J+ D! t7 w! J5 j
*/
2 c4 Q) F! G4 P; g7 V
long get_ram_size(long *base, long maxsize)
6 |: e" w/ I/ K- @- f
{
6 H- |2 }* D+ @$ }! a. O
volatile long *addr;
4 r8 y1 g1 H. w
long save[32];
4 z7 i X+ Z) N) s
long cnt;
% k5 X1 a8 ]( y+ c4 Z% L+ B0 Q
long val;
( L2 F4 g) J4 p$ X5 \
long size;
5 p, B8 r+ N# G! X1 l1 n
int i = 0;
7 j3 p6 z) W- k2 \% w
4 ^: Y n. j9 z$ Q, e1 G: D% M4 ^0 |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, G1 c3 L: U9 G, W
addr = base + cnt; /* pointer arith! */
2 v. k* f2 j) t( G& b( l* _
sync ();
1 T( A- E) ~3 i# n9 j3 y+ O
save[i++] = *addr;
) \' i0 [0 k$ L
sync ();
6 R$ ]$ i. v' j0 x6 m) I2 s
*addr = ~cnt;
! t$ E$ E$ R2 B! I5 D V
}
* }1 H( R; E D, P* u
6 m2 Q+ G* G3 o8 s
addr = base;
+ X1 L1 @0 u4 G; C5 k
sync ();
/ G: ~2 N5 _6 U; H5 C2 [. H$ y
save
= *addr;
" I" f" K; j1 Z& _9 T
sync ();
+ H* m/ b2 A' u# A, a. g
*addr = 0;
6 ^1 Z2 O* ^# F0 \# b. r9 j
0 `1 X& N4 Y) e! X% M3 R
sync ();
4 y& U# i, {- I! P* ^/ N
if ((val = *addr) != 0) {
% k8 L; s/ }" u' i5 k5 [6 D5 O
/* Restore the original data before leaving the function.
( U5 D8 A, ~# N+ k' w* P8 q: p
*/
5 L* M: k& a) T7 c
sync ();
& v: v5 N( S" V& @1 q( R7 o
*addr = save
;
8 H! w' k+ B$ B8 @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" W. H; y: y/ W7 I9 y. i4 p. v# Q
addr = base + cnt;
' }4 ^( w( U7 c C; M1 Z/ E
sync ();
# c/ W- r' J6 |- W
*addr = save[--i];
1 |% L7 N- T' {5 i. e9 A. K
}
) I3 r. B; q* x
return (0);
0 T% e% W0 H7 V- e$ s4 Y
}
5 q5 M, R& A6 s/ n
' p" t6 d7 R# b: {6 b$ Z' i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; k+ M: ^4 b6 S9 D) [# X V
addr = base + cnt; /* pointer arith! */
$ S0 \/ W# r e/ t( L( m0 _
val = *addr;
7 z! Y7 L' z! j; T$ ?
*addr = save[--i];
2 }% s2 Y! T6 K" J
if (val != ~cnt) {
' @6 @/ M) o" Y# _2 m- _
size = cnt * sizeof (long);
& N! A" F% `5 o" M/ T h; z# G9 m p
/* Restore the original data before leaving the function.
# R* j' e* X- Q$ w* e9 `3 p; C
*/
8 U; l! o/ {3 S, P1 [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( I* b9 z7 s: p2 \" K
addr = base + cnt;
5 U. G! U7 K/ y1 t& B7 K
*addr = save[--i];
" t% ?8 s; N3 E3 b, ~
}
* a8 D6 T: G" W7 i( `( S. n6 ^( {
return (size);
+ v0 K; }& G/ O+ N7 b
}
" z7 b% ]2 C9 y( H9 r
}
' g2 w! i4 A1 A! i& l
; O) F! z N# S8 J2 P& d
return (maxsize);
7 B9 z9 ?0 M5 [1 V# }0 z
}
) \; F6 q, e O$ g
int dram_init(void)
, l3 J, Q& S% n
{
9 c# _! p1 Q x& k
/* dram_init must store complete ramsize in gd->ram_size */
, o+ m: s- V* z8 l5 `
gd->ram_size = get_ram_size(
0 H8 S. \' v3 S; @" A4 v
(void *)CONFIG_SYS_SDRAM_BASE,
e# M+ I2 ?" Y' ~- o- W6 _* Y! z
CONFIG_MAX_RAM_BANK_SIZE);
$ R f' X1 z0 X$ _: m
return 0;
0 H9 C- S$ G2 v) k
}
4 |( ]# A5 b" V6 k) r
8 H( p% U o" f
! O" g6 H7 u1 J4 n
% F) Y4 e& s+ D+ w
& u! F& _- c( C9 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 d& k4 R7 W1 f' q, P W+ S3 r
. ]$ A1 m* b. b' t4 Q( w
8 J: e4 y& T# M$ M
0 R+ N$ K8 M# q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4