嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: K# J* s( c5 Z! T2 v核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 ^5 G3 \7 l, O$ c这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% I' s4 o5 i/ }/ E0 H+ G2 c3 y* D( z6 @- p) G1 R: M* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ w7 Y9 u" U2 O7 P9 l8 Z" R2 V0 W! }( @% ?9 u7 d- B4 [/ U8 k/ Y

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) O& ^8 |4 h4 g0 c0 K/ w2 [( S
/*$ c' x6 P/ Y1 }! d1 p" v
* Check memory range for valid RAM. A simple memory test determines
: q0 S/ j  a' V" s2 `$ n/ h' O* the actually available RAM size between addresses `base' and) a1 M- \: T8 H1 t; y
* `base + maxsize'." W/ ^9 v8 w  k7 A9 q5 g' f+ n# r& n
*/  g4 F, [. F! E3 e
long get_ram_size(long *base, long maxsize)
! R9 L6 k9 U6 s$ G* b{
2 N4 m4 n/ {: z6 P/ P0 H7 I  Q        volatile long *addr;+ v# ^- H/ r. D6 t- c1 [
        long           save[32];5 g" U: \+ J; z
        long           cnt;
8 n+ H# Q0 V, V. Y        long           val;
" G8 S# M  y& i0 `- u6 \6 F/ r        long           size;" I: Z0 N! N" S5 {
        int            i = 0;" l! X( d0 C7 [7 {! p2 c+ h& q
8 r0 S6 l1 D- k& c# Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* g$ }0 p$ Q6 g# h3 N                addr = base + cnt;        /* pointer arith! */
$ @, B) \! f. j! x  {8 L7 r  G                sync ();
0 z, L/ L' l6 O4 A0 t                save[i++] = *addr;
5 s( q2 }5 X1 v8 g                sync ();: Q% D( p) Y' e3 r5 Y
                *addr = ~cnt;( C/ N; j1 W2 ~$ @  s
        }) N' {$ D$ U+ o- P: N. }
' E, r1 {: _) b# U  B* f
        addr = base;* D  q8 H% p1 `1 Z) q
        sync ();" {9 k" k" y- R  j( |
        save = *addr;8 _* m: B9 ~: R- q% r- N
        sync ();
6 Q7 P8 P2 s4 C5 l, U3 ^        *addr = 0;
9 W% T  K8 R: S! e9 [) Y2 y, N! m* O: h  K6 N* x3 m
        sync ();2 L5 Q9 L; i4 O% U; R
        if ((val = *addr) != 0) {
, e7 i1 d1 s4 F5 x! P3 B                /* Restore the original data before leaving the function.6 a5 j2 L8 p8 ^* ]2 a, `8 _0 M& P
                 */: z& O* y2 E% k  i+ s) W
                sync ();$ N/ c% `1 W' C* l
                *addr = save;: [4 u2 u) Y" i9 R! q' n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( y" T4 j: y! W/ _4 i
                        addr  = base + cnt;# U7 k3 F" i  [5 y' f( y( z
                        sync ();
* Z+ M/ K, E, {: E9 J  n" O                        *addr = save[--i];
0 ^. F2 N. Y8 k                }5 q) f0 L' {2 l" ~
                return (0);$ V" X/ J, _) a! N4 D5 l7 o! w% ]
        }
! s& Z7 T1 [' M7 U/ @8 ~5 _1 q# p/ y1 q9 e. f
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 Z$ ~% j# @/ N
                addr = base + cnt;        /* pointer arith! */: d! O1 H6 G% q. g/ @  H6 b* Z+ a
                val = *addr;
7 v: a( n; V2 r8 L                *addr = save[--i];1 T9 o) x+ T. J' k* k& C& y
                if (val != ~cnt) {
0 t& a, \9 I$ q9 ]4 d; z+ a                        size = cnt * sizeof (long);  W9 e; u6 V  L, d5 B" u
                        /* Restore the original data before leaving the function.* i2 ~( {% v" Q1 q
                         */
! L, X( w8 L4 C1 g3 e                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- B; \6 A! \1 ]8 j) n1 Y( r$ ^. d4 t                                addr  = base + cnt;
; s( @2 A6 V) G. k/ U' }                                *addr = save[--i];
6 z. w! \$ ]5 ~" z- r& s                        }) M1 H# c' W( R. D
                        return (size);, n8 U& i  d$ d
                }  U* q: I) D: F6 e
        }2 Q/ z- h+ ^3 i$ C' v9 L) x
0 p! v' u# M7 W% q; F/ X, \7 I
        return (maxsize);: c; X8 A5 \4 z3 o) a
}
3 J" ?4 y, `0 O5 q/ n- D9 U/ F! Pint dram_init(void)& x7 V8 U6 h4 F1 L: L
{: m( A8 F; U4 ~6 @
        /* dram_init must store complete ramsize in gd->ram_size */
2 m0 `2 ]3 _% d6 D# u4 t        gd->ram_size = get_ram_size(1 B$ d1 B9 p! S' Y0 N8 J  y' n
                        (void *)CONFIG_SYS_SDRAM_BASE,! r8 _/ `, g! c  H) x" N
                        CONFIG_MAX_RAM_BANK_SIZE);
) p' u8 E4 E) ^        return 0;
# ~6 L+ I& T: V/ a# J& C}
- C, {* j/ a" k, u, J% i( L3 \# F; P% b
; T5 O; |3 \; N5 f: P
$ }; F& l/ i: a8 c6 ~0 \3 g
% Q, _# e+ r7 r4 m& P! |' b* U  q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 ]# i7 u3 `" t1 S7 T- i" v3 F* ]3 D  D
& a. i& z; b0 X  f8 j
/ K' Y( n6 ?6 t, D9 p3 P" ?





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