嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 U" e1 C0 ^4 ]3 r" Y2 T核心板2:DDR2 256M Byte   NAND FLASH 8G bit; _1 H( _# U+ w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 v! {7 Z1 a& d& @. _% M* K

1 P2 Z1 @0 h1 j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ V  l0 g/ p& ]; p$ X* B
4 H* G( o- s0 ]8 k/ k

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. Q' `% B! h( [* X
/*0 h& Y4 r& g/ k7 v  s
* Check memory range for valid RAM. A simple memory test determines
. |4 ]; @5 Q5 Z* the actually available RAM size between addresses `base' and3 S/ A  S0 d( v  K' r: b: I
* `base + maxsize'.' }  C& p( Z. d+ ~' a+ }+ _6 r" X1 o1 d
*/0 H+ X# g- `* V% L4 y; q
long get_ram_size(long *base, long maxsize)
8 T" |- A' r- j! E/ J{
# R% p4 k$ k2 y7 n& N( v0 @        volatile long *addr;
0 Y+ u* n7 f7 W        long           save[32];" @$ Q9 ^7 r1 v( b! M# \& R
        long           cnt;7 v- a* K: O( R) k, {, o! k4 j* R
        long           val;, e- V2 G* c; d; N+ G2 s  A
        long           size;
5 ^: r6 U! s3 E  h) O1 |; h; M2 j4 o        int            i = 0;' J: h  `2 h+ V

1 _! T& e8 y; H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 V. x5 Y5 j1 s: H
                addr = base + cnt;        /* pointer arith! */
3 u, E2 Y2 Y  R8 [( z( ]- [                sync ();
& o! K3 [( L/ L# V                save[i++] = *addr;6 l( b) }. ~. A- |: ^0 L* y( K
                sync ();% M/ ?9 C, n6 C# Q+ J
                *addr = ~cnt;2 d5 s4 b; F7 U+ Z8 G1 {
        }6 k# M1 D2 |- z0 Z- O1 H  k
4 ]. h( m& b% o% I
        addr = base;
7 [: [; E7 s6 S' H- U; _) i        sync ();
: C% H$ q# \2 W; G- K8 A        save = *addr;7 X* X4 b' e( d7 h. I1 t! r
        sync ();$ d& S/ [" d% P/ Q
        *addr = 0;2 ^  k1 x7 k) ?2 p0 S# K; O8 H
2 o: V! [7 P3 @8 t
        sync ();
& D% ?# \+ A3 ]4 a; y        if ((val = *addr) != 0) {
* u) K# e; M1 X) F9 o9 \4 X                /* Restore the original data before leaving the function.
2 W# z# I% j; N0 b) y/ |; x# a; q- U                 */
5 {2 p4 X6 z! I                sync ();+ s* e8 v, T; r- D
                *addr = save;# @+ V+ Q- @, I% x$ Q6 I0 I& a: v- O' l* r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, M1 K, `# E5 C2 m( S6 X                        addr  = base + cnt;
. C; s4 r- `$ Y  h  C' ^                        sync ();# Y; E! @8 ?, a8 i5 j. p
                        *addr = save[--i];
7 y+ _) g, L& ?& f/ j: K; v                }5 n" Z( _( g; @' ]2 ?$ I$ h- Q/ [
                return (0);+ d' i/ p2 q2 |8 @  K
        }
: }9 i1 {/ d# v# d9 j
8 m7 J/ J; o: h1 Y( H% X# ~        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) m- e, Y& O+ i, Y: P9 I  ~
                addr = base + cnt;        /* pointer arith! */
0 Q- H$ d/ u; j! E                val = *addr;# i3 H3 E! E/ R
                *addr = save[--i];
# g. v9 G$ K6 K  j* F, l, S                if (val != ~cnt) {2 _. a( |, }9 P5 Q2 |1 x! k
                        size = cnt * sizeof (long);) W8 e8 c' r6 |9 |- U" v
                        /* Restore the original data before leaving the function.
! e" s$ g* @$ S4 v7 o: L9 \+ a                         */' \5 v% e1 U0 [: A* ~- S1 v6 B! k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 j2 d1 {4 M  ^5 J$ x# N- f7 ?
                                addr  = base + cnt;3 B" }; I3 Z3 E3 P, N- E
                                *addr = save[--i];
6 i$ r) u4 p" y, ]2 F$ U1 ~& N& B                        }4 \7 x) [, V9 ]; ]: v
                        return (size);, ^# Q+ [0 v/ X
                }$ Z' @: }/ m$ b, E% U7 S
        }
9 V  F! n) g1 _) U1 m# M* J# M& ^2 g8 k& Y2 _2 R* N
        return (maxsize);
. b/ _. A3 H$ V# b}6 U1 M4 M& @, F6 e! S: A, G5 N- B
int dram_init(void)
+ s# e5 i1 J( S3 ]: t{3 U/ ]& h, P6 A' O0 C
        /* dram_init must store complete ramsize in gd->ram_size */
  V6 D: S' M9 u# b) S        gd->ram_size = get_ram_size(
$ h6 q7 \7 j: Z: a# t                        (void *)CONFIG_SYS_SDRAM_BASE,
0 {7 o8 I5 q& v. Z4 }                        CONFIG_MAX_RAM_BANK_SIZE);
$ ]; \$ p, p# J; O, b7 \' V        return 0;
0 Q- g( |% k6 C, I}
# Y1 E7 r2 j8 I
( U9 _, p' y9 t7 t) M. H* }( f" q1 q
  Q) o) i" ]3 U1 j. r  g/ E, c) P9 ]% m
% N2 Y5 K$ k* S! G' f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- T+ K0 `1 ~8 R& z
' B* D" V3 C% V' L( v

% \$ z) j: B3 t9 Q
* d- d; E, O! ?& u





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