嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: Q) E4 O) ]( k2 P& Q7 D( m. Q核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 z, n( E' l, Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" ]8 N6 V) V, ]* y+ j

3 I0 \$ e* x0 |, \% [' [5 g4 R是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  b) C4 E% T8 Q7 \& f$ Q. ?4 s, J5 T* {- G7 T. B! v% Q% r- Z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: U* i1 _! |0 p
/*& S, X* f2 H/ k" H& U8 `  ~  C
* Check memory range for valid RAM. A simple memory test determines
# b( u: ?' T0 T- t+ T  E* the actually available RAM size between addresses `base' and3 W0 x8 q3 V7 v. H7 q" E7 z- t
* `base + maxsize'.
  J% u/ w  u/ Q9 O, ?! g6 v*/
, w2 |( ]6 U! Hlong get_ram_size(long *base, long maxsize)
( G' q( g, J( `% I, o- t( Q{
# f: G! V3 Z3 W8 \7 A. f/ L  D        volatile long *addr;
" q1 S2 r7 T, v- I3 g# D' t6 E1 L8 g! G        long           save[32];+ {6 }( [2 J1 ^+ E& B! ^6 P0 E
        long           cnt;
! ~7 m- o' x$ M( I5 O        long           val;
1 ?$ E$ D* M7 G/ }4 ?, m& |, C        long           size;
3 P7 z/ x, X- l- v9 C7 Z6 o( o% g        int            i = 0;' u8 b+ Z/ ?1 F8 J  S
  C$ g+ l$ J- z+ v  X/ U
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- f+ P" G3 C2 a9 @0 s
                addr = base + cnt;        /* pointer arith! */$ t9 Z" ]1 v. Q1 S
                sync ();5 B9 C8 L4 b  F( j0 a7 N* a, H
                save[i++] = *addr;
% {5 y! R, D4 [, i) {0 S& ]$ U! T                sync ();/ u, e* C7 J, X3 c6 N+ t/ h
                *addr = ~cnt;1 m- C: P8 h: S; M
        }1 r/ ]8 `# Z% y) c. I

7 C: N) j/ Q% y: X3 @        addr = base;
, P7 N7 W" L7 N9 m  i; B        sync ();
+ ~0 h' {% A/ h- |  n$ z! X4 G6 ?) j        save = *addr;% z; f  p( n# Z6 |$ b# V+ }
        sync ();
/ k& h. \* F5 @) L; F9 a8 C* h! x4 J        *addr = 0;
1 ^, B2 D0 O3 N* m' l  t
; ~# I1 P5 B( m$ Y  L( B+ {, c        sync ();
# X4 f0 M. x4 b$ B5 \        if ((val = *addr) != 0) {
# [  ]1 b  L( d/ ?4 q0 I( E; T, L                /* Restore the original data before leaving the function." `% p- f- e7 d0 M( R' l# o- u/ L
                 */
. J, }/ c. C( B+ G; j                sync ();* N% p( ]0 Z0 Q4 I7 h* d
                *addr = save;
3 ]4 i4 j. n. }1 U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) N3 H- \0 Z/ t# z! w5 B- C  q: ?6 @
                        addr  = base + cnt;
' }5 x& i/ t# [( F: P  t) [2 V2 G                        sync ();
0 s& M+ L8 g# t, R7 o" C                        *addr = save[--i];2 u. q- n& ]6 y6 r
                }
: I: [6 t: `- p5 I' C                return (0);8 N/ ^0 J  E  G% H* F* B
        }
9 x8 E3 O5 D5 L4 J
8 t9 z/ g0 n' \: l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, R$ h" N5 c; W% f9 P
                addr = base + cnt;        /* pointer arith! */
3 T3 |$ J5 U  k/ ~* L. O3 _3 Q                val = *addr;! H5 j8 C* W$ |7 J8 }  z
                *addr = save[--i];* A" y( @- ?! p: {
                if (val != ~cnt) {
& L0 R' E% |! g" P. H5 l                        size = cnt * sizeof (long);
8 X0 G' }/ O) J0 ?* \7 p                        /* Restore the original data before leaving the function.3 P/ h; j/ \- p4 z' P6 f3 f$ d
                         */( M) O7 V  [3 y4 F+ `2 \! [+ i
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 D( U$ Y* `0 E% F                                addr  = base + cnt;
0 v* y+ W  [2 r- a7 j                                *addr = save[--i];
4 N  c$ ~( [1 `7 u7 q( Y                        }  S, |! X; \" u2 p5 D! P
                        return (size);
9 p0 U+ l( k9 |# Z# [                }
7 r! x9 @1 g$ K* g; ?        }1 z( d% k8 i! s0 z  T! c: {
3 V6 J( f' \# Z$ [  D, r
        return (maxsize);& T  I4 a0 Q' I6 x9 }7 L- ]5 p( I
}" j* F% {) |5 r9 }4 y
int dram_init(void)! o" O; f6 Q$ N2 }" B
{
5 a. d0 o0 q. T9 i2 ?  [, q" P  X( ]        /* dram_init must store complete ramsize in gd->ram_size */
, n+ F+ @- j& v. A  v1 O+ D( A        gd->ram_size = get_ram_size(
( g! m: G, x# b) ?                        (void *)CONFIG_SYS_SDRAM_BASE,
) q4 U; A0 `/ w0 j, y- s8 x                        CONFIG_MAX_RAM_BANK_SIZE);
  `0 w7 W+ h5 S' f' T. Q: `        return 0;' @7 b" T5 g' t$ j
}
5 ?' r/ M  `* F2 n" c
7 y8 g7 _( F, ~( G: b9 r  `, G3 t3 s* }. Z- o) j* F

5 A3 z$ F3 H6 @+ A6 |1 Q
4 E+ [9 a1 \9 ?/ jFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) I6 k$ z2 T" V! c: Q3 i

, w" @6 D: v1 F: p/ d0 C' H# {+ O- Q) n* T+ o5 s! Z

  `8 @" B9 J1 Z* E9 x) h




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