嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; m8 ?* U% D1 d核心板2:DDR2 256M Byte   NAND FLASH 8G bit( F8 E* o+ R: D9 V! Y# t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 L( K) V0 M7 ^( Y" Q* t% p1 @7 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; G* z* b/ z  Z& D& U/ q( b  Q5 o4 p9 s! X4 W% c

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% @' ]2 Q% C' x3 R$ X; f
/*3 A2 d0 i0 Q0 Q8 s  N+ ?3 s
* Check memory range for valid RAM. A simple memory test determines/ j: X# O# s7 n# i; M
* the actually available RAM size between addresses `base' and
- R  d8 ^3 [" S$ Q2 W* `base + maxsize'.
1 q$ ^; A+ w% \7 b9 k1 `*/
8 z+ G: c9 p$ Y! m$ Z4 @) \long get_ram_size(long *base, long maxsize)! f5 b8 O  A6 O2 Y4 c
{% o4 Z, b% I. m$ S3 D# @* t+ A
        volatile long *addr;
# @7 R6 |. G" A  D7 y* }, D( t        long           save[32];5 h3 @  u9 ^5 a' |3 D) z$ n
        long           cnt;
3 b7 n( z1 F1 a        long           val;
0 t# ^! F- @4 j5 B! S        long           size;
( e6 ?6 e5 ]! `$ v& s1 J' C3 t        int            i = 0;+ y& p, d4 Z4 {2 Q

; ~. I9 `, j4 h3 T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, ]! s8 O5 ~7 S  @& q
                addr = base + cnt;        /* pointer arith! */) `$ D3 W# I" E2 r0 n
                sync ();
' ^( @" t: E  t: E, G                save[i++] = *addr;% I% F  D; Z) G* _$ s) J
                sync ();
  \% B" a/ ?/ M" `                *addr = ~cnt;
- |; y# g3 K/ J/ Z; |        }1 L9 k+ |$ ~" p4 r( ~

* K, U) `# q  M* W1 U* `+ l        addr = base;6 h  A. J2 Q3 F5 g0 k3 R. u
        sync ();9 d% p' w- V: w- o0 x
        save = *addr;' m/ U0 r( ?9 P" e
        sync ();
- }3 u  B* o& K) t3 W        *addr = 0;
8 ^/ \. g9 o9 E# h7 F* B7 g- B0 _, o0 X  _
        sync ();
$ N2 t; [9 f( w8 E5 [; s        if ((val = *addr) != 0) {% z  }1 e' Z: O9 \" d1 k1 f
                /* Restore the original data before leaving the function.4 Y8 q  Y9 a" m0 ?, l
                 */- R3 H5 _' a5 A3 X
                sync ();& ~( N8 q. g2 z
                *addr = save;: l* W* v, e7 T7 P  C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ a/ q$ d* B. k4 W2 d! k+ a
                        addr  = base + cnt;$ A+ _5 k6 J  D. V8 q& H! C
                        sync ();; i9 q6 K9 A' L& Q
                        *addr = save[--i];
2 N( @* D* \1 [1 z                }1 G& C' O: Y- X9 u' R$ i) J1 e# l
                return (0);
, c' w( F/ p; k, M* K) p        }) p. o# r; a4 ?
4 L8 x- A' T" J' F9 J2 R1 ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" ^; ]- F1 ?7 _1 Z2 [                addr = base + cnt;        /* pointer arith! */
( U) ]5 S0 X6 D& l                val = *addr;6 E+ j6 b" W4 l7 |& C% c
                *addr = save[--i];
; I: |3 E% o: }5 g1 u                if (val != ~cnt) {
& u' ]6 D! h5 [                        size = cnt * sizeof (long);' P/ {( w- ~' Z9 Q( m
                        /* Restore the original data before leaving the function.; i9 [9 I5 E$ R4 J7 b
                         *// m3 q2 _+ v3 P& q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 Z+ w: P, H  ?" z! L
                                addr  = base + cnt;3 v5 K# e1 ]6 v
                                *addr = save[--i];
5 g9 Y7 o# Y7 I! {9 l                        }
8 f+ y( W* I- a- R2 W% ~  M9 r                        return (size);" o- Z8 g' @4 g4 U/ @4 e4 X& h: M% }
                }
3 G; X8 _8 R) y+ p( t+ x        }
6 w3 q2 F, z5 {9 A& _9 l, c$ p" B& `, m3 z
        return (maxsize);
7 U$ n7 t! y1 r% d- z: J# ?* h$ s}! Y/ ~& D/ n9 g1 W
int dram_init(void)
% z4 P6 y, u  ]6 r3 P7 p{* T7 Y$ {" Q9 X
        /* dram_init must store complete ramsize in gd->ram_size */; p- u2 r: u1 Y- P. E3 @, @& E6 B
        gd->ram_size = get_ram_size(
+ e: W0 y  Z: |                        (void *)CONFIG_SYS_SDRAM_BASE,5 j/ P7 c; I9 H- r
                        CONFIG_MAX_RAM_BANK_SIZE);+ p% s4 I/ G% Y5 F& r. y6 Z: ~0 b
        return 0;
3 s: a0 A8 }  R}3 H6 N$ n3 C2 U* k6 }
. E% s8 q, Y) B
7 k  k) o, Z, t4 B

9 U/ S" n* i2 R9 a; v! J. ?7 c% f! k, o! Y3 t6 }& Q+ D2 I& n" X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, e, e2 \8 q9 M6 W- Y6 T6 x5 |+ ~' R) Z$ _+ r

: p2 r% c7 M$ u& h. M

7 a, ?0 C. s" S: D




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