嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, r" [/ Z0 x5 q核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: l. o& ]/ E' _$ d  U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 f, @4 }0 R* b2 X% V$ k

  M( x' M3 @' B* |  P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 l" F/ C( D9 @+ m- `" T& |+ j, v
6 C$ S. L4 A6 x5 ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 s9 y4 W+ J5 h
/*3 \# v3 {5 L3 ?. \# k  E5 Y& m
* Check memory range for valid RAM. A simple memory test determines
, T; b; `6 u1 c8 F* the actually available RAM size between addresses `base' and
- ~! a, O, r$ O4 d" l+ _4 V* `base + maxsize'." P# |. r& q( |" [* R) _8 M
*/3 {; Y) y1 i- d: T8 o: u. N
long get_ram_size(long *base, long maxsize)2 x' _9 o& e2 j9 u, e: R8 A( B5 N
{
5 e# T6 E$ ]9 ]3 i* s  I& k. ?        volatile long *addr;
$ o2 _' [( ]- N        long           save[32];- f+ B0 @/ q% ~* h6 c
        long           cnt;
8 F1 Y( l1 f/ k/ P        long           val;
) w: H. N( ?) J( o5 `. D( P& I        long           size;
" q2 b6 W# f9 r7 Z- e# V        int            i = 0;
) I6 {. J  ^1 v% W( l! A* R
, b8 ~. D! ?# }/ C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  y3 t/ g2 T% T% x& e2 U& W                addr = base + cnt;        /* pointer arith! */
0 f0 z" |/ Z! j! ^                sync ();
  ]3 c, c/ g2 j2 h/ M& E: b                save[i++] = *addr;3 J1 [' t% D) v; O1 j& a5 M/ |
                sync ();. L4 D6 p& o, J; X6 s8 N
                *addr = ~cnt;* d0 T; f; m2 w* B9 e9 l
        }
8 m9 @/ n3 l1 W7 h3 r7 G" W6 Y0 H: ?- d( G9 L& l
        addr = base;
8 y9 p' Y0 {2 Z        sync ();
% c- ^6 h. u$ m8 D0 k1 M" L" b0 |! z8 i        save = *addr;) n" U7 U3 D0 X  q9 ]5 t
        sync ();
' D4 R5 A, Y" O        *addr = 0;% B8 w. d9 G+ Y, b' {

3 }/ I2 a. Y6 C9 b        sync ();
$ x& C! b4 h" |: p        if ((val = *addr) != 0) {
# K( y3 L1 A- J, A5 N( e! s                /* Restore the original data before leaving the function.
( _/ I! i; t, d- i0 T; z4 Y* N                 */
; R$ J3 }. K: V. V+ G" [+ C  [5 D9 ~                sync ();
) g8 {, @% ^2 d                *addr = save;
( `7 ~' s7 Z: B2 ?' K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; i0 k$ f, J  T3 e) h
                        addr  = base + cnt;
9 f( e6 E0 T/ w0 o( o7 p  e                        sync ();* N9 l5 K  f- ^* W( t5 @
                        *addr = save[--i];7 t2 A& T1 V7 I  D8 h5 N  [
                }
& m) \2 o/ O- x  z6 }$ ]* J( o8 ]2 m                return (0);3 q! W3 `8 Q, c2 G+ p0 N! W7 p
        }
( `3 \3 O1 P3 S: v/ U3 b$ H( X7 d4 F7 F  `9 w$ {+ P, E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- r; x( T) b, ^4 ^4 [                addr = base + cnt;        /* pointer arith! */  F# T' Q( m( U# N( y, f) F$ ]& ?8 h
                val = *addr;
4 A: T  B5 d! A( p% }                *addr = save[--i];: d  a; U" v1 Q* x: _1 _+ o
                if (val != ~cnt) {
( D8 C" x3 X% m# y                        size = cnt * sizeof (long);
8 J# S) S- Q! I  c1 p& |% X' M                        /* Restore the original data before leaving the function.
: |0 W+ Y, n* U2 U) D                         */
" T3 o" m: x9 ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( T' B. o: ^" P$ d. D3 E; |' c0 p
                                addr  = base + cnt;; l( h' _# c9 a& r7 M
                                *addr = save[--i];
7 q5 G  E% B+ O6 w( r                        }" d2 M" N# Q3 m0 S) c
                        return (size);& \$ _" F6 K2 s1 n9 J
                }& ?2 ]+ b6 J. c7 Z  h5 n
        }" u$ T, I4 E3 z
, L! ~7 R  R. J
        return (maxsize);
% o9 D8 m3 x/ \* o1 A}& i/ C% b7 b& j0 R! U# g& J1 w
int dram_init(void)+ U/ c2 h4 c' J- E& ]4 V
{' v' ?# m. X2 P/ y
        /* dram_init must store complete ramsize in gd->ram_size */
, H& x, s" E" G# D0 Y0 W$ t5 u        gd->ram_size = get_ram_size(
3 S/ a# L9 ?4 ?                        (void *)CONFIG_SYS_SDRAM_BASE,
( G1 p# a. r9 |- ^0 L2 R2 Z                        CONFIG_MAX_RAM_BANK_SIZE);- |+ D+ A+ Y4 r# `% c( f
        return 0;
# _2 R" M4 j: z2 D/ N! q8 |" U3 f}
8 |) T, T  X3 W  P( M
1 ^! H: K* T% I# Q+ ^7 Q$ f6 f& J4 b. v$ b. x& ]
. g$ B4 |8 h  l' R
+ f$ U9 l+ b. |! r7 l7 ?5 u3 B4 W* `! l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( L8 d* E- A# j& o! ~+ \) P' ?( {
# ?# Q1 `( p9 d; U

( L: C. q& o/ K  C- h

: W" h5 n+ ]/ q* \3 w- j. P




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