嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: s3 T4 d( l: e( t- y核心板2:DDR2 256M Byte   NAND FLASH 8G bit! d9 C3 s3 V6 p$ k4 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 m  u9 D. U! \& N* g2 {) d/ M8 T

1 o5 {1 {$ M) s4 G/ y& l" N  F是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. m  S7 A( x7 V8 H- z
# @7 [4 X6 s" R9 [. ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& J% h0 U5 `* z' e1 d) Z( J
/*' o9 i' t7 y; b/ O# P0 }
* Check memory range for valid RAM. A simple memory test determines
0 z7 x/ T, W# @& |  Q1 [* the actually available RAM size between addresses `base' and7 g, f0 {. f8 t) ?; L
* `base + maxsize'.
/ t* t7 g( B: i! W! ~*/
) `/ w# _/ F% q. Q1 G3 I6 A, B# Hlong get_ram_size(long *base, long maxsize)
4 K% o) ~+ G3 @{
: X4 s( K; P6 n* d- `$ Q0 R7 {        volatile long *addr;
- u/ G3 P) x# _$ u2 {2 b1 w( I, ]        long           save[32];
! F" b: ]  _4 Q  ?: M% H        long           cnt;% d0 E2 D8 Z8 |
        long           val;
" S! n0 T# B3 i& c2 F% d* M4 W        long           size;
6 \  g( `4 M* C% o* p        int            i = 0;" |  s3 a  j  \- t
( w& t# V) F# u" F: Y! g& V1 S
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 ]& h% P8 }+ u( D- l& n/ }
                addr = base + cnt;        /* pointer arith! */
" i1 p/ |4 I" s" [! Y- ~0 Z/ B                sync ();. N. V# ~" e9 G! U$ d0 b
                save[i++] = *addr;$ A4 h( a, |' l# R
                sync ();1 I0 n- }# Y8 h  j/ J2 N
                *addr = ~cnt;
6 S' }$ v! c: R4 q3 J! J        }0 k( O1 f4 b$ H) i3 S3 [

! n/ m' \3 A4 {& G( Z        addr = base;. q( ^9 q: X$ t& t% g5 ^  r
        sync ();+ M) _( i7 C, w" X
        save = *addr;. M. P7 m# v" u% {2 s
        sync ();) P! W  B- G; E: m1 s9 W
        *addr = 0;
. z( ?( P% W/ b* ~, n& ~$ }7 l4 F* ?2 t7 ]
        sync ();; C. Q0 |: h( J; O3 H
        if ((val = *addr) != 0) {' c( W4 g3 p: K' f9 `& T8 N1 E
                /* Restore the original data before leaving the function.
3 k0 c* Q( h$ O1 e9 o                 */
1 R  Z; s6 C9 v4 W+ w/ \0 `$ e' h  m  H                sync ();* X0 r; W3 k. e% V1 b9 e! k
                *addr = save;* X9 X# _: L* M; `
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ P+ \( `  j+ U1 P# Y                        addr  = base + cnt;
9 }: i! j. m' `1 J7 F* z* e                        sync ();/ A/ J) G% c+ q9 e! f6 s, u. q
                        *addr = save[--i];
9 |& E2 c# r, H5 ?9 g+ K! d& [                }# g) C0 N2 Q0 C" c) C# n9 Q$ i9 z
                return (0);5 j( x+ U$ T- v' Q; e& w2 N$ |
        }% i8 m  E) d) Z5 D

9 L1 B" }7 E6 v  L        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  ]) ~* p+ b9 A& L2 Y
                addr = base + cnt;        /* pointer arith! */# @1 [+ O  N: k" S3 U
                val = *addr;  u; W; \" k( N& u9 J! X% x7 g
                *addr = save[--i];% X. j  b# k" c1 o/ v
                if (val != ~cnt) {! x& `% _4 }, c8 k2 R
                        size = cnt * sizeof (long);
: C1 W3 ]8 x% l+ o& }# E                        /* Restore the original data before leaving the function.
% ?/ i/ Q$ n; e+ d                         */& @6 h! i: t5 I, K+ ?( h6 r. F
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ^% v5 ?9 w5 A. t1 b/ Y                                addr  = base + cnt;
( f: V$ `. S) R$ G0 R                                *addr = save[--i];" v3 O  ?' E5 o9 N1 m1 }
                        }/ F! I. x: ]6 ?6 _# G+ A
                        return (size);, z9 y3 ^" z0 j. r$ n6 v
                }
6 B/ [; `9 W% }7 {        }
5 g# Y- L7 `8 A5 z$ G0 S& m, b
) s; y* _+ w: k! }+ e2 k  F3 @        return (maxsize);! |* \! a* U) P1 ?3 }( ~2 h. O* q
}
, ?% f8 y+ |) m9 I" G2 Lint dram_init(void)
" g% _' ]6 k, J% J' H- J5 p{: B! j) ]) K( M# T) Y, P7 ]; E+ v, l
        /* dram_init must store complete ramsize in gd->ram_size */
* U3 u* U% q9 t; ?8 o        gd->ram_size = get_ram_size(- ?9 O5 t1 U  H! H3 v/ s
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 }4 _$ r, N- \* g                        CONFIG_MAX_RAM_BANK_SIZE);3 }; g6 Z, ^  V- q8 s9 g
        return 0;
( h$ L% L& c$ k2 Y: i, p}6 F3 o+ k! o7 P. k: Z2 F" q
" }" ~# `* M6 w( o$ b) H
7 ?. l, N2 C8 E/ X
: b/ ^* a) d" c
; m# m' a; }2 |- @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 C6 Z2 z1 P) v& a5 p# g: G' _  U0 m& G' }! p: _0 x) D

8 Y9 _7 O; z2 e; E3 @* \
, J# k3 m# F* W# d: ?1 E" O4 ?





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