嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" I+ E9 O: M: j, C+ m1 C: z5 s核心板2:DDR2 256M Byte   NAND FLASH 8G bit- g4 s4 V) l6 s; Q5 D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 W" g3 t* y+ d- B2 L0 W- l% b% i$ \: o8 v& R- b8 a  _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  E9 f# d8 N4 v5 r. Y

  [1 _' |. @* e/ \- y3 ^% @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 W% o. K. j/ u
/*1 |9 L% s+ ^5 H/ R, e/ P
* Check memory range for valid RAM. A simple memory test determines
/ S) o5 n  a# Z+ Z* the actually available RAM size between addresses `base' and
# i% i  u" X) G4 J* z7 q3 _. G" `* `base + maxsize'.
) C! |3 D% |# a7 k1 B: w) U*/
  D+ X( \; l; ]; W, C3 l9 Rlong get_ram_size(long *base, long maxsize)
2 D* l0 L. J: j{
8 ^. a# Q+ t! P, B  w0 T* J        volatile long *addr;$ L. Q7 I+ h3 j6 z/ ?  O2 \. j
        long           save[32];, e& R+ `+ d  e7 i( z2 k$ p  g
        long           cnt;
1 @( Z) w4 K' j; b) w& R; ?3 _        long           val;
1 x9 E: o+ E5 y% g8 d6 M' A/ ]        long           size;. {' z% ]( Z+ M; m( H. }9 I
        int            i = 0;
+ \8 z3 a# B( h- g  W% u1 M
- Z7 \5 a& N3 n        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 |" m2 G8 T2 }& d7 `5 `
                addr = base + cnt;        /* pointer arith! */, b7 G  |0 U) w+ L' ]4 i
                sync ();$ ~, q: f& h/ `& i1 D
                save[i++] = *addr;
* V8 r: V2 P% L; _+ U: S1 h                sync ();
5 M; A  B0 H9 F                *addr = ~cnt;
1 _& Q. G& ~7 X        }8 z2 H( m0 j8 f

% |9 Z% m! f( [$ N4 Z! V        addr = base;( x) ~# a# ]1 h0 d
        sync ();; o) H8 O) c1 ?+ m9 V  ^6 U8 g
        save = *addr;5 w/ N6 W4 y/ O# v0 h
        sync ();2 N" W( o# ~( g8 s4 S9 z( T
        *addr = 0;/ @& B9 t/ X7 {7 L  C* Q

3 D9 {2 T( b* L9 m% \6 D! A        sync ();
5 Y5 \3 N! N  P        if ((val = *addr) != 0) {
5 c! A* B7 |5 K( v7 @$ w                /* Restore the original data before leaving the function.9 _/ c  v8 T' S
                 */: d9 E9 s4 e: d2 x1 w
                sync ();
3 ~" g! ?4 ], B+ E! Q! |  |                *addr = save;) X/ D- w8 O; y( z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' @% k/ G0 W1 L5 n8 R                        addr  = base + cnt;
  B" @, Y* x+ g! ?                        sync ();+ Y* _- b) d% k) K- N
                        *addr = save[--i];
% B3 [) ~. k- {7 S- |( k9 Q                }
: W3 H) v1 D- {* Q' ^! ]2 P                return (0);+ \* M) W; S& C  w  ]$ P% j1 e7 |
        }
# D6 F- S, D' ]. O, X, d) v, {8 H% \" w1 {" L  m
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( g" ?' ?8 E' v. Z1 O
                addr = base + cnt;        /* pointer arith! */8 s/ V# q* i: v- t+ \
                val = *addr;
' S) O' ~+ W) B0 m                *addr = save[--i];1 B" P& ^& ]0 e
                if (val != ~cnt) {$ v' c1 ~4 h# I* h0 t0 |. f7 V
                        size = cnt * sizeof (long);! Q+ z2 ^; ]! _4 _7 Q% l
                        /* Restore the original data before leaving the function.
7 i4 S0 `: \( x                         */
" R: i( I$ x3 `( f& N  \) c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 n) G" ~9 N1 i+ _. Z& C1 X7 L                                addr  = base + cnt;  w7 P) D3 v) ?% @% P8 I
                                *addr = save[--i];
$ W  \' i( Z; E) |9 b- K                        }- ]7 G* n1 t2 D' b' g# c
                        return (size);
9 N" ~, r+ T* y/ X6 W8 U$ M# j, Z                }
! \* e1 O# v( r5 f        }& \5 \2 m6 y* |, r2 B
3 v  F( t+ b* {( J8 b
        return (maxsize);) R. j- R$ G* o
}
) R, z5 q) P1 \5 e8 [. r9 Nint dram_init(void)2 q% ~& w5 g( c& q8 E; K
{- I- ?8 {. ]( U+ u
        /* dram_init must store complete ramsize in gd->ram_size */
( N& J+ ~; v2 {. G2 X# Z# W        gd->ram_size = get_ram_size(: z/ I% z% s7 {
                        (void *)CONFIG_SYS_SDRAM_BASE,! |& f3 x- l& T# c/ N0 x
                        CONFIG_MAX_RAM_BANK_SIZE);  a- F7 t/ W; _
        return 0;
9 \6 y. W: h' b, S; e}3 K! J' h+ V" W( ~0 V

, ~* H: |7 \" |, C
. e7 \  l' V- x5 X5 s; H3 Z( L7 o: p& ?
0 @, T, b1 d1 Q: j0 \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; B& p% H, O5 u
2 A: e' d0 \' Q+ _0 j/ w" D

' n$ [% j9 f' i
/ Z" x( O* l7 {" g/ T' y8 f





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