嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 X/ |! A3 f9 K. P* E! s7 c
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% E  r  z$ j0 j. y# {" s! ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( v6 Q2 Z+ e! c8 A* @" I. j! E+ o+ h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* T) v2 i1 O" D  Y. m' G6 c& V& f

( r" m, C- C  d. B7 F- X" K2 b
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: g# d' S8 n0 G/ v' {$ P( w/*- B. q. D. x7 C  g3 L5 H' ~' _
* Check memory range for valid RAM. A simple memory test determines: t% A  G  G1 g2 Y: d
* the actually available RAM size between addresses `base' and4 q& r& D( [3 P1 k9 {
* `base + maxsize'.
& p- Z2 p* s0 |  q" T+ u*/
5 B0 }0 K7 m/ S/ _  Ilong get_ram_size(long *base, long maxsize)3 F7 M# A+ H1 Z; ]0 B
{
9 s' ~- y7 e  C* f4 \# S        volatile long *addr;' Q& F5 u, a% c* W3 K# ~  o
        long           save[32];, d$ S1 |7 I/ S- |: L2 \
        long           cnt;
+ }8 h1 v. b7 ^3 `0 H+ V        long           val;, {2 F0 e) X: Q0 r6 w* r1 R
        long           size;
9 @* D/ h! a5 S- Y: Z4 }        int            i = 0;
9 m" L0 H% }# N: n% r. s6 p2 v2 z- Y# t2 t
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( y# F6 ^0 h/ Z8 l" W- }
                addr = base + cnt;        /* pointer arith! */; m; a4 o8 S5 L9 J, d7 z, Z
                sync ();" {" |: o4 q* Q
                save[i++] = *addr;" f. j  u+ H  @& S( J
                sync ();6 M: W- r/ V& e* |$ w" H8 V
                *addr = ~cnt;& C* i9 H% q6 f- z  f0 K; r
        }
. t5 l* Q3 F1 U2 ^/ ~5 p8 m; K
% V9 X4 T1 ~2 X% |9 T6 T8 n0 f        addr = base;( p9 Q" S( s# s
        sync ();, C% i4 p9 u7 o) r9 r
        save = *addr;! M9 }% `" U# M$ W7 }
        sync ();
& x- S4 j, [8 ]4 O; j8 x7 F7 q+ O        *addr = 0;- z( L- ]6 [  P" e

& Y* x  A$ M  M3 v% J8 b& T- P3 \        sync ();5 s9 {( ^$ A7 j$ u. {" y- x: V
        if ((val = *addr) != 0) {1 D/ X! D8 u( s8 F
                /* Restore the original data before leaving the function.; }- ~( G& l1 f. H$ c
                 */. s! E, |) {8 ?6 M1 u2 I" W
                sync ();% i2 I/ o. T. ^
                *addr = save;/ n+ x) m! R6 A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" M* Q; N4 r% F& f3 M2 H: b                        addr  = base + cnt;. r. }& o- C# e* @
                        sync ();
! t7 d# F9 w! t& R. a. M* I* Q                        *addr = save[--i];
' z* |- w  h& i; Z                }
; ]! i' d0 E, Y9 t                return (0);
; l  j9 H: N5 G( v        }
% Z1 e& L# T1 k. P, R, v' U; z. ?: n
) K; _' d0 v5 S9 F* Y3 }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ j, ^8 J6 e8 S1 C, ?+ u2 \                addr = base + cnt;        /* pointer arith! */
! m& }$ ~; w0 \; m) d) G                val = *addr;! J( W/ o, c- ~! d
                *addr = save[--i];
" n' K0 S9 @" I# s. K$ d                if (val != ~cnt) {
9 u# ^1 t9 O5 V) D7 O% q4 _                        size = cnt * sizeof (long);; i6 y2 V# g% F
                        /* Restore the original data before leaving the function.
+ A% ?; G( Q6 ^* p% c* n3 Y                         */
: `9 I/ \. _$ `' F) s1 P7 \6 W; D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( P) H0 P$ m5 \                                addr  = base + cnt;  p- ?; ?& e9 X& y
                                *addr = save[--i];
7 G  c3 X( k* W; \                        }" _8 X" }3 J3 M
                        return (size);4 J/ g) J8 g$ d0 F4 S
                }
. f1 ]! I( d$ Y0 F        }, I4 h7 b) t, ~- Z$ H$ z
' J5 M, Y6 s$ V: r/ m. z# q
        return (maxsize);
" r* y. g9 s7 s) O( R& ]}
4 o; C0 ~. I/ T  U) q' D% l( t; Yint dram_init(void)- C* G4 {* F% ^" l* K* B7 r
{
) U( Q3 k. ~% k8 ?4 J+ P; i        /* dram_init must store complete ramsize in gd->ram_size */
3 ?1 e3 |/ O$ l5 I- |+ u' }6 `        gd->ram_size = get_ram_size(
9 }/ A, ?2 `% i9 P8 S; _1 \                        (void *)CONFIG_SYS_SDRAM_BASE,
! Y4 F+ H/ a( z# ]* }                        CONFIG_MAX_RAM_BANK_SIZE);* x3 A2 U/ ^) z9 {
        return 0;/ g8 W8 p2 K1 p
}
  w/ A& T" n4 M7 b1 W
) S! g& g# _9 k! L% Q% [% l, m* @; n3 n3 S5 K: V; E: D! P
5 u, D. k$ ?5 y4 [5 p2 S
4 \: M& b) N9 V) v" r+ ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( u9 l- R$ ?+ D  @- C

: _4 z+ C2 h) I0 Q7 H0 X0 i) E. K8 O: C+ U1 Y
. q5 `) n/ A, r4 l* w, B1 }





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