嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; `! X0 w. e; ?2 H6 c
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  }% x! ^1 b% ]6 g, U! K/ h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  U. j  [# u9 C9 E  A4 ]# h
( f0 x  D2 d/ S" P( e% `+ h( p( \8 A是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 G5 l0 {$ H, R6 O3 z' O& I& m$ v: t8 z1 e0 ?6 @, C- x0 X3 p

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) }+ d% s" }. y9 W0 y1 ~6 `( m/*
' k% `5 o5 Q& \. K2 M* Check memory range for valid RAM. A simple memory test determines3 L4 R; t+ m+ i  Z) |2 l7 i
* the actually available RAM size between addresses `base' and, [5 W7 n9 k& p+ D# [& l% S) G4 E
* `base + maxsize'.
, a7 v( f! t. p  V: O; F) F*/
6 S4 u. c5 V6 O  ilong get_ram_size(long *base, long maxsize), B' h' E& b; r1 I
{5 b( ^6 Z6 u3 ~
        volatile long *addr;4 j% H6 B5 L* K4 n5 K
        long           save[32];$ H! m2 @+ x9 P# Z) `
        long           cnt;
3 _! @+ i! _. P        long           val;+ |* g! ?9 H9 G/ k1 d# c6 L
        long           size;) ~4 v1 o5 A0 {; g! a! U+ ?1 M
        int            i = 0;- B/ ^+ J$ c. H
1 M" X0 R' u, {$ C( T" b
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! }; `5 f7 l* x                addr = base + cnt;        /* pointer arith! */" X% c  [5 c( i  i8 g
                sync ();
; f! \+ V! X4 o1 Z2 u                save[i++] = *addr;
( \/ i( u! W/ \4 _" Y4 N8 Y                sync ();" Z6 w$ X$ D8 E  ~5 L& u
                *addr = ~cnt;! }& r. m; j9 |
        }9 L  N$ J+ R1 m6 U
6 V/ q" a' }7 m& R
        addr = base;& z1 ~! \- x+ y
        sync ();: Z* W1 k% w& `1 i/ n! c0 T5 f
        save = *addr;
& N0 I- A0 s. h7 F        sync ();
" e) S$ H$ H$ P* s        *addr = 0;7 H3 e& h1 S( g
) }  r4 k) Y0 H% H
        sync ();/ b/ F. i% l" ~+ j- R2 F
        if ((val = *addr) != 0) {
' j) ~( T! c3 W1 a; g1 f                /* Restore the original data before leaving the function.
) a6 N$ S3 V: `& ^                 */
- |. ~4 S; r) h8 R% T4 Q                sync ();' e2 K; o' h0 e
                *addr = save;! [) X! z* s, e0 a4 f8 W
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: L) t2 [  b& \4 e( O1 y                        addr  = base + cnt;' l/ v. I, V" y( I* g' s
                        sync ();
' R5 r( J2 f! O                        *addr = save[--i];8 @6 d. M4 K: {7 C1 V
                }
. o3 U; }/ c. d; z: l3 P                return (0);
4 o; l3 n% Z. m0 I6 i        }
' f* u2 I/ t0 }/ Q5 \# ?6 d, V; y! }& a# U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 W" I6 P+ R* d                addr = base + cnt;        /* pointer arith! */+ K; t" S7 l8 E. M3 H9 o/ W5 D' T7 v
                val = *addr;1 W1 _  E) |4 k/ h
                *addr = save[--i];# j1 g( q: W3 v/ X
                if (val != ~cnt) {% D7 J% d* N& V: j$ F
                        size = cnt * sizeof (long);
2 A- G$ m! L& F- F/ d$ {7 b, I                        /* Restore the original data before leaving the function.) w( G( a# J6 G
                         */
! u4 ~# G' @! O5 z- {1 O( T5 m                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 T, a  ]) Z; p0 b$ N8 q; H- `5 k& u  {                                addr  = base + cnt;  m" y2 {# o  _6 j3 o! o
                                *addr = save[--i];
* ?( F) }8 j4 `                        }, o% n6 `7 O4 }% g. _' c6 i* x0 a& z
                        return (size);
2 q: s2 O& @2 n; m/ w                }
( L  R  }3 z% j+ C5 j. i+ u        }
2 i( B  J3 y  `  t- F8 I! e+ j
9 U. m( e- I3 c) k3 }% I- |        return (maxsize);* W* r% d# U' v. H' F5 F
}4 I3 L% s/ p% I0 ]" g! q# D
int dram_init(void)
8 h+ k# C6 B9 h4 P, X{
: ?+ _3 I% U& l+ F1 i4 Q        /* dram_init must store complete ramsize in gd->ram_size */% ~  f6 F6 U0 ]
        gd->ram_size = get_ram_size(
) \! U1 j6 i; F( L( H' l                        (void *)CONFIG_SYS_SDRAM_BASE,
3 b% b7 C: @6 j, s$ N/ u1 Q                        CONFIG_MAX_RAM_BANK_SIZE);" n* d  [6 V/ V- m9 u! M' R
        return 0;  K( D( ^$ r! R! C" E9 C& I
}
, i; `2 z; D# P: P: u, }+ N" j& k* M+ T' I! c4 ?( s
+ J4 s& t1 e, s" ^7 j

# l, z$ h7 h* O/ d2 {( c2 q. j2 s* h6 T2 N/ j" j. f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; P8 o( P- r% s. E4 ^
) v7 j" C. }. `& v( y( z) ]4 L

! W# N+ t1 o6 L5 p+ @

. d/ ]  V: D: [0 q/ \




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