嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- z& ~1 `' Y  Y& r7 g2 @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; @8 x0 f7 d  e0 Z8 @& u0 N: S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 l6 J8 Q& @0 t7 O$ n. c5 C/ U8 z( v( e" D0 Z0 ~  D* O8 J( j- e" ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; m% r, c  D3 c$ G+ ^7 I/ q0 F

. _+ Y5 N1 s1 f9 M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) p$ H! H( A. j/ c7 u% ^: p/*5 w) U3 B, b4 S% h2 z" b9 z
* Check memory range for valid RAM. A simple memory test determines$ c; @: M2 `  v, `" t4 l
* the actually available RAM size between addresses `base' and( q6 |+ ^* S7 b& `$ b3 E2 @% z' o
* `base + maxsize'.% p$ w& b' o  f$ V/ r8 z
*/
0 e" P( X! G5 nlong get_ram_size(long *base, long maxsize)% ~; }' R5 `% f7 m
{2 {. H5 ^% T: q1 J! T" j0 O7 u
        volatile long *addr;
7 W& p; J4 t" h. }- O        long           save[32];9 u" a  |4 f1 N+ J" K+ t* _
        long           cnt;% P2 s" O! @$ W. T+ k
        long           val;
/ e2 q7 }" v6 y+ T1 Y, x. {        long           size;( t& R* R* c' c
        int            i = 0;1 ^" d  r3 J7 h1 N; n
+ ^, H8 o: c1 }5 V
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ B8 @; c1 w" W0 P                addr = base + cnt;        /* pointer arith! */- V6 f( R, Q) B2 s
                sync ();
5 \$ ]" D2 B5 h2 c9 i2 `9 R                save[i++] = *addr;2 k& g! ~+ f  b6 v; n5 N/ I0 R; B
                sync ();
' g% j! e" |: L0 `( I+ m                *addr = ~cnt;0 B' Y3 O& T- k$ O
        }% y9 O; ?% S! w" V

# ]5 V' {% e% |- I4 p4 J. U        addr = base;6 q% ]' K$ }1 `* w- q
        sync ();" l7 I6 |. @; b  U- x3 c5 q
        save = *addr;& [/ o3 t$ ]  O9 |5 r5 c( D
        sync ();
$ x' K3 P  t% F6 L+ L* z8 B! A        *addr = 0;
* K0 y: H2 ~. t* y7 `% |; p) _3 k$ R% q$ O
        sync ();
) d2 d; [$ y- @1 C" [& ]        if ((val = *addr) != 0) {
) n( l3 Z  U0 i( Q6 |+ h! ?5 O                /* Restore the original data before leaving the function.  x8 M9 ?! ^: Q0 k# ?
                 */: Z% r9 w& F( }$ P! I
                sync ();
% o: f9 o) R# L- b; I2 v# l& A, L                *addr = save;9 Y  n' F" e8 H( K7 _: b' T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ P. |" b6 K$ [6 H, L6 R
                        addr  = base + cnt;  ]: e; b; T; E  Q, G+ j
                        sync ();6 z( E. U4 |3 Z5 O; Z
                        *addr = save[--i];
7 h4 s9 w/ H8 B                }, J* n8 X% s( _
                return (0);
: }% n/ {( }7 b& O4 _/ r        }) O8 O4 g: `+ L' y2 L5 H. d

6 A7 w6 R) o! t" [        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 \" Q) o: _9 y  N% w$ B$ d' i
                addr = base + cnt;        /* pointer arith! */
: o9 B5 V  C9 L- M                val = *addr;
0 q; o/ O' T+ W" ]5 Z' L                *addr = save[--i];
' k/ y* W( J5 d/ R1 p& v9 @$ _' U                if (val != ~cnt) {0 [' n/ y2 p' e% [; c6 c
                        size = cnt * sizeof (long);. n+ L" L9 `/ Y8 v3 G
                        /* Restore the original data before leaving the function.
& w2 E5 Z) ]: V: [4 c                         */; Y) m3 l! \6 |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) U) l8 X( ^8 G3 N* v6 U1 C" e
                                addr  = base + cnt;
2 [) o8 B# e  {' L, w( a                                *addr = save[--i];4 t9 l8 m) }! E
                        }- ]& l2 ^9 k7 y4 J4 I( W
                        return (size);
! c2 C" N6 {8 n9 B, e* a7 d                }
. H$ Y5 K. P& F! E* }1 L        }
$ e) d+ r+ h  r9 c( E2 C: ^- L9 H
        return (maxsize);! {# ^) u) T( G5 m3 d& U
}
# N% ]( t% E9 |( i7 D: Y: t) Yint dram_init(void); N0 k2 X% ?/ s$ T8 q( `  O6 M% m
{
# Q$ ?; w. ?: R) Q/ ], _7 |! O; }        /* dram_init must store complete ramsize in gd->ram_size */
% e$ A1 Y! b4 Y; D        gd->ram_size = get_ram_size(& p4 [* Q% z) j& p
                        (void *)CONFIG_SYS_SDRAM_BASE,
* f9 `% D; n0 j  B: C' t+ u                        CONFIG_MAX_RAM_BANK_SIZE);
# Z8 ^, U  d' _- i9 D3 T        return 0;- @; B7 [% J- p- j, `! t. e
}
, j0 O5 D7 {# W3 }( d, Y4 f+ Q0 K1 {' F9 I  E# {
, @' F5 a/ \  o/ k% T0 N

" h# b- B  _% ~4 a1 N; `3 d, b) j& u. i$ T; u3 c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. b* l) p# x0 i4 X5 u
2 T1 V, N3 S! {: M& H2 Y

; F6 y) o* C6 B3 V: f* G1 b" |) X

+ ]/ B) I& e  B! V) h# r8 p




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