嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 L6 R. t) O$ \" V+ V3 E3 w. ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. B$ ?" U6 j2 @# Z/ r0 h( ~  Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 q% L5 j7 E* r0 p2 b- k7 a* P6 g

1 p1 C' X& {1 p2 `- q' t; d* O: z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' x& P+ `5 P2 p* C8 f7 w3 ?

5 B" F; W% N* V* I
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, t5 S( Y' D8 w3 c- U1 L2 W& _0 o
/*
% w  d$ J# W3 h/ _% f1 h: C* Check memory range for valid RAM. A simple memory test determines$ Y0 w8 g- n6 a* T( \' B
* the actually available RAM size between addresses `base' and
# S3 |: T0 [/ R- W& f9 x% U3 B/ q+ r* `base + maxsize'.5 s+ j% K  @- ^9 @7 ^+ f3 |) q
*/7 V# R3 y/ X8 H* m
long get_ram_size(long *base, long maxsize), V/ _0 f+ {8 S6 V' ~1 t5 }! y
{
1 T+ q/ a. [! l; T        volatile long *addr;: l- }2 f! o2 e! ~( e( S
        long           save[32];( T5 I* C, X, Z
        long           cnt;
7 N; |1 l  @' B6 r# r; F: r/ M        long           val;
0 A" v2 q  O; ?+ S        long           size;
) Y( D- K8 a" T4 m7 q/ U        int            i = 0;
$ g3 P. |; I5 U" @9 d2 a/ W% q) G( X5 \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& W* C* @; x0 }/ C$ z3 M                addr = base + cnt;        /* pointer arith! */5 @+ }# U4 a) T  x+ |& }# O6 C" w% R
                sync ();4 |. w; R' e) b0 p  b! X! k1 J
                save[i++] = *addr;4 K% K& a+ c: A
                sync ();' A- d) U( _7 b9 Y/ e) Z
                *addr = ~cnt;
( G! g8 {% A8 e6 }  D$ |1 F# C        }
; l% F& s( u! R2 S1 d3 J/ z4 _' T& n9 A# X& _( p2 D0 t7 D
        addr = base;. _( d. G1 R8 C" y9 e( w
        sync ();% ~  l- X( q$ u* |
        save = *addr;: N& d" H2 o  v3 R" f" X6 R6 W
        sync ();
+ `. t8 e7 ~' U0 p        *addr = 0;
) v& g& Y, W7 z; f( T) y/ S+ T9 S
% ~1 N" Q) n6 R6 I: V; {0 g        sync ();* i5 K) z% q6 c$ [8 x! o) [( X" T
        if ((val = *addr) != 0) {0 q. N0 C, k/ l. u* X
                /* Restore the original data before leaving the function.
/ l: |: Q( K' |) d: `                 */1 `- W5 U- f+ c( U; s+ {
                sync ();
7 \  T/ Y! _8 W) n                *addr = save;$ S( N9 C9 B9 V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# ~9 r; u7 v8 {8 ?                        addr  = base + cnt;5 t" U$ j6 K# A1 d) i9 g2 E
                        sync ();2 R2 G2 R3 @! Z; Z# f
                        *addr = save[--i];
6 Z5 S5 c& f* R0 m& J+ D                }
7 g0 [! c0 B# a1 b                return (0);8 U. M& g$ f! e6 y+ k% S! V+ d8 t
        }) ]1 F3 E" N9 R" X. Q7 P1 R
3 V/ X% e: F" V# O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ f$ W/ p. w- k3 x4 F                addr = base + cnt;        /* pointer arith! */. Y# I$ @$ i+ x8 K( U9 c1 o; I! D! E
                val = *addr;
6 z! T5 A; E8 o. H' F& y                *addr = save[--i];1 w3 s, _' t% v8 ~
                if (val != ~cnt) {
9 J7 {! \/ _( A; x                        size = cnt * sizeof (long);6 B+ o) V$ E+ s% S. j9 _
                        /* Restore the original data before leaving the function.9 H/ N* }# [( \4 w; ]* S
                         */+ {/ t8 f6 I: R3 W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ |1 A% ~; h+ N5 z! |0 u- |
                                addr  = base + cnt;" r6 y& U" q- ]# z: I
                                *addr = save[--i];
7 H( f% ^; o7 [" C2 B9 O                        }- I& i: T. k$ f# [+ G
                        return (size);
& |( b( d2 q8 i% d, [, C3 w9 R                }
1 m; ]* W: B0 l* C' K/ `7 }# t9 N% p' r        }) ]8 ^9 Y: {6 X1 q+ k
: W( F) R: ?! X  G, k/ B9 s
        return (maxsize);
. |. m) [7 E* l4 W5 B" I4 T7 r# _; F}4 E$ Y1 c. x6 r& p: g
int dram_init(void). i, D3 k- a' g0 W* [5 G+ R
{
' Q& M% P0 u) w9 ?' _6 C        /* dram_init must store complete ramsize in gd->ram_size */
/ |0 Y' m) T" y( G        gd->ram_size = get_ram_size(
& J0 A! p; p3 C* Y" `0 s                        (void *)CONFIG_SYS_SDRAM_BASE,* D  G3 U, J3 d2 T6 b1 v4 l$ v8 z
                        CONFIG_MAX_RAM_BANK_SIZE);+ l6 ]) J2 O$ x  ^
        return 0;
) p/ a* @, k* S9 C}
* u  H2 i/ n2 C! r* J, `' i: O
$ C3 t7 s6 k" W8 p" l4 g- L  B9 Y1 \& l

, c! [# y7 D& N# k; x* f* ?* w
$ N) O* t, R6 c4 _3 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 U6 q2 e  ?$ w7 l7 }# E
( P( J8 ^& g' _/ L. B1 z

/ ?1 g7 _  w$ d2 j: H3 \- o2 i

- o+ Y& W) z9 B# A1 B8 h2 B! O




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