嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 v/ J5 ~) x  ]. S核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; h# s! \6 m) O  O! z* X" g+ H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 h2 Y: H' F3 K5 s0 N& w: y2 {' _9 [( h" |7 V6 p) _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" |. e3 }% s* |7 F' A! |2 ]* Z( r; N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 \7 Y$ ~1 o; ~* i
/*
1 ?' o4 b2 V. q2 c) I* Check memory range for valid RAM. A simple memory test determines
5 M2 [& d0 n% J) o* the actually available RAM size between addresses `base' and
( A3 T/ x+ v8 _* `base + maxsize'.5 @, B4 X4 R+ S( \8 k
*/
- b, ]) B2 y& W$ Elong get_ram_size(long *base, long maxsize)# q  p' u' p% D- {$ I4 j+ [3 i
{
0 R2 O  e& P4 l3 h        volatile long *addr;
3 k) a* ?; f9 D* P- E) X% C( u1 u( z        long           save[32];2 E" B5 O9 [5 }/ y9 s
        long           cnt;6 T) H) I3 i6 v! A
        long           val;
9 v9 _( r0 \% Q0 O8 K        long           size;9 X& {* S# U/ `/ R( p3 X
        int            i = 0;& i+ Q2 p7 L) u% F2 c  f5 y

3 T% n# c+ t: l( J8 ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 {: N- v( ^6 W/ X
                addr = base + cnt;        /* pointer arith! */
9 r4 ^4 y- Y# A" m" |& A3 F5 F                sync ();
* I. }  w" r5 L6 ?$ k9 c                save[i++] = *addr;
! Y7 t; }1 S0 i3 k9 x2 d) z                sync ();
0 u( s4 N" O3 ^8 I5 W* n6 _                *addr = ~cnt;; J9 Q6 @' w7 w. n" e, y
        }+ n, {- y3 R8 c! Z% E% m
% o% A5 X0 L6 Q2 g
        addr = base;# b# n' x+ ^7 i2 p/ O/ o% m
        sync ();
7 R( l& B3 L% y7 r" }- g4 J        save = *addr;4 Y8 ]1 x( V# a  y3 g; ]) e
        sync ();7 [/ j( C" c  g/ o
        *addr = 0;0 b5 j! L9 u6 T% f" m' F8 T- w+ u

( b. B# C1 z+ m" o( A  s) ~/ I        sync ();6 H4 |: B9 m" D$ V! v9 L/ u# a
        if ((val = *addr) != 0) {
, M6 `" x  ]" h6 z" I5 B( V3 ]                /* Restore the original data before leaving the function.3 d4 H- @+ }& R, C  U6 y- l
                 */
) U  d% g! S9 _+ z- P2 v                sync ();
6 H2 G& F. W% S2 B                *addr = save;: j9 ?5 {# e& ]" k/ W9 H/ p0 ~( M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* ?( j( K7 |; o% A' b$ f
                        addr  = base + cnt;
* d0 u# }2 r/ @0 B                        sync ();- a! w! X& [. d( L$ z& F3 D
                        *addr = save[--i];) @& i" Q+ `  m9 i
                }
! ]9 m" H$ v* g9 h2 ^9 `9 H1 Y( x" |                return (0);; `) n# c0 s. b
        }9 c* e/ a: s0 B
5 ]3 e: ^& e8 K6 O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& d7 c& Z" U$ e  a+ V/ p
                addr = base + cnt;        /* pointer arith! */6 r1 x' T6 t1 K- y# R
                val = *addr;
! R: h! S0 ~1 U6 @* P; D                *addr = save[--i];
9 x: _0 M4 j) J4 U3 S+ L' c3 \  f                if (val != ~cnt) {6 {8 z: W8 D* ^' m8 o1 O2 c& n+ t
                        size = cnt * sizeof (long);
- S- w) U- x2 l0 |0 Z                        /* Restore the original data before leaving the function.+ }  T( j: C- G( ]
                         */6 E% V5 d) A; x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! C5 T% C- t+ r
                                addr  = base + cnt;$ m% o' b! f4 w( y
                                *addr = save[--i];
( u3 m, F* S/ y) W                        }3 [% R8 v  r: I7 y9 @: e. k
                        return (size);+ R8 `8 X* W! B) z: F7 I2 ^# ~8 b
                }# _# [' A$ v: w5 |& `* A, t
        }
6 n3 p1 a; V. x7 q
5 t) f' @; B6 W1 Z; d; Z# c        return (maxsize);6 `4 D& z7 q  R! M$ V- ]
}: F) Q' a+ \( M5 e: W3 q
int dram_init(void)
4 A$ k9 p6 r. I{5 u; y6 ^  a4 X! h& C0 P5 ]( O* J9 Y  B
        /* dram_init must store complete ramsize in gd->ram_size */- K* v+ @% n* T% j% k6 M( ^
        gd->ram_size = get_ram_size(
+ i6 @* d( Y" a$ D6 O                        (void *)CONFIG_SYS_SDRAM_BASE,# i6 ^- v- e, U% d' v9 A5 V
                        CONFIG_MAX_RAM_BANK_SIZE);
7 a( z  H" M9 R4 M        return 0;
/ j% v0 V& k) E}
, I% p& v# E. ~4 Q; e- i
* s5 c7 l% F' k1 o( l" J" K' N
- R: ~# d6 a% U8 t3 h" K' S1 w& s% k, }
* n+ e  _$ X& x2 b9 B9 ]1 Q' D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: I  P# D/ x7 C2 j7 |
" e! J  i! [' {- C; c4 q# j) _+ S; L- P5 [8 b

% S1 s9 n& ^7 _7 E3 J, x" q/ d




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