嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 z. {' E# s4 j3 W& G核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 X0 o; k! M/ U% `7 b, `) P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 u) J5 C# m& w" T
9 s( ^* t& m3 I: X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 ~& v/ U# R: p5 Q( O+ u; h8 G) u: W6 g9 V7 {

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ n% P# h+ W( ]
/*) Y4 c/ l1 ?% c% N) o7 `* e
* Check memory range for valid RAM. A simple memory test determines
# ]. q, T' l& d! |* the actually available RAM size between addresses `base' and) y2 h. @! p, {8 Q$ q' ^
* `base + maxsize'.6 x9 P& ~7 }( ^/ l
*/
# `! I- c  H& c4 D3 b0 H; C! k3 X' ulong get_ram_size(long *base, long maxsize). c1 Q" T* y" n/ x
{
. N" y7 P6 i7 r% w" L( h: |' X        volatile long *addr;. y% e" @9 B4 w# h- d
        long           save[32];
8 Z2 ~# {4 O- A# C( O, C        long           cnt;
+ w% n4 E$ ?# ]! v5 M  _        long           val;
+ L  O) s. f5 P, b1 [, Y        long           size;
+ j' c& h* j( f3 o        int            i = 0;! b0 U7 w/ x4 l) }
+ Q) H1 F+ `3 g$ d6 a$ L
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 y% }4 `. @, |+ K# a  j5 f                addr = base + cnt;        /* pointer arith! */
1 [) ?8 a3 r) f7 c5 p                sync ();
' t; C/ l/ c& {! T& S                save[i++] = *addr;& r8 ^$ b1 W- t  t
                sync ();' F+ h+ L1 w. ]/ @8 _, H# }
                *addr = ~cnt;
* p+ H6 W: Q4 I: v% Z) \7 ]        }
1 x3 P3 e! ^) ?$ p+ G4 K( |3 w! K% C0 ~: k4 i4 I- n4 U
        addr = base;1 y6 }$ B6 O6 D6 Y) J7 ?
        sync ();
/ o; T. A: U0 o$ t/ w% f6 \        save = *addr;& F+ k! K  a, Q+ F; e* e
        sync ();
( N- l! B, i4 c* ?7 m        *addr = 0;" A  m+ G- u1 `( I

/ Z" f! o+ o/ k# u3 U2 r6 M1 H        sync ();
9 c% V* o4 u0 ~( _        if ((val = *addr) != 0) {' l5 ~, E# k4 M7 C% j
                /* Restore the original data before leaving the function.
; ]0 o, m/ n* u% S5 \4 a8 h                 */
* {1 [* A/ K! N( b7 h* l* `                sync ();9 ^$ M, Q$ L- O& ^/ M& J
                *addr = save;/ w+ ^0 i* z. W: n0 v9 A2 r0 H
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! w1 b- S+ s" a0 j; A+ _0 |. E( _- F                        addr  = base + cnt;$ @: E5 y( v/ G8 Q- u
                        sync ();
' ^* {, q& u, j/ Q) t; l: d7 q' s                        *addr = save[--i];
3 a& B6 Z+ D  O6 t) [- Q                }. ^  C7 b+ `. A( W5 r
                return (0);
. A) X1 m4 [7 _4 ]" B8 H6 B        }
- K4 h$ A* [0 n
- r2 m( p# H( m: g0 Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# o6 S/ o- ?: ?9 Y* X# g
                addr = base + cnt;        /* pointer arith! */
) p4 ?$ ^- `) @1 V  t6 _                val = *addr;" M* X% n& S$ S" X4 e  Y/ v
                *addr = save[--i];* L  {( o/ b. N& X" k2 I
                if (val != ~cnt) {0 M6 B2 p: O$ b  ^6 v# S1 t. e
                        size = cnt * sizeof (long);/ t  o. t; \8 c* {8 I0 K  j& u
                        /* Restore the original data before leaving the function.' N3 _- g/ n( m7 r
                         */2 ]1 O8 j# w9 ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 s+ o8 V, ?% r1 d7 d
                                addr  = base + cnt;; `( ^+ L2 Y8 Q' Q. i3 I
                                *addr = save[--i];0 L. U* l) X1 V: C' L: a8 b: n
                        }
2 R* |! h' F5 f% D8 O# b; u                        return (size);8 F- S  s. f0 p4 w5 p/ A
                }
4 g, e" Y4 |- W6 R3 W: Y% |, ?: A" K        }9 i$ H7 t/ `- |  s

- X2 Y. w1 Y7 `6 |9 F1 Q        return (maxsize);5 S* O( z- `) \$ R+ u4 ^/ }3 F1 g
}1 i- m5 x8 C' V8 N4 W3 V1 v
int dram_init(void)
9 k3 ~7 f( k' B. E0 @, i! t* w{; D0 I4 ^+ `$ P+ L7 L' [* L
        /* dram_init must store complete ramsize in gd->ram_size */5 f% s: |( z6 H( U6 T; a$ N
        gd->ram_size = get_ram_size(
7 Y' n$ O9 l: {. T                        (void *)CONFIG_SYS_SDRAM_BASE,
. J- q& t+ V, H- i* c2 Z* ~                        CONFIG_MAX_RAM_BANK_SIZE);
1 ~$ L# X) z  y6 E, _        return 0;! }& q' L  f; W
}
8 Q6 u- X0 z$ w  f8 _7 z. |( l
; `) J% o/ s* W5 e, K) ]1 O9 T' f
$ P& d$ q4 W  ^- W: h. d$ E% V
" I5 }, R# s9 M
, S- k; n! U$ G9 H. z; a" CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: P$ M4 [$ J. \1 x# C

, K% \0 h! b0 Y. w; `% S4 [3 J# N( g+ j. \4 f9 ^$ a

9 i/ \1 p' c. ]2 n! e, J# M; G




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