嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 I$ ]2 y1 U- N% A4 @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ j+ ]" }0 S: U* c% {5 q3 E9 }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# C- U3 z* s( j0 q, L/ b
" N: j0 k" j  a+ Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( }( g/ t( v+ D  }  J# Q7 t+ o7 _+ ]( R* _5 E; b  F

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 z( a+ P" j/ [4 M& ~/*
" k& W8 e$ v- i  M; G9 }1 U* Check memory range for valid RAM. A simple memory test determines
* p# L' ]5 e. ]( e! \8 k0 F* the actually available RAM size between addresses `base' and
7 ^9 g2 f4 o9 @/ K1 S* `base + maxsize'.
- R1 h4 m$ Q! I# e8 n8 r( J5 Q*/
$ [- ?) p8 w& C$ Q9 R# d% b! |0 Llong get_ram_size(long *base, long maxsize)
- r$ p0 H& f% f) U, {{3 a' L& }' P" B9 [  y+ p
        volatile long *addr;+ `9 T: ^( m) n- Z+ L3 S
        long           save[32];9 x3 @; _  c1 a$ K
        long           cnt;
$ B- f5 M/ ?' E" y0 b' I5 R* l+ a        long           val;
( w. E& {/ ?, \) g# e* W        long           size;* x( e7 v! R' n* Q) N2 X4 o. d' s' o
        int            i = 0;1 h0 H. s8 |; ]. {) j

  ^' \6 Q' f0 X( o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: R$ a  a; k: b* `, W
                addr = base + cnt;        /* pointer arith! */# B" L( L" ~9 W2 H8 k+ S
                sync ();
) p: C  p* o% ^; e; L8 z) K" f                save[i++] = *addr;: R4 w- `2 R' @9 w/ l
                sync ();
+ w; V" R- n  i4 J% s                *addr = ~cnt;
" U  x% A0 n, x0 O        }9 p( K9 m0 K( s" I
& A1 j6 I7 u; @6 r
        addr = base;/ V$ {; z1 @7 S$ ^
        sync ();
* ]3 A. N; G3 r- @        save = *addr;$ _$ W% j# v3 }' p
        sync ();
% u& D5 o8 w  j4 l& G        *addr = 0;
( i6 Q$ {! O) p$ \
5 r3 t  D; ^8 _6 o3 x, G        sync ();6 m: I7 D! u# R. }5 V3 [4 |. o
        if ((val = *addr) != 0) {9 m1 p0 ]9 b$ T5 {1 p' |
                /* Restore the original data before leaving the function.
( e: f% Y+ p! ~/ O0 X) [                 */
. e& N+ y# `, H7 v                sync ();$ v. D7 v: J* u6 C5 L( j" S/ h
                *addr = save;4 x7 t; o4 m: q# u( x" @: F* l. O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 ]8 R- e  u' v9 i6 N8 Y: n3 U' {
                        addr  = base + cnt;
" m/ M: w: ~+ {, J' b0 i2 Y: Z7 W8 U                        sync ();9 t3 e" ~6 N7 _
                        *addr = save[--i];5 {- ?+ J9 I0 D( d0 q* n
                }. p) g& q5 @9 H4 {# B8 ]2 s! R
                return (0);/ ^) k# o' |. g
        }( s1 m/ Q6 v- @3 v: {2 J
, S. M% \$ Q9 t$ d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% D3 W1 M( a2 j. Y" S! U                addr = base + cnt;        /* pointer arith! */
/ ]% f4 i/ _. o7 O+ V                val = *addr;3 T' k7 A" u' M* `7 @
                *addr = save[--i];
4 W* B: r5 I) o' p. n' _                if (val != ~cnt) {5 E( B/ X  L* p1 M$ ]  m5 D
                        size = cnt * sizeof (long);
5 |& a3 w/ j- V% ~% R/ B                        /* Restore the original data before leaving the function.: ?# p) L. V: {( H9 R7 D9 y+ q! @
                         */# E( h. w: k& w( U4 C
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% u- n+ \. R+ S$ i" |6 c. x                                addr  = base + cnt;8 c2 O# D5 t. l  r. D9 ]5 R! t
                                *addr = save[--i];
) S3 l$ u  ~  k) I5 p0 V                        }0 z: [  k/ Q! y' T$ F& l
                        return (size);
  |. A2 Z/ }9 g) h, J! ]' O& h1 ^                }
  h3 J! R" s( W' a4 A; W# K        }
4 M8 Y, I3 Y5 h& _& H5 A; c0 l9 D! K7 W
        return (maxsize);
' M1 I( z( [2 h+ q  ^}
- [! [& S2 `. I0 e+ tint dram_init(void)" m. w7 h7 |5 C( j. D
{; v1 W6 X6 {3 g) y6 W
        /* dram_init must store complete ramsize in gd->ram_size */
: E) X6 u9 d8 E6 r        gd->ram_size = get_ram_size(
" k5 Z3 Y# f! A                        (void *)CONFIG_SYS_SDRAM_BASE,8 j7 v; v+ K* e* `' Y" ^; U
                        CONFIG_MAX_RAM_BANK_SIZE);
8 @: O+ B  z% i, m$ ?1 r/ i        return 0;* R. Z3 W; c8 Y4 s; O# X
}. E, G2 L4 _; p8 G8 G; O
- }  A1 j4 p$ a, H  x; Z

( r, S5 K: [# ?$ D/ T3 @9 I- \0 ?3 ^) U  a$ {9 b4 S6 v2 m* d
) b( K& R4 H( o0 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% Y- }& ~# c8 I/ R7 V' s
& u" H7 z3 z- Q
1 y5 q$ Q  T( }- S5 ^, s' d
* l: h) H" E6 A3 R3 q0 V





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