嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 B+ C  P3 Y7 ^8 d7 H/ Q核心板2:DDR2 256M Byte   NAND FLASH 8G bit" J. z( ?7 O) E- t$ Z( z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 Q/ t* v0 _2 v9 ~9 ?7 ^) o0 b0 Q- l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( x: O3 N/ U: d# l5 Z: p9 [

8 w+ X# z/ _' C( s3 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 n! D5 C3 }# n5 a" [/*; }) l' B" K0 u9 e* V9 C: j: S$ X
* Check memory range for valid RAM. A simple memory test determines
5 o$ ~8 b. \5 Y* the actually available RAM size between addresses `base' and
( j! R! {+ P" _8 M( e* `base + maxsize'.
" W: \) B- q, e*/; w7 v1 ]; y3 O/ D# L# Z4 I
long get_ram_size(long *base, long maxsize)
  \* w7 P/ r$ C- K( e, \5 j, z, I{1 N. z- r1 V1 s/ G% e. U
        volatile long *addr;
0 f5 n% l+ _! W0 O" y" p" G8 x        long           save[32];
: L, e2 u( z& T        long           cnt;7 X4 w  f, {2 E. i3 i# l
        long           val;
$ a9 C5 |" n+ X$ h1 b        long           size;0 j$ h' q& i" @. v: _1 I/ k
        int            i = 0;9 {. i# B, L; r; G' |, M1 E4 P
2 ?6 I5 R/ `( o. G  r3 J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& I2 ]3 L' @" x' ~" b9 x
                addr = base + cnt;        /* pointer arith! */
1 c7 O  p- E! p9 l+ |* |                sync ();5 H- J4 u% T. N- R- K4 Y! m; t2 r
                save[i++] = *addr;
1 f" C3 w3 y9 F. p2 W                sync ();5 [/ G9 f( ?" T2 k$ [4 q* n& t
                *addr = ~cnt;
2 J, D/ Q( ?0 g/ i6 p        }% ?- A% K" u$ j! x1 B9 w+ r
+ E. ^8 t( t" o. g; g
        addr = base;
  i& g. n) G8 N' u7 k0 g        sync ();6 z4 X& X& ^8 s  v
        save = *addr;
3 d' ~9 |5 b# n2 ?! F* K2 ~- v        sync ();
: B  e0 M/ r/ {/ i3 u0 E& N8 X( r        *addr = 0;( a2 j/ K. }$ E7 ?) n

9 j5 I" R9 T% L  ], r7 F$ R        sync ();9 ?( Y# {6 s% T( m+ E7 e3 [, E: |
        if ((val = *addr) != 0) {' a2 Y$ ]6 r+ a& {) D& Q" D! d3 ~
                /* Restore the original data before leaving the function.. x  H7 C% R3 `8 H8 b& `
                 */! T: b* Q! _; l# ^$ m
                sync ();/ H# K) L! D3 s9 f
                *addr = save;3 e0 v, y, L; I0 e1 x/ I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, ]- L  `" N: n1 g# J' B+ a3 e
                        addr  = base + cnt;" @6 M; K5 {9 ~* I1 ?
                        sync ();
* V6 ?( g! T0 e                        *addr = save[--i];
1 Y4 j6 D2 b# d( ~/ t  ]. q                }
& k: `0 Q" c6 f- y5 n% ~( O                return (0);
( _5 W* q2 ~. e' J) T        }- T1 b4 I* H' G$ u7 h! g& C
/ z" u9 U% G# j$ x! q8 b+ c+ T( s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* B) @, O/ u* S( l
                addr = base + cnt;        /* pointer arith! */7 D$ y8 J3 l; m/ E- Q
                val = *addr;2 m4 g2 a* V# Y: X
                *addr = save[--i];
5 m: _) v, z1 j                if (val != ~cnt) {
8 z0 q; X$ E& c/ [/ m+ m0 _% ]                        size = cnt * sizeof (long);2 i8 k3 g/ k6 n$ k2 h% E
                        /* Restore the original data before leaving the function.
* D) z+ s. J2 F' T0 {                         *// r- ?1 a" S5 U6 l- _+ V
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- m) x$ P- G! R6 q2 a( ]! x
                                addr  = base + cnt;5 b7 t6 e1 k: a7 z5 V
                                *addr = save[--i];& w! Z, b( ^* @8 |( I9 e
                        }1 ?+ Y& d! |% _& `9 ?* E6 Z
                        return (size);9 i1 _) Y7 a1 k% ]8 n. ]
                }
: X1 F8 w. H6 v" G        }
' }; T* C$ t$ l7 ^$ z7 `& p+ T2 P6 s6 e
        return (maxsize);
. X5 U$ o/ a/ g* _# P}& _6 }1 F0 I0 T8 W9 d# V! B
int dram_init(void)0 a# B4 L4 ?7 O2 o+ Y6 V! ?+ s
{9 i2 X1 E- N2 F
        /* dram_init must store complete ramsize in gd->ram_size */4 b2 [7 u6 n- c2 L8 H* s
        gd->ram_size = get_ram_size(3 U" h' I6 B7 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,  n# j3 H+ c" i3 H9 e5 g* N! {
                        CONFIG_MAX_RAM_BANK_SIZE);6 |7 l2 A% L- B7 J9 o  F3 a' F
        return 0;. Z, M/ }! G9 s& D$ z0 S; f  X
}
: r1 Z" S! o2 B7 h5 q6 X. h7 N" t9 i/ S* N5 f7 B
0 L; ~# x! ?, q/ e
# f0 Z# A! t+ K' T

/ v0 C% P% K" uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! w5 e: _" H1 P% ]; `, D

8 n5 }& l' Y' G  H
! C9 M# A% r# |+ A) \
4 q4 o1 Y: ^, T) Y





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