嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ X" B7 v: g( Y/ y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ x# t9 a6 C" l0 [( j6 C4 j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, C; _5 N6 F/ S& E" s  U' f% J% |2 ~9 ]& O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 ]4 o, t4 q* T4 _9 \- U$ x# _6 W9 y+ f; {) \

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 }) o5 E- J. g; E+ ~% w, Z
/*
: A- s) W1 x9 p' D. d* Check memory range for valid RAM. A simple memory test determines! d, V7 W; p) V
* the actually available RAM size between addresses `base' and8 ]( d, {7 ?- K" o+ \- W3 _- L
* `base + maxsize'.
5 K, Q6 G" _8 l2 R*/
1 \, y6 j& K1 u. Q; z6 Q2 Along get_ram_size(long *base, long maxsize), d8 }6 B6 z/ |8 H6 f
{; Q$ Y4 z* C: ^+ @" f7 ^
        volatile long *addr;
/ u3 c, q* |. _$ x7 V. x# Z/ w        long           save[32];$ \9 T. r9 c' B- X7 u0 o0 {. E
        long           cnt;$ }, K5 P% a' V" `" z
        long           val;* B; w5 c0 V' p; R7 t
        long           size;
1 i7 W$ u0 T/ ~+ z        int            i = 0;4 Q, n$ ~. r& l% s6 Q. z' ~

) s  l# G1 W3 B# }        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) v! G3 ~$ J  F+ P. {% j7 n
                addr = base + cnt;        /* pointer arith! */7 z% v. A' g  r, a
                sync ();! E! E8 H. M' I+ _4 p0 u
                save[i++] = *addr;
5 z& r5 T+ K! `3 k& P. M                sync ();
& X% |8 g+ `  m3 Q' t& U4 j6 @                *addr = ~cnt;  @3 B2 l; s! Y% \, V8 E
        }+ f) j6 M# h& T( A
0 Z- a1 o4 M0 n+ [  J* g4 Z7 S
        addr = base;
9 o2 O7 g8 S. ]% n( s  {5 f! @) H        sync ();
- W: H( E- a. G2 k; O        save = *addr;
4 e, v' ?8 o. Z4 ], K/ D        sync ();( I* W& N" r7 ~1 W4 |5 K7 m
        *addr = 0;
$ T( w! m* [; I8 _2 `0 X, x4 ~& G9 I! R3 Z
        sync ();
& u) f; Q! y8 i6 @2 y        if ((val = *addr) != 0) {
: s1 B& |5 @- h5 X6 O                /* Restore the original data before leaving the function.
0 z0 A% f6 O0 X! L5 {: h  X9 ]                 */
/ D: R3 e9 E5 Q& }" o                sync ();0 {3 v' m, d" y/ p6 Q
                *addr = save;) e% p" ~/ ~6 X! T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 k; ]3 u- C, y1 q5 L                        addr  = base + cnt;
/ K+ {' k0 E% W/ Q$ Z                        sync ();" f: ]6 b7 O6 ]& b1 d
                        *addr = save[--i];9 @% r/ P6 J9 T! G7 g% }. Z
                }* W) Z6 u6 F# B; ]* `7 r# ~. Q
                return (0);
  t' ~3 f% l9 Q$ `3 Y! Y/ p& P# W        }) V1 b3 e( v; |/ D

2 L3 h3 G6 b- j5 b( n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D) o! k' i* z* \                addr = base + cnt;        /* pointer arith! */
. P, j* O8 @0 Y) p( L' N* X+ D                val = *addr;
: {) r: f7 d3 @! x* B                *addr = save[--i];
! @/ t: R- ~* H* w3 M; B                if (val != ~cnt) {
9 f9 X2 {: x8 M6 T2 t                        size = cnt * sizeof (long);: P. o* j# l+ Z% K
                        /* Restore the original data before leaving the function.
' Z* C. h  m. X6 h8 O                         */
2 }* E4 O, ~  g* i$ S9 ]# j                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ J1 s7 g  F  h                                addr  = base + cnt;* o% j% Y7 `# e
                                *addr = save[--i];
7 B+ C' J3 d0 H# u# J5 ?9 C( c+ X6 J0 L                        }
9 R" T& k0 E' N, Q) z: u: E) S2 u                        return (size);' ]" U" D2 q3 W; ]' o# q# Z* H$ A8 c
                }
# Y( K+ ~% ~4 m: S        }
, H5 Q' Z7 c1 D! ~. q* ~  y- c( Q2 C8 u
        return (maxsize);) ~& @# o: @7 a' b" y
}
0 I, ?8 {. g5 a* Lint dram_init(void)5 V- x1 K. U6 U2 j% S" C7 c/ i
{% d) I* C# ~) D2 ~4 g/ R( n
        /* dram_init must store complete ramsize in gd->ram_size */
- ~0 K" a% o8 Y1 n0 Q$ v( @3 m        gd->ram_size = get_ram_size(
9 {( {% C% c6 c& @  b5 x                        (void *)CONFIG_SYS_SDRAM_BASE,( H! \& I* q- Y. [
                        CONFIG_MAX_RAM_BANK_SIZE);
/ a6 x6 X2 A6 [, {* Q: x        return 0;
9 U( D/ D) {- h7 g0 \}
3 Z6 d+ v' i6 G5 |& R7 }5 b6 C1 z5 m) |6 S1 V

; L. W6 F/ P* L: P8 ~
7 z0 x0 H  F! Y3 y5 g
7 J$ ]7 V. G* bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 B+ l! m9 C* T: A6 `* [/ k

# Y1 E) D" m- S4 T- |/ z8 g3 @2 K  s4 G! y

8 x1 Z' L9 p, F/ ^+ N2 H: Q. w; O4 ^9 z




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4