嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 [; Z4 q) x4 n3 P( r" P' w# f
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 i7 o- z# J" Z7 m$ u# Q3 P5 O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  S; G1 c  o" j# t* }5 ~$ ~* _: u1 e; u& v: ]- l+ I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) @8 G: ~& C6 G, k+ ?
  t' D; K! t& T* _7 F" ]
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 P' x9 _4 E+ H6 D# s/ H1 X
/*5 ~# {2 j. d; ?: @5 c: S/ e/ }; k3 t
* Check memory range for valid RAM. A simple memory test determines+ Y; ]7 f' k# G
* the actually available RAM size between addresses `base' and
. j3 z; {' I9 _' |/ r* `base + maxsize'.3 l7 d( e( Y. Z4 a
*/
* ~/ M# W; d$ x: v' M/ p: Q! B5 Llong get_ram_size(long *base, long maxsize), V, r8 n; t( V7 a
{+ u) T6 N  K3 y( ]: E
        volatile long *addr;+ D  U- t4 e/ S/ L
        long           save[32];; p! }# f$ c6 b6 j0 L1 |- q/ b
        long           cnt;
- w/ R6 a- j0 ?- C3 Q8 W        long           val;: _3 s( s, R0 _" r, `) K
        long           size;. U( M9 b3 t' F& h8 s1 p- s1 T
        int            i = 0;3 r4 B: F6 i( X: Z% T
3 ~* G( Z" I9 R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" {$ \4 _- z6 M7 n- V. N# r% O; n                addr = base + cnt;        /* pointer arith! */+ g6 I* w( C, b1 p
                sync ();
, P% e  D: t% h) E* Z) ]6 j& k                save[i++] = *addr;9 U7 `" u4 S! r& D1 Y& r- B2 B
                sync ();
3 ]' b; }- U0 @7 L5 S( f& u                *addr = ~cnt;
% C* L- M  V( a9 n* V        }
1 ?. r" f) Z/ o0 m' |3 `0 U- Y8 Y2 u3 k
        addr = base;% ^$ K, V0 m8 b$ C8 c( M) y6 u- D
        sync ();
: Q/ t) N8 H6 i$ m. h/ }! S        save = *addr;' L( ], ^- t6 z: _5 p" L, m9 }' q
        sync ();8 T" F5 p( u3 @5 K9 l( }
        *addr = 0;
1 d6 S# @' o4 F3 z% e2 d3 x9 x- e/ q0 V* t4 C
        sync ();
( C' |% ^: x9 k- }" ]9 x+ d        if ((val = *addr) != 0) {
# i: p- V) D( S  b+ V. y                /* Restore the original data before leaving the function.
( K5 C2 {/ }) `* Z4 |                 */
- x$ B( y( l. v9 K, M2 l! o                sync ();* ]8 b/ ~/ l& H) r) F8 l5 y" E
                *addr = save;- h! f$ Z4 c& I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' v3 I  |- l+ b5 B7 q                        addr  = base + cnt;
- l. w, m" Y0 [$ U+ E6 v3 x                        sync ();# f* d; A4 F; w4 ]8 B) m: \
                        *addr = save[--i];
/ `: j$ x  B4 B2 ]$ B" `" u                }
" v0 s! o3 ^3 m& {( }                return (0);
$ c* m, A2 o# s        }
$ B( `! e4 k& @- y0 h4 Z/ f! ]4 `" w9 X; o/ I. a. u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 A) W& m% M/ X1 f% N* B" B
                addr = base + cnt;        /* pointer arith! */
0 }: A- U. C8 f" \) h4 W# ^* l                val = *addr;! H( n& s1 b% P) Z6 f1 @3 h
                *addr = save[--i];, d7 \  S% k' `
                if (val != ~cnt) {( ^  y* j. u. p& ]  v/ S+ b5 A* c
                        size = cnt * sizeof (long);
. w; w$ [7 X5 I/ M# U! V                        /* Restore the original data before leaving the function." V6 R& R: z) x8 s  \
                         */  L: V9 |- b4 ^3 E8 K* d- s7 v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 G% `; r* J3 a                                addr  = base + cnt;
6 V# l$ a; a; b) J! ]                                *addr = save[--i];
0 d" w9 L. ~7 M' [. u                        }. m3 U$ ?9 i* A
                        return (size);0 E4 B( c2 c/ Y9 C: P2 n. F9 l
                }
. h1 M/ N0 [2 M! p* a        }9 j8 H3 r. u1 ]1 I- D
$ ^; P) C% Z- H8 o) R
        return (maxsize);
2 w1 m$ v3 n" f4 g8 I2 j}
  v! W' z( {) l% G. N! T+ f$ j+ d5 x5 [! _int dram_init(void)& R* {# o5 H9 P+ i2 Y
{4 J5 O- `- a7 J0 l
        /* dram_init must store complete ramsize in gd->ram_size */2 e, z' u7 K* X# s1 P
        gd->ram_size = get_ram_size(
) J& C$ N9 H; O4 X+ s+ U0 S2 Y                        (void *)CONFIG_SYS_SDRAM_BASE,
# U( g1 t8 m9 ~$ W' `; Z" p& T6 @                        CONFIG_MAX_RAM_BANK_SIZE);4 W* b- Q+ K' u3 m
        return 0;
! T. V8 y6 J; b2 R}
* \, p3 T, E) ~+ G9 b6 W; x) z
, X# k6 i0 |% s8 x( m( e5 S- r% s7 R. i9 F

2 Y: d" G/ r' C8 ?/ Y, ~2 _9 Z( z: L* y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% z+ U6 W; ~8 B4 t: h/ _- m' ~: N: i' H6 n0 v* }

( B. L6 ~- ?  h6 s' [8 _

  T, _  B3 M+ ^" |




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