嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, ^; N# e5 Q* y  B3 j- y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 }7 y2 J# v4 [$ @+ s: b这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% N4 t* `8 a3 a) y6 s5 C8 h
/ @+ _: ~7 a, R+ A& o2 @是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 z/ g  h0 |6 Y; ]& a- C7 c; L3 l
0 \, Q) _! w1 }9 `

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 |. J. q* L, x: J4 N$ U: x+ b  o
/*' e* Z9 C/ q& \& J' F$ X
* Check memory range for valid RAM. A simple memory test determines: a' f/ R8 l7 ?8 u! E7 j
* the actually available RAM size between addresses `base' and
- j! ?6 W$ {1 R  V, ~6 X* `base + maxsize'.
8 r7 O+ i* f/ y, E  a& S*/
, X) ?4 D. k! q, |/ |long get_ram_size(long *base, long maxsize)
& \3 T/ P9 u/ o{8 M. t; B' s/ h* @2 D* l, a. h
        volatile long *addr;
( d; C+ R  V! v        long           save[32];
0 P( v/ d: r7 F" u5 |6 r" U, h        long           cnt;
; a" o# L& s/ u9 l! K* p1 k        long           val;
: d0 t6 J" ]( a4 q" {8 ~3 d# b1 }        long           size;  z7 M* E7 d1 U+ b
        int            i = 0;
( Y; o7 Z9 c' l' r2 }+ x% I3 {* x7 S% t8 S8 Y. ~$ O' y: H" A$ {2 \: g/ T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. C0 Q! |4 U; P                addr = base + cnt;        /* pointer arith! */2 X( {& x  b  O! L5 I: }
                sync ();# X+ c: c( y3 p: z0 R
                save[i++] = *addr;! F- C1 \2 U8 t; v  t  A
                sync ();) b& q) ^; c8 ~4 a( ~9 _
                *addr = ~cnt;" q+ l+ X) S/ {- b. P  K" J' F6 o
        }
0 @2 p5 |5 Q* R3 _2 [* D& T4 V, R0 P! b7 V. U0 P+ u( u  T
        addr = base;
+ L* a" X, Y) D        sync ();& b+ A+ C9 c: {+ \$ e; {
        save = *addr;( E5 g% ?/ [0 Q
        sync ();
( J$ T3 ]0 ]$ v3 N        *addr = 0;/ n4 a/ t; c0 k" H$ T" G

2 Y0 X# x5 F3 [6 M/ e        sync ();
. S5 r. p3 i9 m( h- r        if ((val = *addr) != 0) {: l% r# v+ ]  u
                /* Restore the original data before leaving the function./ @8 j- @  }, ?
                 */
& O5 V$ d: R! F+ O  g                sync ();
: O* |! l6 ]  @/ [                *addr = save;
8 ~1 N# ?% x2 p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! s+ P) z( J  a) c( C! D7 [8 F
                        addr  = base + cnt;! W5 r7 w9 q; w+ n5 P/ ?. ?
                        sync ();7 X& s! C# r) z' R3 K
                        *addr = save[--i];( k( ?2 B6 ?1 d% ?; Q1 F* Z1 X/ ]
                }
) d  [% D3 u; p" z8 P1 l                return (0);% A) @0 _2 k/ I: K9 j7 w
        }9 [( r9 l9 t4 w& J  ?

4 D6 p7 Z0 N( d9 i9 G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ?* i) p7 N" H5 ^5 M                addr = base + cnt;        /* pointer arith! */( E* R/ E: k' Q( Y0 k
                val = *addr;
. Y- I8 V. d/ {& C0 f6 A2 N                *addr = save[--i];1 v- l/ M$ j3 N" m
                if (val != ~cnt) {
! c/ n2 M6 I6 s+ n& D                        size = cnt * sizeof (long);- g  f3 `/ ]' T7 @
                        /* Restore the original data before leaving the function.2 a* y5 c3 v1 [& Z1 k1 V( O/ z$ t5 m
                         */
  h0 }( [% Y, x                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" X" V5 ~' Z# ^' k/ C                                addr  = base + cnt;3 Z( ~; C2 z$ i$ T! e& C
                                *addr = save[--i];
( o* v2 y% \1 `" v& X2 B/ E# M& q                        }
" v. J' C# d/ M- e0 m                        return (size);
" m, ?7 J3 S3 }' j1 f                }' A: \0 s5 i- z  q% p" _
        }
+ N( \4 H+ z+ m. _' b# [+ N. I- i8 X3 g" M! s
        return (maxsize);
( f7 S7 q/ W6 H+ V$ x5 ~}
+ x. _7 Z8 S9 e/ o& I# bint dram_init(void)6 ?" G6 a- B' Y- X
{
2 w$ @5 @+ k4 {5 Q' G        /* dram_init must store complete ramsize in gd->ram_size */
1 `0 U1 Y; x' K% G* ^% G- X        gd->ram_size = get_ram_size(0 S+ \- M/ Q9 \: g
                        (void *)CONFIG_SYS_SDRAM_BASE,7 V  H  h6 f9 B, {' i0 G) M
                        CONFIG_MAX_RAM_BANK_SIZE);3 W1 h( T" f; ]: n- {7 i
        return 0;! @0 [2 n5 H* r  H
}
" }# l8 M3 X$ }0 l' ~$ X
2 V( s1 H0 d+ T2 Q/ `( J5 ]6 t
1 U8 B' k% Y1 V6 i$ a( G. L" k- n7 J  J2 ?

/ p8 b  E, r8 l0 WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 n3 v6 a. C3 p0 v/ j* y" T& \. [/ n% Y" ]% x$ `
0 x: _5 S; ?0 }) R5 d/ v# a6 G- V
' ]7 W4 Q" x2 A, j





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