嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
' @: y! D# j+ d" [$ p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. j/ p! H- Z) M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ U4 q" O- n" X: r+ B1 a
7 n/ b: x1 U' i# P( ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! z( r" i z" E' R) W& y
! {* r- i: b% U4 r1 h( }0 I9 C l7 @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 N, p% t. r9 n- C" B6 L6 q
/*
$ i- ?" r$ T' r# Y
* Check memory range for valid RAM. A simple memory test determines
& |& L3 v1 L1 }$ a/ a7 f5 ^
* the actually available RAM size between addresses `base' and
6 r O6 K9 {+ h8 L
* `base + maxsize'.
& Q$ H9 T; ^' z1 b# y0 W
*/
. U( W; L7 w+ h- ~+ _* L2 `
long get_ram_size(long *base, long maxsize)
3 \( \6 X- K- K0 |2 V. _ k& u
{
: [' g/ ~1 X! z( U( e
volatile long *addr;
* \8 W* W# f6 D4 c
long save[32];
; b8 V) U6 G a. R/ T r) d
long cnt;
5 c) d) N; l+ r( c8 m F7 c! B9 M
long val;
/ u G9 v2 V+ [; e
long size;
) j. G. h" Y: {# |2 k' P' @
int i = 0;
$ d+ l6 n+ S! I2 L- `( h! \! d
2 z( P ?* _% B) c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 n5 E3 Z; ^6 V/ W+ d
addr = base + cnt; /* pointer arith! */
! a5 f t; H3 c0 t0 x7 M
sync ();
r; d: @( K6 m4 ]& y% q" w. P
save[i++] = *addr;
& e8 H! F \' g5 n$ r
sync ();
5 X6 k. E) I' x, A, G5 n9 L$ l5 k n* ~
*addr = ~cnt;
6 Q7 U6 N1 A) W
}
% v! x( O$ M3 S- {; {
* f2 s- n9 A: _+ @
addr = base;
# ^: K/ b" X4 Q( {: n7 w+ t6 N6 y4 M. C
sync ();
& }7 L9 U9 }4 ^( ?
save
= *addr;
0 \6 p4 A. d2 z6 H; X# p
sync ();
; M4 A' Q( l1 S6 e& u3 w
*addr = 0;
$ J8 l; y" @3 W2 S: L
7 h) L2 o4 j& l, v4 _1 i
sync ();
6 E. l& E1 H2 @$ m! P
if ((val = *addr) != 0) {
* V# V; p6 }4 B+ Y
/* Restore the original data before leaving the function.
: M; J7 n+ o6 X
*/
, r" c" U& F8 g% F* I- G3 l% M( Q* {$ r
sync ();
. H& A A* U e& R- |
*addr = save
;
* w" ?: ^5 `8 {7 W3 J @3 h/ k
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( H+ @+ \) r, u# Y1 D
addr = base + cnt;
7 I6 H! T! T; G) x2 [6 |4 b
sync ();
) v# M) R- k( Z$ g
*addr = save[--i];
; H* k" {5 g' B# Y/ T
}
+ @$ C" p' a3 R1 Y: ]
return (0);
, X4 [: \1 r4 l" h b7 g3 U
}
0 V" H3 A* ~9 A( t
. l5 l8 b1 X& G" _9 w+ D* h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# s! @% I1 b/ c ^! O/ T7 P5 ^
addr = base + cnt; /* pointer arith! */
9 G) P. a! y: Q' t1 z" z6 T& n6 e
val = *addr;
# c% _1 o; @, N+ Y, g- R2 a6 \
*addr = save[--i];
4 j2 e, s t! B) I0 e
if (val != ~cnt) {
, Y, M5 Z* }1 r4 L& ]9 R
size = cnt * sizeof (long);
7 a& J. i& V% [
/* Restore the original data before leaving the function.
5 m3 s8 v) a* n8 z; L
*/
7 o8 o6 l3 D( M2 z
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% T! p4 }/ e( Z' a4 h; [0 O+ J5 ?- N
addr = base + cnt;
( Y: M" Y$ X4 ^. |8 {: w! b
*addr = save[--i];
) ` b0 }2 a7 \8 T; Z% r% C! Z
}
& s. ~$ u v( j& @
return (size);
. L7 S6 n$ b5 T, y
}
+ A2 m9 _5 K) ]
}
+ V- G/ ^- v1 Y& a+ k7 d
' s @* s5 k* @$ t4 Z) ^. x0 h' Q
return (maxsize);
+ _ z" Q! e, M$ V: K, y
}
& f8 G; \& x: k& e( b
int dram_init(void)
# `( k. t( P2 ]) Q9 n8 _* I
{
0 a3 o3 S0 s3 p6 j+ f9 L0 |
/* dram_init must store complete ramsize in gd->ram_size */
$ M# j, L. Z3 M
gd->ram_size = get_ram_size(
3 p/ k% N8 b5 _$ s8 l \
(void *)CONFIG_SYS_SDRAM_BASE,
% W' ^9 s# Y$ [# ^7 T( W6 D' t
CONFIG_MAX_RAM_BANK_SIZE);
3 C7 f9 s( O5 J1 E' _0 O# R
return 0;
# T& X1 F* M9 {- {
}
0 x8 G; [) m& k1 W$ G! p. T( c: z
: K9 s1 ^0 e3 x+ v; `
% R- K& T$ S# v) ]0 q' \
! w& t7 Z! D0 p/ Q% B9 n
) L. J! N9 P) Y5 j. a0 A) [+ \+ _# p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- P0 e6 _9 T& g7 _9 X' R$ T
8 N, S6 Q5 E2 M' `! z4 x$ u+ a3 ?
0 `: D6 J7 W+ f b5 k. M
1 \) T& s! b- z( O; G) C
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4