嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* _4 s3 [+ ]$ O' @1 S B% ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 L B* [3 n0 T/ k4 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* ^5 k0 Z3 O" l/ }: e
: y* u/ Q9 Z }0 i7 y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 l5 q8 Z% J& Q/ _0 J; O o2 O- ~
& x% V+ c# u) [; ]
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 @ c$ D" l* e9 F* s; ?8 k
/*
! `' c% B4 ~# F* M* d
* Check memory range for valid RAM. A simple memory test determines
! w4 h% S+ O( k3 s, n4 w8 v
* the actually available RAM size between addresses `base' and
' r, p0 f. d6 a- k3 ^: f- U+ O
* `base + maxsize'.
" ]7 m8 u- L) |/ M
*/
" B3 j4 r! ?+ R% z
long get_ram_size(long *base, long maxsize)
1 F: x0 d! L! n' C" |, M8 ~
{
8 j* Q; u' W \' b& g$ f
volatile long *addr;
) H! A! ?7 D8 P/ h" z0 i- n
long save[32];
0 L* p3 a# G$ z, ?3 G
long cnt;
: v9 b0 B6 k0 o6 c6 s$ J- B
long val;
/ y$ n1 v$ O' z* ?
long size;
, D" ?4 ?; e" e3 Q6 a$ Y
int i = 0;
/ A- T' m! B. e+ x) m. S' G7 E
, ~8 J& E$ H; c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 [& H/ d4 L+ h o/ s4 d
addr = base + cnt; /* pointer arith! */
" } M4 ^' U6 T7 `' W
sync ();
- X7 Q" P2 h9 J3 c |, ~
save[i++] = *addr;
6 `5 Y. P1 p- d7 a2 k
sync ();
9 y( v+ {& u0 y
*addr = ~cnt;
+ I; j/ y- a( c- N8 N w7 p
}
; r5 B# N% z" C- T( q) ^5 a
& H2 [$ V, H: w) K L' o7 M9 ^
addr = base;
& `+ \' n; r5 h- o) u: N4 ]; O
sync ();
- `6 @* Y$ E! k
save
= *addr;
) x4 J+ A+ N4 e( I- [1 ~ i, Z# z
sync ();
' L/ i: V) R1 F. m
*addr = 0;
E4 N. X4 d4 a8 B
" X% r1 P# i# I" L" j
sync ();
4 w+ _0 x: d% o5 @2 ^& x- X2 o
if ((val = *addr) != 0) {
' U7 J+ A q- Q& ` F3 N0 @ w
/* Restore the original data before leaving the function.
+ l. P2 M# m% n9 ?# \, F( V! N1 t+ m
*/
4 T, [" C0 Q6 q: R T
sync ();
. }) y! S9 o6 s- @' w0 u1 g
*addr = save
;
& c; Z! Y0 O: Y9 v3 ]* ]1 f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ F8 Q- R+ V' J" y+ ]
addr = base + cnt;
6 k4 R5 _& Y N- f$ d
sync ();
* E3 C# |6 J) f7 R# O) |/ C- U
*addr = save[--i];
4 ~ I; n4 [6 N$ ~# k$ i; e- V
}
* T4 h; b( \. G# W' `% {, {
return (0);
! ~. v+ o# \6 A$ {5 a' I) M- ^- C
}
* u9 r$ s v4 N
( }( M9 o* i- \/ n6 P" O1 R
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! Q' f) c7 ^: c$ S# L7 |; l" G
addr = base + cnt; /* pointer arith! */
4 m8 _( q { R3 }$ ]
val = *addr;
! b; p0 t& C$ `5 t& }0 s
*addr = save[--i];
4 o5 A& B7 j; K& l w3 e
if (val != ~cnt) {
, M% u: Z. w5 T1 q1 K, V: g0 e
size = cnt * sizeof (long);
& [* D& ^7 A% Y' ~
/* Restore the original data before leaving the function.
8 X6 Q/ J: q( s# E+ V
*/
& {( P0 e. T4 G, [' N: L4 I9 v
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) r; [0 Q I7 y" J/ f
addr = base + cnt;
2 _ T# O# |! F) p4 S$ ]8 \
*addr = save[--i];
, T: k% g0 }- d) C/ |& ^
}
1 B0 z b, ]) B/ v
return (size);
) L" P% Z0 c' O: d7 V7 \- p
}
4 i+ |3 d0 i1 G* {
}
; D+ \0 _4 D% q# ?4 A0 F. D
( J# ?/ P2 y' u. V! `3 C
return (maxsize);
( V. W1 B' o( d' |+ Q( O0 r
}
" y M1 w/ C& [ r) ?% c, M7 W
int dram_init(void)
7 [) ~) M' u% x& X5 h
{
! u% q2 m) ]* Y! T5 I
/* dram_init must store complete ramsize in gd->ram_size */
; Q% ?& S+ F9 C
gd->ram_size = get_ram_size(
' J0 K9 ^$ c. O6 R7 S- \
(void *)CONFIG_SYS_SDRAM_BASE,
6 C/ H8 R+ j1 B) O
CONFIG_MAX_RAM_BANK_SIZE);
5 C2 K; R9 a+ t+ L* x
return 0;
' q# Q) T8 p9 `5 c# V# n
}
5 U4 s! F; r$ N/ l8 @& U p2 x
' s9 F0 N; L" V$ W& E
- U U' @9 g7 ?6 u
0 S& a* l2 e# t, h5 T8 E- N
/ ~' x* Z% o9 s4 l/ k8 h, q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ L2 A- `$ C+ c, C. [. n
0 {7 A ]2 c( b+ y x) K
& d1 Q8 ^' ?5 h# L7 u' a" P
0 c; @" s! a+ F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4