嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& p: p* n9 ]1 q, m" @  O4 t: a9 w! f核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 x! g( Y: j0 p1 Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, I4 p" ?; \7 c* i! }
. s; T' N4 X6 Y- R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 F( l8 _. O3 N1 n' f9 T
! C- N1 l1 j# Y0 t' }

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- [0 ?: m! t+ Q, u3 A1 A: K
/*. e$ G! _5 r) |  o1 r0 m! X
* Check memory range for valid RAM. A simple memory test determines: v$ H0 b1 Y( G; S
* the actually available RAM size between addresses `base' and
0 b$ O) Q. G/ A. E. B* `base + maxsize'./ U/ e! |% a2 X% b# \, S
*/
/ M$ W* i; Q: _# z/ v9 Xlong get_ram_size(long *base, long maxsize)& p. L5 B" }; |" V% @( a
{
0 _. G  j9 h( F! L/ A. g7 Y        volatile long *addr;
3 _4 C6 u% X' x5 T6 x6 G6 x        long           save[32];
) c! p: `; T: p* G% x, ?        long           cnt;. G: h* S8 m5 A. R: x
        long           val;
0 _; O+ S# e$ }# E- O8 F) P! e        long           size;
( Y  ~0 c7 W8 V7 V. `# D        int            i = 0;
  ~5 U3 _1 w/ a9 ?. b& `( R
# m8 V- H  _5 j) }6 C. e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 Y$ V$ s6 p* X6 p" L) P' m+ N
                addr = base + cnt;        /* pointer arith! */
  \2 I9 l/ X; r' }( I; v+ _                sync ();6 _0 Z( y+ c6 h  i8 s" G: @- b
                save[i++] = *addr;( e# Q( ]$ H( E) w
                sync ();6 @$ `5 J9 W! }2 h7 M% I4 m
                *addr = ~cnt;( X1 W) G" r% e. }. u
        }8 H; v9 ?' f( t
  l; I: h4 Z6 o0 ~; n
        addr = base;5 ^: n" @" E0 ]3 d) ]
        sync ();
) W  ?4 S: y6 Z        save = *addr;- x0 p5 o5 P2 ?6 S; D% W" F7 P
        sync ();
5 [. }1 u9 r- E; \; |        *addr = 0;
) @5 M) T( G6 b3 N5 R
3 z( c  ]- k$ E        sync ();
- |; w: j! m7 k! Z( I/ t        if ((val = *addr) != 0) {
+ W! [3 k3 l0 k: B  @                /* Restore the original data before leaving the function.
3 j, N' y. Q: B                 */
! M0 y) y/ a5 R                sync ();
& E7 h" R" u. k! A                *addr = save;* n2 }: _/ X# o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# `1 Z) n3 J9 p7 j. n
                        addr  = base + cnt;5 Z5 }% n$ D& L
                        sync ();' D% u: c* _6 N$ ]' t
                        *addr = save[--i];( z- S( L; h# ]- s( |: }5 h* x
                }
; o8 v# b; q. U+ q$ x7 }                return (0);' b* q1 r5 t+ F9 l
        }+ Q1 I$ y$ }4 J0 W8 l
& s- {+ Z4 j/ K  ?
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 h2 ?! o7 W6 ], T. {
                addr = base + cnt;        /* pointer arith! */- L* F" X: B* Z: I$ |; l0 b' E
                val = *addr;
$ H' Z, \; }) c' b3 ], |9 k. f                *addr = save[--i];; d! t+ }0 ~( b+ u+ F
                if (val != ~cnt) {* z: S, }  w9 J7 _$ Z
                        size = cnt * sizeof (long);8 ~' |0 Q; W5 d$ {
                        /* Restore the original data before leaving the function.
, l* c) P) s+ c% Q                         */7 r3 N5 s, `! t+ J2 N* v( _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. D9 z( l& q. ], Q
                                addr  = base + cnt;
" U0 c' |7 |, J" H5 g6 \2 b' v7 ^& y                                *addr = save[--i];( q# r. S6 d( u1 C
                        }; b$ f3 X) V& N7 c  C. J/ W
                        return (size);
: d' Z; j$ @- A/ M0 N' Q& u0 q                }
' n# l2 g; h; w# x        }
  c- L1 ~' a& [+ `$ Z& o
! E" l8 Q: D# {        return (maxsize);
" N1 q  ]3 I9 {2 e9 h& H, a+ T}
) u& d, E/ J5 Y8 ^) [int dram_init(void)
& F8 I. X1 s" w' h: p" o" G3 ^{
% a; x- ^! o: s) T        /* dram_init must store complete ramsize in gd->ram_size */- |' h9 ?+ m3 z
        gd->ram_size = get_ram_size(
3 X- j8 |5 c# F* H- \                        (void *)CONFIG_SYS_SDRAM_BASE,
. v; Y: f. s+ q! B                        CONFIG_MAX_RAM_BANK_SIZE);
8 ?& }! _# h+ c, I        return 0;# F; [. u# z! v- ?+ S
}
( i" z$ j- h8 s% a
1 W1 p% \" U- ]9 M5 @* R5 T; K

9 Z6 c9 B  u- G  ^% Y% J
2 T* X3 H: O+ a- [2 V% l+ Y+ yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 a) H. d% ~& F% I* \7 K, v' n
1 q  {% t0 [; N; p

6 o$ E  e# D0 ?/ W
! g4 }' ~& v  [" e! _. m





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