嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ H" t1 g, ]9 \( n! p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; h0 c+ y u; B9 t2 G& e3 A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
h) ^6 w: V( k; j2 H
6 F6 ]5 L# X; U2 I% o4 r, _# ]; J+ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- T) P" F9 V% u: |. P
& m( y3 t! \' s5 s4 B% [1 n* @
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 M0 W0 g6 P. H$ N7 p
/*
- t, |! x. H/ J
* Check memory range for valid RAM. A simple memory test determines
" p* ]- ?; `, X" {4 {% R
* the actually available RAM size between addresses `base' and
0 i0 J, H; N' k6 `5 A$ `
* `base + maxsize'.
3 }9 P" C4 Q! ]5 B1 \% I' i
*/
" J% o4 M+ s0 U* L
long get_ram_size(long *base, long maxsize)
2 h; Q; q. J: G7 M: ?; x* d- B# e' W
{
; J! @7 Z2 ]5 M5 d
volatile long *addr;
" x+ s$ [4 S9 a- \# }% R' o
long save[32];
, w4 b6 {6 W; ~+ T" L3 l2 B
long cnt;
0 l- x0 f+ {9 F; v
long val;
2 L$ O7 J4 z) l2 w
long size;
1 q& [: Q& m( @2 s+ v' z% k
int i = 0;
; G r _+ Q* H h$ Q% f; j
5 ~! ^# X1 b6 a- x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 P% K* k; e2 [* w T6 `; J7 `
addr = base + cnt; /* pointer arith! */
- v5 z+ h. D+ `0 S& P; k
sync ();
, A( k+ [) ?( K. m1 ]3 V& S
save[i++] = *addr;
2 \4 Y: n! }2 y% o6 l" u* C+ a
sync ();
) g. ~4 H$ a+ M3 N
*addr = ~cnt;
+ r; V7 _* q. K# x; B4 H% k0 X
}
$ R# g- B2 r* Z# e \5 m5 l
$ L9 h4 {' l3 \: s9 V/ x% _
addr = base;
) p- [: ^, {. y( f4 M+ |. I( r! {
sync ();
! [& E3 |$ a `; {) b0 s
save
= *addr;
) k) h+ T5 j, L7 G- \. L5 q4 ~
sync ();
0 e' g. I9 [' N' k- U3 C: q* {8 P
*addr = 0;
1 b+ ]5 A( o0 w0 G% e' C! B
0 F% A3 @$ E! K, m$ {; J
sync ();
9 h3 ^/ o Z7 s: {5 g" p" @& c+ F
if ((val = *addr) != 0) {
3 [, H1 I5 w4 s' v6 ^
/* Restore the original data before leaving the function.
, B( I$ f( [$ `5 g
*/
) ~+ P) V t7 c3 H+ h& W4 s( X
sync ();
3 y" e7 R- a% }* ^: }3 s
*addr = save
;
1 I/ M% Q$ ^2 `/ S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 W9 _3 ]1 X( K. Y
addr = base + cnt;
' r6 S6 L8 k8 V8 C2 Z2 Z9 q2 x- e
sync ();
2 v5 s0 t: r! H& k8 Y# S4 S
*addr = save[--i];
{+ Q. S! N. G& H* Q1 c2 d
}
( Z# R/ \! }; q1 n# s
return (0);
- D0 O* P) O; B) D5 h6 p$ M: d, {( k
}
8 n' _9 y8 z# H6 v
/ k" U9 q# n/ B5 f; ^, I# X9 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* b: W! ?0 E, ^, Y. b
addr = base + cnt; /* pointer arith! */
, X5 [8 F8 [3 X% T
val = *addr;
. t- S2 X( P- ]+ l
*addr = save[--i];
6 v: ~* `9 N0 q, d" W1 d5 H9 ?
if (val != ~cnt) {
: A, F- w" r1 N
size = cnt * sizeof (long);
; l- Y; c* A. X: |% x
/* Restore the original data before leaving the function.
; {5 s, x: ~( L: o. u
*/
) g5 U# p+ h1 S& \0 z9 C$ @
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 |$ `) x# [+ r( p: M
addr = base + cnt;
$ M* u3 `7 T% M) o: _2 A& l7 c
*addr = save[--i];
( A4 j6 K, c' _! n9 n
}
+ k4 g- i3 @6 Z: y5 G: o
return (size);
, ^3 G. N" E0 {0 i% R& Q h c
}
! J* J# { K* F( U! W: c- U
}
; o1 l* k$ W$ l: }
$ V/ a" T/ a. B
return (maxsize);
* O$ D2 b9 }- U+ {/ r3 U' y
}
3 ?( e3 Y3 [' V Y
int dram_init(void)
; L3 Z5 p+ |9 N! ~" F
{
4 U6 p0 j0 ^4 z7 E% w7 [
/* dram_init must store complete ramsize in gd->ram_size */
( o/ z+ p! Q/ F
gd->ram_size = get_ram_size(
6 J" `8 k' x2 Y: K4 b q
(void *)CONFIG_SYS_SDRAM_BASE,
5 o( V! I0 H/ p- X. w+ W( G; h1 C6 G
CONFIG_MAX_RAM_BANK_SIZE);
: s( h) r3 L7 l5 r
return 0;
0 e: U/ n3 D8 F! F# v2 o
}
+ G" d+ u- F; L. u/ Z8 d) }
- G3 j# z& l" H6 k3 a l4 `. P3 _
; s6 T3 j J! R
" p. P3 x! R; ?8 ]! U
4 s; Z7 n5 B8 |( k0 M& Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" l3 }/ Z( h+ s3 D' K
. N8 u N) U3 Y/ u
: ~( M. I3 |& J% M R4 P: H
1 `, W2 U" Y9 P, y1 x" Z1 G( L0 a
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4