嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 c$ E! k. x- R
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 O* c% C9 \9 `1 ]! W7 v这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 O! a" @0 t- e& F( P7 P0 Z

& g3 D: ?3 w5 ?8 _9 J8 d6 u% p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: p1 L, [9 r" h; x4 ]+ y

/ |+ \7 n5 I% f7 o: |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 n2 u) G; [4 ~1 D2 J+ N4 F/*7 e8 I; X) Z  ?, e- F- j0 H$ ]
* Check memory range for valid RAM. A simple memory test determines
$ `% R* m" B) [4 `  V* the actually available RAM size between addresses `base' and6 Q1 v0 P4 S# V# Z1 i9 T/ Q# U$ v
* `base + maxsize'.
- n0 Z1 k- x" v5 s' f*/, j# r( S+ M# h& k
long get_ram_size(long *base, long maxsize)
* C' q  e* q. k. i# E" ]& i{
9 A3 r% X/ R; Q& g        volatile long *addr;
: Y. o! U, N! e& R/ }" q        long           save[32];
- l# h1 \2 J8 C7 S9 h# ~) _        long           cnt;
0 ?" `+ A5 T7 b6 d$ x        long           val;/ I- {# K4 E$ R+ g" g  y
        long           size;
3 ~  B" C( m$ c1 }7 v        int            i = 0;& j7 L3 X6 P9 }- ~- t" ~% N( k
9 ^2 p0 J9 u$ |. b8 i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. ]- {% ^" I, H' Z; J; ?3 Q# C- u
                addr = base + cnt;        /* pointer arith! */! |+ J- X; g3 o7 r, X8 A8 g/ _
                sync ();: n0 e- Q- X' @% w
                save[i++] = *addr;+ ?( B4 I/ S( x6 ]( u% [( P
                sync ();5 N5 z6 i" {0 v0 G& Y
                *addr = ~cnt;0 j: a, }& F; d1 I1 {' \
        }1 S3 [! y9 ?4 `- O  }

8 P5 F; Q1 `0 ^        addr = base;
( o9 l2 `. A+ }, O& t3 u        sync ();
& U! z; C1 n1 ]) f0 Y        save = *addr;
% h$ C: d0 \2 ~5 d  Q- k+ U% [        sync ();
0 L$ q$ h& x4 d4 h2 ~: r        *addr = 0;
1 }2 o5 c8 d! Z, \
3 Q4 y+ p1 l. y' b0 N; ]        sync ();: Q# C8 L6 o- h% s- g7 B
        if ((val = *addr) != 0) {- k8 z: x0 C8 ]
                /* Restore the original data before leaving the function.
2 v: {8 g% j" C1 ?, h" t0 m4 @8 `                 */1 U1 g% C2 B. o0 u/ a7 b" p
                sync ();
" x- Q1 q9 \6 r, K                *addr = save;( t0 N; y0 @  E2 n; n* O  O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- D- u& |* h* M# u! d( v% b' B
                        addr  = base + cnt;
( H8 l9 S+ E2 l) e! d$ d% k9 ?                        sync ();* _# |& t' v$ A- G
                        *addr = save[--i];7 B" N+ G" f7 v9 \
                }  {0 b3 `2 \, u( W
                return (0);
$ n" r! {* `, W; ?, r/ f+ y' t" U! C        }. K; S( L2 Q' g5 }

& i4 }, s  C1 s7 h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 i- o9 x1 b1 V2 x& m* i                addr = base + cnt;        /* pointer arith! */  G9 O( c' b* y* s2 E) l
                val = *addr;
5 Q7 z8 q+ U( v1 `                *addr = save[--i];0 E6 ]% j! Y- z0 d5 f
                if (val != ~cnt) {
2 U$ h& H  ~: @: x6 o                        size = cnt * sizeof (long);- g- O; w" m3 U% [* V7 O
                        /* Restore the original data before leaving the function.
3 I& B8 l- F% `1 T                         */
, z+ }( K! z) w8 F8 Z& `* b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ r% K& v- n6 L% I/ C7 M
                                addr  = base + cnt;
) ^/ v; m/ Z% Z0 p5 ?% [. x% Q                                *addr = save[--i];  I" G' i) ]% f& ^' z% Q
                        }
$ ^+ j! k# ^! W7 x2 G                        return (size);2 ^% s* _. t* l$ T
                }$ q$ S; v/ z- I+ \- r
        }( m& K- l9 p3 A4 ]# Z

! ~. ]( Z, M0 f, S! R$ e1 A9 T        return (maxsize);% A! j: j  s* D: q. Q+ R) T
}
& w: w' l; o3 `& d9 G& I9 {int dram_init(void)1 g4 [8 n% G6 x. U/ t1 R* P8 G8 i5 X
{
1 x9 {6 v0 C  ?        /* dram_init must store complete ramsize in gd->ram_size */
* X0 ~- }  j5 N, I6 G! b' I- ^        gd->ram_size = get_ram_size(
& }' C$ X/ p9 z  B. u% C. n                        (void *)CONFIG_SYS_SDRAM_BASE,. n- O2 ]" ?) Z. z0 o9 N+ V) h) u
                        CONFIG_MAX_RAM_BANK_SIZE);
5 }0 p. k. P) [. V% |& K! ?- ^2 C" C) T        return 0;: l+ s4 |3 H5 B7 W9 B
}1 \- }- x  ]! b4 y

+ f0 ]/ d  o  C4 @* ]
! s/ ^2 f; P% I% c4 t3 x6 ]2 C. b6 s& y; D
% A; M' p, N7 B) X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 A/ p+ C- g1 q' l9 G' M
' c  {4 U  ~6 {% ]' |7 n
+ V2 z2 I5 r' q* T

* I7 c- e; I8 c) g6 Z- y& s6 j% H




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