嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. Y( g# C U% F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
& D c* U4 c y* h: ^; v6 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& [+ z. P& L% `0 b% P, [, V8 E7 T5 N( ?
, y6 ]* s9 g+ o5 \8 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 l3 [4 }% m) W
. E6 S+ |! Q8 H3 C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ F- q8 U3 I! \$ _, i
/*
; J" L2 D% s `6 z, z/ z
* Check memory range for valid RAM. A simple memory test determines
% P+ X( H; E* t: d8 |7 a3 e
* the actually available RAM size between addresses `base' and
( X% ~: G. J; x0 J- |0 \. V. }
* `base + maxsize'.
6 F: C1 y+ `3 b6 [
*/
, W: u, V6 s: i+ L4 d, a$ o! t8 t
long get_ram_size(long *base, long maxsize)
9 j j8 y5 l- |
{
+ C K& y* E! T+ I! S8 O3 w
volatile long *addr;
7 A9 G! r- l4 [/ q& [' B
long save[32];
1 {% F3 h+ f- T
long cnt;
6 \$ W6 F2 g2 g; W' P
long val;
' Z+ Z+ {% B' V- G1 B1 Z/ h. \
long size;
: U: O/ j L* a M) C8 z! E& `
int i = 0;
6 S) o4 i/ m) a- D; o2 G- s
' [7 E8 ~6 x3 Z1 b* f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* ]& D% ]9 k& n1 X* x I6 m
addr = base + cnt; /* pointer arith! */
; W2 @3 P2 d4 |; ~0 u: v
sync ();
/ L6 `3 T5 f" Q" I* i3 i
save[i++] = *addr;
1 A' y. C" D. O# K" z* K
sync ();
( u* a: Y$ j. O/ A# Y% G8 e9 t3 @
*addr = ~cnt;
: r9 K9 d. @) p2 `, Z$ W0 x( R
}
, p/ b1 K M- d# z/ `
: I9 ?# C4 D4 q( J" F
addr = base;
/ G7 e( v! O5 M# _! m& E8 Y
sync ();
& P' L. {5 b; d! K3 S
save
= *addr;
3 n0 a- Z8 c( M( u& f% y+ T
sync ();
j& w: l7 d1 e3 I1 n' T
*addr = 0;
- ^" w" v+ b9 t* c
; _) G2 K4 C* y4 l
sync ();
& ~/ _6 c2 r) W) O: J
if ((val = *addr) != 0) {
2 N+ A0 ?; C5 J9 P- \2 g
/* Restore the original data before leaving the function.
4 D/ ~& W/ a$ y* \
*/
4 S) } r, f. v& C
sync ();
0 p+ r. W5 _* P4 Y
*addr = save
;
( R4 l: _/ h4 [. Q7 i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, f; `; e8 _4 ?+ r6 G T
addr = base + cnt;
( M4 M2 b, ?. E# I3 x
sync ();
7 W" l: p, I1 y# _- w
*addr = save[--i];
3 v0 ^* G H0 B2 v: w& u
}
6 c, J7 r2 {$ G$ H1 K. O' M" L
return (0);
: V% B( _3 W K3 s- c* _, k
}
S$ Y8 X2 E0 ?( y
2 M: F( p$ U! _) y- y* l% I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; d# n0 j( O& J r4 n
addr = base + cnt; /* pointer arith! */
% s: g5 N4 i% x; }4 }
val = *addr;
1 \' N6 L4 K. m4 W
*addr = save[--i];
/ `/ F# f$ ~3 N* `$ d5 C$ v" n( R
if (val != ~cnt) {
: q* S6 b# b: Y) [& c# l
size = cnt * sizeof (long);
! q" U7 y0 u3 b# I
/* Restore the original data before leaving the function.
k1 u I3 y! M( G H- D
*/
: s( e+ y, i+ E. ]/ e+ r" e, I
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, @! I: [( t7 Q9 L) C9 s# m
addr = base + cnt;
$ w3 C1 x2 Z. p, @) @
*addr = save[--i];
4 p- T7 k0 N7 g y5 G( m4 g
}
2 c, I0 ^7 B# o7 }2 o( X
return (size);
; y* p. j6 J3 n
}
0 a& e; o4 U& W0 |: e
}
( j3 q0 i# i( r, F7 G. M* X
" D8 G9 `; V8 K6 o
return (maxsize);
: f+ P7 {5 a2 ]: H8 D4 k2 C( B6 L
}
4 A- ]3 D! n7 u& K
int dram_init(void)
0 ?$ O0 O' t' g/ h) m" Q& u, J
{
G( o) ]) j9 ~) S
/* dram_init must store complete ramsize in gd->ram_size */
/ P0 D4 o: d( L/ u9 \
gd->ram_size = get_ram_size(
+ u: Z6 |1 c w% z
(void *)CONFIG_SYS_SDRAM_BASE,
f6 W/ ]. O; h+ S
CONFIG_MAX_RAM_BANK_SIZE);
: g! O- x1 g2 o- z' R8 F/ u
return 0;
: T8 c" l0 X4 u8 D. i1 p
}
& {; a+ a: y Q6 v F, Y* r% Y
0 }+ X2 u* v, T% M2 f
9 h+ i! C4 M6 ?- T2 N ]3 E
; g$ u9 q& E6 Z. p/ X2 c$ o
- [' P/ ^- f4 o" q7 T; Q! U7 ]0 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! s: X0 S5 E/ T4 Y8 D s
* Q( I6 O9 e2 r
* i" F1 k" O: [8 d, @, e# V4 g
# { r8 L5 M: a% L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4