嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! Y, w+ D% h" a; p6 j. s7 g核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 a, |0 y! V2 U/ O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. Y- i! j: |  L  }# Q
# i' K5 D9 E1 n3 X, c- ?是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! `% a( G: Q5 `; `
3 ?$ r, Q/ n3 ^  B2 Z9 ~: M: n3 {0 _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, \9 I, g9 n1 g0 x( G$ _+ ^% s
/*
: R% M% K6 _& \& @2 n6 ^: l% Z* Check memory range for valid RAM. A simple memory test determines$ h3 f& g5 l, e5 o
* the actually available RAM size between addresses `base' and. @' f& t' y0 R" Z2 w9 x
* `base + maxsize'.
  @& z1 k# t+ _% k*/* m3 h- g+ d3 x6 }9 d
long get_ram_size(long *base, long maxsize)
3 h7 h  i) \0 s2 M- |% v{: F0 v6 d* F8 U1 w5 f
        volatile long *addr;
! ~  L* g& c3 T4 ~        long           save[32];
% Z4 A+ O# r" N9 A: Z4 Z        long           cnt;
3 J, q5 q: |5 i& ~& W) ?        long           val;; W+ r, |% A# a- b% K3 ]! i3 y
        long           size;( ]- D+ u( e6 ?7 `3 G
        int            i = 0;5 \6 f% H1 ^% Z4 t3 }
. r5 ]  ~* |7 D3 e! H) J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 k0 t+ O% h- F( {* z
                addr = base + cnt;        /* pointer arith! */  @. S: H: {5 ~# @3 w
                sync ();( @  C) k& V  v. q  P& A
                save[i++] = *addr;/ J0 a1 M2 l# H# C6 S! w2 [6 X
                sync ();
) n# R8 l' O6 L9 R                *addr = ~cnt;9 @* }7 w# k7 \# R# s
        }
/ \8 [% w. C( D% o7 k! r' ?$ D* Y3 `/ U! f
        addr = base;
0 ^4 E+ B% y" X  {        sync ();1 p/ d* A" |+ M0 D# b( B- G
        save = *addr;
. v, d( I" O, N5 j+ g; t        sync ();' w. O; N& M  C8 Z
        *addr = 0;
" u* _. n' l& r* E0 z: _$ f$ Y6 M  F& s6 {$ s1 l# U
        sync ();
. r7 }) q, V5 {3 P/ D        if ((val = *addr) != 0) {; }6 y' o* f: \8 h: c
                /* Restore the original data before leaving the function.' L( P$ L3 g+ m* c" y% J
                 */
6 c2 S. \; `% z+ H8 G+ j                sync ();
* p* `8 T" R6 k2 I2 j                *addr = save;
. K4 z: m2 t6 W* c' G4 R                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( q$ V3 ^  C7 @/ y9 C5 o                        addr  = base + cnt;
, n! p0 C/ {3 {' j0 F/ K  r                        sync ();
+ e( }' s7 c+ Z8 n& U                        *addr = save[--i];, S  V: m8 x! d& z0 Z
                }
/ Y1 [8 K" B% Q. h3 ~                return (0);8 f: O  L: X# _0 G( E
        }6 L1 f+ [0 {, K5 n/ ~
/ a) n+ m% o7 n1 X* S% x* J
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' _8 }6 b( [7 p8 Z, p                addr = base + cnt;        /* pointer arith! */
! T% R( z8 {) h" c8 B                val = *addr;
' ^6 v* j8 p/ Z1 z7 d7 i                *addr = save[--i];
4 {/ T, f" H- i1 n# r$ u                if (val != ~cnt) {* u9 `; i5 B& l0 K  c
                        size = cnt * sizeof (long);. D5 k1 G8 ^2 a- D
                        /* Restore the original data before leaving the function.
4 U, a0 ~! i5 I( H+ V( _1 C                         */6 \' M8 v0 x) I) M: Y* ~$ y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- K/ X8 L+ U/ t
                                addr  = base + cnt;' B& ]7 n3 _/ x' }* O
                                *addr = save[--i];
1 E8 n0 J8 D6 g/ O                        }
+ p3 ^; H; v7 y$ w# N$ t                        return (size);; x2 A' E- Z2 h  X+ e
                }% D# t# B5 Z- B% B7 f4 ?: o
        }; w# @0 B) M- \2 T& n" Z- F- x8 u

" Q; R' v. n# ^4 d9 K        return (maxsize);
* W& g, m6 P+ E8 w$ h}: W. }2 Z1 J- C; p" i/ _# k2 G
int dram_init(void)
" I( m0 I. L5 U+ v{- X3 j; W" H6 d2 K
        /* dram_init must store complete ramsize in gd->ram_size */
8 \/ _& C' |, `' D        gd->ram_size = get_ram_size(
3 V! k8 y/ e* \- i4 l' R                        (void *)CONFIG_SYS_SDRAM_BASE,
( L: q( G& q: O6 X+ B2 T                        CONFIG_MAX_RAM_BANK_SIZE);* r. }+ y1 O0 V: g5 g' v! T
        return 0;& G; z; u, c4 N) l( [
}
+ m9 S+ I! G* j. [7 [7 D+ _3 U/ @" c/ g
! {  A) y4 v: L  i

! m; t+ j, R" b* U0 k* a% w  C; H9 Q0 }0 K3 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  h, A% a  `! h, }* |6 H0 {

5 `  s. {2 X8 }5 d; F" Q3 J
$ M$ n6 l% c) ^  q4 k' T0 e! D5 u
* k# s, H( r+ o; {  j





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