嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
p& d$ Q& h9 ^7 Q8 Y- P
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! o& H. F! u, o# p7 _5 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- I0 ]1 ~5 s3 e) o8 N5 y Q1 K
$ ]; w8 a# _) w: S K( r g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* Y# w; |! n" s3 B& A
, z7 J. J$ C1 {, v0 ^* v
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& u2 D/ U" C# X* K+ i
/*
" I* Y1 S0 ^+ s0 f& `
* Check memory range for valid RAM. A simple memory test determines
1 U" M1 ~# K/ N* |& e
* the actually available RAM size between addresses `base' and
" ^+ j: j7 p& q- c+ b
* `base + maxsize'.
$ @6 m5 w* b! s: R! m/ E
*/
1 y/ B7 {8 q n* N2 R' q( w, J! t }
long get_ram_size(long *base, long maxsize)
* ], H: K; `9 O9 [1 a$ O
{
9 |1 W$ D0 u' K3 L
volatile long *addr;
3 o p/ E. s- C; j( M! O: ?6 q
long save[32];
7 x* O" K2 {6 A* m0 |) T3 _
long cnt;
/ E6 V' q5 P+ \$ i4 N+ A. k
long val;
0 N- v' }" R8 ~9 P0 |+ r
long size;
5 |4 }$ `! T/ x6 U' ^* C |+ }
int i = 0;
& v+ ~- o* K+ k; y) v0 S3 G4 \& X
, K* o5 ~. A4 Z j& ~
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ Q' o4 e" W4 d$ W
addr = base + cnt; /* pointer arith! */
- ~1 c; ^6 D1 I9 O
sync ();
; j# t/ L; L0 F0 L4 C
save[i++] = *addr;
v8 s0 X( U. |8 F3 { w
sync ();
* E* W g [1 L7 f* k1 w2 p
*addr = ~cnt;
3 u4 t. c" w" L, x( k
}
% |" P8 m5 _( ~9 Q4 Y/ l
8 J4 q6 C$ [. p7 c3 ?" T
addr = base;
o V0 I% g* R0 O+ H/ B% h4 y6 f
sync ();
: _1 U, u; \, S' H( Z) b% ]$ Z
save
= *addr;
2 x$ n6 r7 ~* e/ _# j
sync ();
- s6 o; X9 o9 g7 ^' ]1 E$ C7 K
*addr = 0;
5 q7 z+ k4 u% A' s3 v
; z8 y( e! |+ }% t; t" N# H
sync ();
; M C+ ]( l( n1 D/ H
if ((val = *addr) != 0) {
) B: o4 s: d" V) u v
/* Restore the original data before leaving the function.
% L& \) ]- G/ O- m4 g& [; E
*/
& `$ w/ y' T7 Z% N0 o
sync ();
- @! C/ ?4 Q7 k% x
*addr = save
;
) N0 X1 Y" g/ q6 S8 ?- {; B' l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; I9 L' U6 P q( C; @$ m
addr = base + cnt;
a# K% Q3 _; Q( U
sync ();
3 N$ I3 Q/ h/ g' r9 v( I
*addr = save[--i];
, U6 D5 P; Z' K7 n* A5 G
}
# ^' B- \9 I2 U, G
return (0);
8 g6 C- I2 U* t- Q3 P
}
! Y$ b, `- i, B* X) K
) u3 T/ @ z& S( g: }+ B6 ?4 D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 M7 ~7 ~/ \# V* m
addr = base + cnt; /* pointer arith! */
0 p& e- r0 M) I7 r, X
val = *addr;
0 Y) I) C- e% z1 G2 E
*addr = save[--i];
' C6 D5 f: d, v+ [9 I {5 w5 j9 C
if (val != ~cnt) {
! w- _& h" k7 u( h2 F# o
size = cnt * sizeof (long);
* E, D. B \1 s4 n
/* Restore the original data before leaving the function.
( {% \) m+ X0 [' ^ L4 @
*/
# {) ]$ @ h4 l7 h. O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" V$ u' x0 I, w
addr = base + cnt;
- K$ M1 n- C# L% U t; s/ B" p
*addr = save[--i];
. W: x' k8 c- F7 C* L
}
8 b+ x9 Y- V7 a+ j( ~8 E3 Z6 `
return (size);
' q4 s" r [# w# E
}
/ Z7 o9 O7 c: Q" T" Z
}
1 v% P: g2 x# ~' z* I- i
; { y7 C, ]% G6 ~! `# \5 V1 b# D
return (maxsize);
7 d3 u4 V3 C; Z: R% f
}
) k F$ X) g$ j- y5 J/ B3 k. s
int dram_init(void)
( q( v- ]$ e6 h4 S5 n
{
/ V. X' j& C- K/ c* _/ S4 B3 W
/* dram_init must store complete ramsize in gd->ram_size */
: b. P5 P0 R) e9 r
gd->ram_size = get_ram_size(
: `8 S ]& D b7 w0 X
(void *)CONFIG_SYS_SDRAM_BASE,
& T" A w4 V& Y! V1 @( `' c
CONFIG_MAX_RAM_BANK_SIZE);
# M& \7 F* K# t- j
return 0;
F5 m8 L& {( ?' ^0 h
}
! a$ h6 t2 h2 |5 R4 p
$ w5 M, a* r5 C5 o4 [- W
0 x z+ d( j+ _
+ u/ I! P1 J& I5 f* ]
2 H. P) q+ r% u7 o( C8 e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 V5 C Y% U1 P
/ ^4 y( m( x' X4 A0 u4 T
: l+ T! k W- d4 S4 T
2 d& |! Z8 g8 n# v# X/ v Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4