嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 \: V/ }$ q1 D! _3 H% O2 q: F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit" K- o1 d2 t7 {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) U8 [: t) @6 I1 z
0 ^3 D( v* i+ z) N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: l7 `( g$ I$ Q/ H
+ d$ L9 k; Z( s4 b: q* }" t( b5 c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! I5 b7 ^" \, C; {# d" M/*
0 X3 ]0 S; R  ~* w" C' u* Check memory range for valid RAM. A simple memory test determines* D3 f, f0 E+ }1 J7 y- [1 ~. e( p9 w
* the actually available RAM size between addresses `base' and
+ e. v  ~/ C: ?' F8 ?4 A( B* `base + maxsize'.4 g/ A* B8 H9 d9 Q( E8 U2 _$ w
*/7 E7 U; g: k3 m: y+ m4 P
long get_ram_size(long *base, long maxsize)2 i/ T' f) [3 ]0 ]
{, V) ]3 @. u0 E
        volatile long *addr;
! L% @. K, U8 O0 Z        long           save[32];
4 e% l1 W. X, O. ?4 P7 I. K        long           cnt;
, E/ l6 w9 u2 N1 u        long           val;
. a1 J/ O' e  I        long           size;, n# S) r: n. l2 `3 z
        int            i = 0;
4 y$ E  B  d; e8 T" v' ^' s+ V; J! |5 i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( E" E0 t+ R2 f' ^6 n0 a3 W+ U                addr = base + cnt;        /* pointer arith! */
' b6 B5 g( o4 z5 ?! ~                sync ();
' Z) l4 X1 H- ?2 \                save[i++] = *addr;
1 R. b. H4 l. }$ r6 S( f: F' p                sync ();! f0 T/ F5 d2 g* d8 S9 ~$ n
                *addr = ~cnt;
" t# b  y0 _( v$ B( p: [6 L1 T) G        }3 y4 r/ J* |4 u: D6 s/ K
3 Z% e5 W4 {! P) q, A( e9 o, t( b1 m3 s
        addr = base;
3 I3 f& k% b8 Q$ Z6 ~7 m        sync ();
; t! a- z/ `9 Y) l9 K. X) v3 H        save = *addr;
$ T4 d1 f+ J, A8 w0 A7 m4 C. a        sync ();
) o/ E7 j% r0 ?# U* F1 `, o        *addr = 0;
9 E8 ~9 c% n, V* `9 c$ B
. }3 I, r0 l+ e0 [* z        sync ();- e9 q- T+ m! z$ K6 u& c7 }7 d7 X  a+ y# |
        if ((val = *addr) != 0) {
, t+ s, b+ ?* Z5 b5 e                /* Restore the original data before leaving the function.2 u  L# n9 A( e- D& F6 |
                 */
6 a% Z* q4 u# V' i( J                sync ();7 p7 H0 N3 e( ?1 z6 P7 R5 Z( _
                *addr = save;
9 O& x  V+ G3 A1 o- k                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 t0 A# }2 Z8 b! L5 ?! Q                        addr  = base + cnt;. M) q  W+ }. g+ q: N
                        sync ();7 u! y( _2 I+ x
                        *addr = save[--i];
. k  w6 P9 @8 b7 g                }
7 J+ M. [3 {- H( D& \2 ?                return (0);! p  s% l1 z4 N1 |* j
        }$ ^! w. x6 q4 z) k3 E! T- @! z
9 E" Z3 f5 [) ~9 ]5 |* l2 B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ [6 q2 {* K, p0 z+ Y+ J2 u: w% p
                addr = base + cnt;        /* pointer arith! */
" P& g5 \& g* C; ]) b  K6 z; I                val = *addr;
% `  {& c3 \. d: R                *addr = save[--i];" J5 u" f$ P! F  v) }# c$ f; G: O3 D
                if (val != ~cnt) {$ K% M3 H2 l! }& Z" q/ {/ Z
                        size = cnt * sizeof (long);
+ D& C7 b2 P, \4 _' @                        /* Restore the original data before leaving the function.
4 L, H( ]: s6 Y3 F                         */) W9 @5 G* N3 c
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' x% l  j! f  h
                                addr  = base + cnt;
9 n% r; y! m6 L  @+ a' J4 c# g                                *addr = save[--i];, x2 k! V0 s& f7 q+ ]) o
                        }7 ]  p, y2 w1 X. k& Q. k7 T  x
                        return (size);+ ?1 L" g- G" W" ^% G  k
                }1 V& e! b' q) ~- x, ^
        }0 V9 N' ~% u1 c5 z7 }9 I

: F0 U; R7 o6 K: a2 e) a        return (maxsize);
2 K; ]  {" o, k}
% }/ F  b" t. e; @2 ~int dram_init(void)+ K9 o- L0 W2 |7 Y8 o# j
{) g: P$ q6 B+ I3 i. d3 U
        /* dram_init must store complete ramsize in gd->ram_size */5 o/ m4 t/ p* ]1 g: ~  @2 x3 X! `/ f+ R
        gd->ram_size = get_ram_size(
9 K9 `/ E( ]% U4 M+ {3 \                        (void *)CONFIG_SYS_SDRAM_BASE,) C  W' ]+ e' G. n
                        CONFIG_MAX_RAM_BANK_SIZE);9 C3 @: x! F# n: e  E! B8 o
        return 0;
' {$ O3 H6 I9 v/ g# g}
, L5 Q9 ?- Q& U& b7 `- ]% b9 _! d/ W. b* u

0 o  z" K, r& f, v* i
& m  v4 u. L" b3 Y0 j# _
/ @) ~" G$ \+ v' D# L  `& uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 e4 Q" y# z" @: P+ d' z3 W% v) T
: s. r" f6 f9 Q$ o; H5 f! Q5 o; z

8 R3 u, r- u3 P6 }! A2 Q

3 f- O' i( m/ O, X# {  h1 e




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