嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ U0 P9 u$ _( l3 h9 |8 O& k核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 d' |  {5 p, E/ H' `$ f这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, E; x1 e! ?/ |
  {$ I$ [3 A0 Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* o; Q6 d9 ^0 @
2 Y) d& l4 x# T- p' Y6 s) s2 z  @: S

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- z. ~+ v! d7 ~4 B
/*+ g6 r1 c" u0 {. A1 q% l
* Check memory range for valid RAM. A simple memory test determines
: h# H0 H. O8 r% u' z) t2 X" t* the actually available RAM size between addresses `base' and
% \& }' G: d4 h! G1 K6 W. j6 |* `base + maxsize'.
! V& ^( r; |8 A$ ?; @1 b, Q6 J7 t*/8 L; J) Z" ~$ s& Q
long get_ram_size(long *base, long maxsize)' G+ p. g3 A7 \* j6 O# i
{+ J. j& T/ F: A6 b
        volatile long *addr;  j3 ?- G8 Z3 a3 w5 H1 A7 y
        long           save[32];5 a8 u5 h! O9 u& x7 y
        long           cnt;6 Q3 Y! O8 [) I- r6 y
        long           val;* [$ ~3 j; S- }# G( w1 x
        long           size;
6 R. H% G, ~  R+ I; D! w+ G, N        int            i = 0;
8 i% K; ?: ?& E7 v- x3 n% w( ?5 m2 P, Z
1 J' ~$ {; R+ O/ k        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 u* ~7 H. E4 z  Q0 s, C% O4 _+ K' Z5 K                addr = base + cnt;        /* pointer arith! */9 @9 G, G# a5 s) T/ m% {8 C9 C
                sync ();
# ^5 a4 t% e, T6 L4 u                save[i++] = *addr;
% R9 x: @$ A4 W- x                sync ();  G: \( X  X, P6 Y
                *addr = ~cnt;7 x4 `; `' Z, q* [, O, U4 j. L
        }
2 a( ~1 l/ h' d
+ M; M) T) c! J! T1 p! C4 @/ Z9 n        addr = base;
; p* `+ P: \4 v0 H- V8 ]/ R        sync ();, p# w5 q/ A2 i8 s/ H: Y" \
        save = *addr;
- ]9 f. c2 p) d2 \4 X) L        sync ();( h6 W/ p+ h/ e; I; b
        *addr = 0;1 J* c3 n. \' ?9 N& Q
. u) r+ _9 ?$ B$ [( A* M
        sync ();  l$ w) I% H: v6 U. O( Y, Y- g
        if ((val = *addr) != 0) {
3 g% B' l2 E3 c: P  E* a                /* Restore the original data before leaving the function.
1 w, W$ W, g. [" ?                 */7 O5 |  W" c1 U
                sync ();/ u- e8 ?5 H! ?; M, W
                *addr = save;% o2 X9 q/ W' f/ W4 X9 ^
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# P  i- Q# q( K- m) D) S) r                        addr  = base + cnt;
  |0 `2 E: W( a# J1 K                        sync ();. z" O/ d" k" }) n
                        *addr = save[--i];( n. z: [5 q, V0 t
                }& \5 L9 s. _- O3 ~7 ^
                return (0);
' r0 B4 s; Y3 b5 N# q; o        }
# s* l  }- I7 x7 }7 t# x) h
  H( A/ ~# B( b/ A. i: K( Y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 w7 i0 c' A% q  Y  G/ I                addr = base + cnt;        /* pointer arith! */
. M, G% x; x; I                val = *addr;1 R# I3 _3 Y; V/ m! T3 P3 H: `
                *addr = save[--i];+ M: y6 w$ X6 f, D4 g
                if (val != ~cnt) {
8 h7 L: p' I& c( R  `5 R, P; o& Q) W  L/ f                        size = cnt * sizeof (long);
% J6 Q( t: `/ b) B' T! ^) n                        /* Restore the original data before leaving the function.
0 z. `% S: k$ \' S* p0 A                         */
! B! R$ C4 Q! `. u0 n/ p! B" f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 O5 Z7 [0 h4 V
                                addr  = base + cnt;/ q- g. ?9 L. }
                                *addr = save[--i];* p1 ~) Y9 |- y& }1 T1 d
                        }- u! W; v+ u% o9 P
                        return (size);
. ^4 b) x% O0 G5 s2 q' \, |                }
3 y  a% M) W6 Q        }
) X/ t4 Z3 T4 @/ _* C5 I4 k  H
' x& ?7 R& n4 F* R: p        return (maxsize);
1 V) H& y! f. h7 ]2 ?0 N! O}
0 a( j& u+ w1 A8 R2 }+ B1 \! Oint dram_init(void), Z7 X4 Q5 V/ ]; B* o
{
3 r7 \9 r2 ?! t( i3 e( |7 t& n        /* dram_init must store complete ramsize in gd->ram_size */: J) e' q/ O) s+ m7 p" p7 A3 E
        gd->ram_size = get_ram_size(' V( Z) o" j% k# l
                        (void *)CONFIG_SYS_SDRAM_BASE,- p' U* P! `; E/ l5 m
                        CONFIG_MAX_RAM_BANK_SIZE);* V  Q/ S& @) b- h5 k+ o
        return 0;+ x+ M+ Z' s6 ~7 X$ s+ b5 o
}
3 I: d7 ]/ j0 ^
# P1 D4 v& v3 |! H! E
7 `  y" s% {5 [; E9 e; O7 k8 G* w$ e
3 G) |2 k8 B* Z6 z+ a4 [, W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. @/ U3 w: t1 Y* H  u3 [

. x8 s5 W4 w/ t: D$ y, W# G, ^2 p5 f) s

3 C3 g# v# i( S& t




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