嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' N9 [# k9 m) K2 ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  r9 Q: g; ~4 J- ?# d6 e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 O7 q9 y( E6 E/ H6 B. b0 t
# a5 e/ X, w- i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% ~; L$ e$ R8 O
9 A+ p0 d9 g) c% ]3 e5 ^" r5 y# e

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" ^/ H/ U+ Q) G) K5 t0 E
/*& ?/ a. X- d5 d
* Check memory range for valid RAM. A simple memory test determines
- y/ }. R( ?' ]" v% E+ F4 J; P3 K* the actually available RAM size between addresses `base' and3 D* ?2 |9 b# _6 s7 @- K
* `base + maxsize'.& [# Y! @6 |- @3 d' j6 I  D
*/5 M' u' z& ]3 s5 i4 g
long get_ram_size(long *base, long maxsize)
- u# M1 P) [/ ], c; j5 P{  h7 u1 y) B# j8 m
        volatile long *addr;
2 [: c+ E3 q* X* h" {, J4 z        long           save[32];* y9 |* u5 `- x7 B/ G; G7 X$ k
        long           cnt;: b& r/ S, x+ u! F/ F
        long           val;
0 h, M1 E4 }, u; r        long           size;  H8 Y5 F9 c  ]: g& D) W( C
        int            i = 0;
; j8 n( g8 v$ c) J$ ]' T5 [5 L( ^: f& W1 c8 q  I2 f" E
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 |2 M4 B  f( f" J3 ]0 \! @' v                addr = base + cnt;        /* pointer arith! */
$ r4 L8 N6 g! j! m( p, [                sync ();5 v4 a( {3 T1 v
                save[i++] = *addr;
3 J  u. \( O( e& b) x$ {) {                sync ();/ q& A8 I8 x4 }5 |# J: Z
                *addr = ~cnt;
7 Q' B* {/ r9 z$ [        }
4 r. S# b7 Y( s( ~( E4 r2 a; A" S6 V& J0 n) G, T5 I7 C! M$ A
        addr = base;
8 l+ |  ~: x/ `3 E3 e4 l( D        sync ();6 o* h1 A7 r2 D- g% _. k1 k
        save = *addr;1 h( f3 P& _6 T2 C. R! L
        sync ();- u9 k2 l& W7 T  c
        *addr = 0;
$ O4 i5 F; ?8 J3 U
' N+ f8 M5 C( w6 o4 U        sync ();# R5 J. z& O* A6 D
        if ((val = *addr) != 0) {
- x- C8 i2 f* s6 h                /* Restore the original data before leaving the function.5 u1 G6 q* R' E# ^# ^
                 */
, M* j4 \9 @% Z) b: ~                sync ();6 z7 k9 U0 Z! a" V4 x
                *addr = save;
) S+ X, e' O' w+ @+ Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ X6 ?2 ]4 I& K- q) B8 k" C
                        addr  = base + cnt;$ Q/ T7 ^3 K, {" l
                        sync ();% d, E/ ~. z" n7 h, V
                        *addr = save[--i];
) ~+ @- z% D  U) o8 G* u                }' f" j3 X6 R% z/ B. ~" x# w; @% G
                return (0);4 f* R, m; k$ t: J
        }: m$ u* U' a/ R! M' Z" j
$ J& N) p( d* V* y+ x1 D9 A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# ?  y; Q0 M' A9 w* z                addr = base + cnt;        /* pointer arith! */
  Q0 Q1 D. O$ m% \3 J! V8 N                val = *addr;& e6 N+ c% H- W" j
                *addr = save[--i];
0 L4 q! ?# j0 ~% f7 k                if (val != ~cnt) {
$ J# q% T  P1 N% O                        size = cnt * sizeof (long);* D5 l8 G' h) t3 q) _
                        /* Restore the original data before leaving the function.7 V4 p1 V/ x! y, B8 @- \
                         */$ p- B4 b7 e, I2 T7 [3 v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 n! L$ G# M" N- ~+ S7 a7 m) R
                                addr  = base + cnt;
# y( Z# F/ y0 E! d( ^                                *addr = save[--i];
7 a9 v) U: r+ X6 l; n- P                        }
( B) s$ P. t8 ?& W5 |7 y! F8 H                        return (size);  Z7 P# Q: B/ r
                }1 g2 n* K0 x" g1 z2 ?% s
        }
% [: Z2 D6 F' t) V, H  m) F; G, `3 ]- t
        return (maxsize);4 s/ u# b& l, _2 M! ]% S9 n7 V4 z- G
}6 w# X5 h6 z' F+ C* D& ?  v% q
int dram_init(void)8 v# F' s, y* k6 W- ~
{
1 T6 L: X9 ~0 d& X+ A% V        /* dram_init must store complete ramsize in gd->ram_size */
1 G! ^/ x" ?3 u        gd->ram_size = get_ram_size(  Z. z' t7 x% f) l) P) B
                        (void *)CONFIG_SYS_SDRAM_BASE,
; ?5 S% @8 b& `: D  B1 t0 P# ?                        CONFIG_MAX_RAM_BANK_SIZE);
& m9 _3 {8 v. P2 R        return 0;
3 x" _0 e: R# N}8 q" C. j4 R: r
% z" E& W# J$ R$ b$ v6 V
% v; Y$ G+ S0 i/ t4 G6 F; C2 ]

/ e! c: S4 E( o/ V( H
+ I, q7 c6 t" o5 K2 J5 U; [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% t9 P# `  s2 {" j/ G  l2 {, }- q3 t
  l4 T  p! O0 A
% v$ W9 s" c1 L  ?; w  }9 K- I. \

( i: e7 R! A0 g5 O3 F




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