嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% u- l, }. {6 H7 ?. L1 N核心板2:DDR2 256M Byte   NAND FLASH 8G bit* e2 }+ v2 x8 |; `. |0 d& }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% D' H6 a/ L, K8 `  u: ~* e" F

3 t& b+ Z3 z2 x. o  A$ z) `4 H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! O% ~% c. U2 h5 u  [$ H, e* Q4 f4 \5 h' b. ~

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! }- O9 o6 T7 k2 i  [. o
/*1 B$ R+ G. J/ }! U$ c$ Q' Z
* Check memory range for valid RAM. A simple memory test determines
; t* p1 r8 g  T5 Q; T3 a* the actually available RAM size between addresses `base' and( G0 F" E$ O4 l! E- S8 d8 M6 k8 h
* `base + maxsize'.
  h4 {! X  _2 G8 Q$ c3 p*/9 m/ C, v! P: P2 |, Q8 d% g& e. Y# `
long get_ram_size(long *base, long maxsize)3 t' Z4 Y- y& V  ?- [! ?  e
{
: i2 q7 r, L5 p$ i* h  M( }5 X        volatile long *addr;
. A  ^9 |' r0 Z7 S% ~9 r# d        long           save[32];
* v( e  v' z4 e. a( H        long           cnt;
1 @9 O3 P3 o% g2 Z        long           val;$ l' g- k; N2 Q# _
        long           size;& }$ P7 g8 ~% i/ X. n* i! m! B) V
        int            i = 0;) Y% q; O1 ]5 H2 S

! H) E8 d* J' ~% G- ^# s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' ~" t! n7 U2 B  q; j* ?
                addr = base + cnt;        /* pointer arith! */) t" V. v. u. Y
                sync ();' A' s$ r  m1 l* K
                save[i++] = *addr;  f5 b: e. v& A
                sync ();+ n' u2 ?* {- K' D& x# N
                *addr = ~cnt;* h; @( e" O! I3 R7 F0 f  M5 r
        }$ W4 ^, z% J4 U7 s9 k
2 Y$ l& P# ^# D3 h+ d7 \5 H- |
        addr = base;0 X1 `, A7 P4 G8 Q
        sync ();
' H2 u( r: k9 g) O! \0 G' m6 V8 R        save = *addr;
; H& j! P& y7 l. Y# y# ?# D        sync ();. y1 O! P7 ]1 v3 x
        *addr = 0;
& X4 v5 y$ {3 y( @
1 j% u4 |& N+ T3 r        sync ();
! c/ x4 o3 k0 f7 @" w1 f7 W. }        if ((val = *addr) != 0) {
5 }& z& A, v$ ]$ Z' e                /* Restore the original data before leaving the function.2 K- I$ k% S. X7 F- I
                 */
* p+ c3 N5 J8 O$ a* V                sync ();
5 u3 I* K2 ?# u5 i' M) v7 x                *addr = save;* m( q. h% S5 s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- E4 z" j( N+ c7 P6 o4 o% z+ l& f                        addr  = base + cnt;
% [8 v3 y$ j. [$ `) h& C9 K                        sync ();
3 @. X: `. |9 t% w                        *addr = save[--i];
" p& L5 x4 P: Z6 r# }" {1 _                }/ G& O+ [& S! I' m& e  N6 r4 b" @; A: K
                return (0);
5 U2 b7 I$ ~) T( X) Y4 o        }
0 k( Q7 j* {4 S/ x& s# l
/ W' d: T; s5 t2 Z. u( A6 `5 h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& f6 ]6 p0 {/ c( [/ s. y3 d
                addr = base + cnt;        /* pointer arith! */
0 A! e* z" ]& ^                val = *addr;
/ ]5 i$ ~9 B8 N2 d% h/ H6 _                *addr = save[--i];/ c- a8 I# G! c& ~
                if (val != ~cnt) {* O2 B* _  M3 j8 e" E
                        size = cnt * sizeof (long);5 y) f# `( w: g4 Y" v8 r* V! J& M
                        /* Restore the original data before leaving the function.6 E3 m; d+ |. T& V5 T
                         */' q' A8 R; |4 r/ u' W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 A; p5 @4 _# \4 b
                                addr  = base + cnt;
  @7 ^$ \, W0 ~" C  C7 r                                *addr = save[--i];
  I8 b9 X# @. Q0 G' @3 l) a                        }: u6 ~% ?6 i  ^5 c7 s/ n6 E
                        return (size);
6 \) V4 E  W( e$ A                }
  [; m3 j9 s* Y% r: X5 U0 _& `        }, P$ s$ I8 F- A8 q' i2 v

" j( l! O' K- t" Z        return (maxsize);
, {) v- v$ n  s) m}
+ N$ }5 C( r4 y4 {( \  ^int dram_init(void)5 J: I* T+ q9 E/ o4 m8 ]6 ~: U
{
/ E' c$ Q! X  v% b        /* dram_init must store complete ramsize in gd->ram_size */
/ G% J  i; z/ e, a0 v3 J5 U$ P& w        gd->ram_size = get_ram_size(3 C; e5 ]6 }' B$ V
                        (void *)CONFIG_SYS_SDRAM_BASE,3 m3 E4 S2 V6 O/ }7 _
                        CONFIG_MAX_RAM_BANK_SIZE);& h/ g  P. c) [) i3 t# f
        return 0;
( b' s  f  M4 B  }- a( x- C}
$ \7 |. q9 _: _/ d* H6 {
% D+ i9 z# E: q- l4 z. u# A0 C
* O/ e, C1 `3 |, A0 [: O' C- p8 [  O

( ~4 @/ Z3 O* y/ g! x( ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" [5 Q0 g# q- k
* x2 W( e% i) w

7 ~( j7 Z4 k6 e. }. Z, @

& ~  c9 {0 J7 `' `: Y




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