嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& K7 e5 ^1 H# ^
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 C* s* ^* b* u; q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 \6 n" o4 W3 U2 t$ g9 q

6 o3 z% d' n: A$ W( t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, [5 R* }6 e# I2 |4 V( s
: X3 X  f  e, H6 w
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' i6 ~# q$ Z, b) q( D( h
/*& W, K# V7 N( M2 u4 N. j6 X/ d( a
* Check memory range for valid RAM. A simple memory test determines) G$ ?" O" _+ \1 j( X
* the actually available RAM size between addresses `base' and
3 N. o9 @( _2 @# q: }* `base + maxsize'.( c; }# v+ J% G
*/
  D' q+ Z+ v& t# g5 k0 Dlong get_ram_size(long *base, long maxsize)
  T$ N% P# V/ d$ S{1 B( ?5 C/ O  @
        volatile long *addr;
' }& s% \4 T9 b/ v- e( ^. N        long           save[32];
3 w. z$ m7 B; X2 w4 K        long           cnt;
, ^3 z) a: }: S  G' E% Y# ]9 ~  d        long           val;
* H" f/ W) Y+ R5 q0 o! l; t        long           size;7 S3 ~% N: s; m* C. }% O
        int            i = 0;
. A( c2 t0 ~: x% m3 ~0 v2 h4 O# e  \2 ?% N' S# I/ H5 q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 S7 U! l7 v) c6 ~0 a- k7 a
                addr = base + cnt;        /* pointer arith! */6 Y5 I& u# `: k2 u1 l* C2 |) B- P% e
                sync ();# D& P& ]3 S: \/ s" P) U
                save[i++] = *addr;0 W3 o* C! J2 w+ `
                sync ();: ~) G, g, i9 C& Y
                *addr = ~cnt;, D+ K' i  g/ B  y, H0 w
        }
6 ?, }, G( ]% {% J& d- s; r4 X5 E/ s* o) C  V
        addr = base;
4 J' K( m2 k# |: ?" \; J% J        sync ();
! ]8 M/ T# i& W" ^; S- g        save = *addr;
% |/ l, w2 e0 m" d4 H  K; ]        sync ();
2 ^# \' g9 p9 K. Z5 u- r2 i3 _        *addr = 0;* t/ r6 F. b- V9 u% q
1 \* `  h/ I. H7 p
        sync ();
/ |! N" U. `5 S        if ((val = *addr) != 0) {
8 `  j, U! A, a3 H& f* f2 T                /* Restore the original data before leaving the function." S5 T5 G! D# i' Y8 b# j8 F
                 */
- B! g/ r" G; r' d8 t                sync ();
7 [8 q- d9 w; w4 L                *addr = save;
8 w2 p1 {- I  @6 v; M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: S( D; v9 a5 u$ N* `( A; B! `" I                        addr  = base + cnt;
% {2 F0 v6 O" ]$ o0 S3 g) i                        sync ();
) l. g! |9 T* ?: M5 M/ G+ S; N                        *addr = save[--i];
' }% ^3 O* i7 I, t0 e! p, x6 g                }$ L& f. n$ ^1 [5 `* h
                return (0);/ \- Y' a3 p5 O
        }
# J) ]  H% @" {: E2 u! z0 U
1 f' }6 C4 ^5 u+ A/ P        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& C0 k& ?& J8 U/ H$ r' v$ H1 M
                addr = base + cnt;        /* pointer arith! */' n0 V' v2 y. q) H- `5 w3 l
                val = *addr;
. g6 \& r& M/ G; H& d3 C3 X9 ~                *addr = save[--i];
7 z$ J) ~* O) J" Y$ K                if (val != ~cnt) {% r3 D4 O' a# O# D
                        size = cnt * sizeof (long);
$ q, ^. D9 @1 t' W3 O( S                        /* Restore the original data before leaving the function.
( |  T7 c. U: p! d  M                         */
& X* E7 E; {, Y2 |: O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 L& D5 u' U! ^* J2 I                                addr  = base + cnt;. U- R! b3 G3 T4 ~6 T9 G% V) N
                                *addr = save[--i];* ?% O* ]3 s' C/ Q- t
                        }
% G. M2 m& W- x; j5 f                        return (size);
7 N3 v) y9 A- k* L. M! H                }. y( k$ Z- Z" x$ l
        }
( U: L/ y0 S& t  j, x$ f) ?0 o+ z  k% t) i, r
        return (maxsize);
: p1 K7 f# ]: Z6 q$ n}
1 J+ E8 p7 U4 t5 k0 {5 Fint dram_init(void). L0 B6 M4 r* ^2 a  q; n
{
1 }9 T/ R! w5 P: H! S  D1 `        /* dram_init must store complete ramsize in gd->ram_size */1 ]5 s" O. F; ?" ^. u
        gd->ram_size = get_ram_size(% v/ R) ^# @, V8 S2 `* Q
                        (void *)CONFIG_SYS_SDRAM_BASE,0 \" b8 L+ _( ?; {7 e2 s
                        CONFIG_MAX_RAM_BANK_SIZE);
$ w" N& v* f+ E' _* a        return 0;$ W9 F8 ]5 L9 K  q. \
}
: W& U- h2 B! V+ j. t  Q3 @( d# [0 S/ m# u& V. `
3 Q7 W2 {3 l5 C( Y$ a. W

' S& Y) ~  y' F) H2 O6 t2 m7 @7 S4 p8 d6 E/ F, @: ?9 j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 V. [6 ?( i. [! S  A

6 ~; V! G9 q7 A4 Z2 M* c$ Y% l
- N( V3 e/ b& C; o
( y& d7 @  Z; r/ g7 o4 {





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