嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 a2 O) V$ x4 \" i' X8 @5 D" {, t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
! k( f9 s# [9 k' K4 z+ d* i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 b# e K( W+ w
, k& {, J% d- b6 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 P3 \* w4 a$ X& u" r% e5 T
2 e/ n1 L! J- ?0 A
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, q4 s, O& e$ c) ~/ r0 R
/*
0 C5 A: e, D: Y k
* Check memory range for valid RAM. A simple memory test determines
3 K* p5 ]5 ?; r( ^2 g G( P3 {. k( j5 L
* the actually available RAM size between addresses `base' and
( s J" X$ Q8 b& e6 O5 F4 M3 e
* `base + maxsize'.
/ A, q T# ]8 i$ H: o& H; Y
*/
$ G# [: q! V( v) x: k- @' r4 ^
long get_ram_size(long *base, long maxsize)
; |/ x; V; s& I; S$ Q+ L
{
5 q4 ^' f( K t8 ^
volatile long *addr;
: u' V; I N. p6 C
long save[32];
$ G! L' o8 b N6 p, h
long cnt;
* j9 r9 |2 f* d! w
long val;
0 f7 c6 i( [& {; A/ V, M7 W
long size;
/ t) ?* D Z# [# H
int i = 0;
+ t+ R' U1 f8 v- I! \* j( C
/ ]5 j8 M# ~5 X1 e4 g* s( j
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: [1 M$ V z {3 ]) m
addr = base + cnt; /* pointer arith! */
* i2 R9 N" i: d( d5 y
sync ();
/ b G6 o$ g* Y- y
save[i++] = *addr;
6 k# V; _9 w, Y% R) H4 Z0 U
sync ();
; P: q8 r2 p z6 x+ _& W; V
*addr = ~cnt;
7 ^+ v5 `# s% a; w( i! K
}
6 f) m9 r7 `: U7 ~
) q1 X7 g2 y. w
addr = base;
0 U& @ L9 @4 m% g% \' M p
sync ();
0 |0 k$ x6 ?8 p; D) B1 j
save
= *addr;
% F8 [0 N( h6 X4 F/ n- ^3 Q: m
sync ();
- e5 p! ~; z; l' \( e8 |: y0 X/ O
*addr = 0;
" h3 n" @% a6 X8 k2 Q, x
4 V/ A* Y7 |+ |5 x
sync ();
6 ?. M, d- x0 a9 P1 |
if ((val = *addr) != 0) {
% C/ c; M) t/ g' K* X+ v
/* Restore the original data before leaving the function.
1 {$ ?8 J q4 \8 ]+ H
*/
* u- u ^2 I" Z7 Z
sync ();
9 ]! D8 d5 o, B
*addr = save
;
/ S( s1 ]7 ^8 R7 r' O
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* ~3 ]) `/ r8 V; s
addr = base + cnt;
. b( U; U: N5 M
sync ();
7 D) u* C2 m/ t8 k0 a% I
*addr = save[--i];
( ^9 t' u" i/ M+ ?5 v# f
}
1 ` L7 \$ C) B- N
return (0);
/ T$ Y/ B" Q9 u+ E
}
9 X" a9 ~2 _/ Z
; y; B1 r! a! J9 w. ^# x v
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 P- G1 q8 Y7 r. L ?3 L4 m
addr = base + cnt; /* pointer arith! */
7 P$ W8 @6 m( n0 P) J8 h
val = *addr;
- ]3 T$ ^9 P$ X! a) v! N
*addr = save[--i];
0 [6 W# W( R8 w8 N5 r% E* a& u8 p
if (val != ~cnt) {
+ j6 j- Z ]% m' e% O0 }/ @2 q
size = cnt * sizeof (long);
( i/ v) A$ N/ ^3 K. u
/* Restore the original data before leaving the function.
7 F$ Y# f5 p( b4 H
*/
5 @3 n* [2 N, _3 |* z' J, M
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 `. o3 _- R% W
addr = base + cnt;
" `8 Z8 N( G4 \4 V3 O% F) \$ V0 L
*addr = save[--i];
1 o9 t5 ^$ ]! n5 A# t* h5 H& D
}
$ @- e1 Y" O6 h- c6 ]8 o
return (size);
% o/ ~4 O% w# ?1 U0 L' [% u9 F$ q6 x
}
. X' P) C) C2 a$ k# V% x
}
6 a8 N8 s& Q7 u! n- L$ u
, _( m5 |# K' G7 g% N0 C0 M
return (maxsize);
3 W8 X" F# C" c
}
* j6 |% a6 S" u& U5 P
int dram_init(void)
& v$ Q' \ [( K2 B! P3 f
{
8 ]! {( h6 i6 M8 D- f
/* dram_init must store complete ramsize in gd->ram_size */
) Z+ U. Z0 X$ m% G
gd->ram_size = get_ram_size(
7 T1 z* R z/ c* D6 i- V1 f3 O ]& {; `
(void *)CONFIG_SYS_SDRAM_BASE,
! q% Z9 H- B: s0 x! u' ~
CONFIG_MAX_RAM_BANK_SIZE);
1 q7 v6 C' P* v$ ?
return 0;
- G. k0 M: L- Q' C( ~# D& u
}
" w% U* y2 Z1 b
4 u% ^0 F3 f( [2 m2 z
4 D( @8 { I! ~8 u. F$ O
* }, t+ M2 I1 O: g; O6 V* {
3 Z) F3 H( S, j; W+ s6 t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* }& M# ^- ?0 Y9 u+ z
8 q, f( ? }6 B: h8 e. e- r
+ i" _, |4 N$ d0 @' T" w
/ x9 o; u9 O ~; {8 Z- Q' G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4