嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 i, Y1 l7 C0 `, V- K3 Y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# r( K; K5 J8 `( K! i1 i. |  ^这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 Q& F/ H" B, X( W0 ~  v* ?* j6 s! D& p( I1 e( R3 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, P5 |+ m: W7 j3 w- D/ }% x7 l6 ~
; ?$ v; z; j: }

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' S* f# ]: Y# a  U5 i) R$ I
/*
+ I8 P9 r9 G4 _' \% q* Check memory range for valid RAM. A simple memory test determines4 x9 v, M' w  F: A# X- Z
* the actually available RAM size between addresses `base' and$ ]8 ?! K$ x& C: U. ~  X
* `base + maxsize'.6 S3 o2 o/ J; X+ l& \6 v$ ?2 U. N
*/
7 Y' L+ F" s" e. Z$ ^1 `- Nlong get_ram_size(long *base, long maxsize)
" Q! ~! M" @) ^/ b' x- {{
* U( A, m7 v# P4 Z# |6 Y        volatile long *addr;
# F$ }4 M  {" q/ i( }" J        long           save[32];7 c  d/ [8 x! F( t2 K
        long           cnt;
- G& M0 M0 e# I8 b        long           val;  j( \6 J7 {! Z7 L
        long           size;
# {0 ]( \: `: t        int            i = 0;! ]) y: x6 i+ u4 N- f7 ~2 d1 u
& `* ]- S" ?. u2 v' b5 |; T7 i4 J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 Z& \! T; b; ?1 t6 |& G
                addr = base + cnt;        /* pointer arith! */
+ e' n, Q) M  ]                sync ();/ c/ |, M4 }( F3 Z) K" I
                save[i++] = *addr;
6 W; Q+ q: K7 d                sync ();
7 A; t6 N. i. k+ ]$ t9 L                *addr = ~cnt;9 W6 L- r% k8 W- h
        }7 ~' w1 I' V. J) o

& `7 s8 Z- h) r* L        addr = base;% x: p8 p7 C/ D1 a+ ~8 h
        sync ();% @' j/ E* z" U% i
        save = *addr;
6 H/ V: v4 g+ l( u' ]9 x+ k        sync ();
: h9 p" ~- F4 n! s2 ?1 I$ z3 E        *addr = 0;
: h2 r5 }! R4 e8 s. C6 z6 i/ y% N7 v
        sync ();3 I6 b- G! u' V% p
        if ((val = *addr) != 0) {
9 ^! e! D7 j5 q8 n                /* Restore the original data before leaving the function.
3 N0 x! a3 W& N' D' B* K                 */( p/ M! Z2 o, m. r2 R/ Y4 Z9 `+ w
                sync ();
7 Y$ S! x# N% E                *addr = save;7 u3 n) T2 J# A& {' G' B
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 j3 u- u# O/ X. `2 S# R
                        addr  = base + cnt;/ f" N( p1 l( b
                        sync ();
- P  M0 ]4 M1 C                        *addr = save[--i];
1 F, _& y$ Y; p! Z* t$ s. }3 `                }
$ v( n' X& i9 g/ }& R3 Q                return (0);
7 @' p/ {, x" v' t$ J9 ~        }3 A: z; g- `* ?$ z" D, S4 k

( z2 t. F- {& A3 Y3 z, _, q4 E        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, O0 ~' [1 G: _0 R3 E
                addr = base + cnt;        /* pointer arith! */+ x6 u5 ]* P. V3 T3 t4 b7 s* f
                val = *addr;
1 b3 N( ]' m5 F                *addr = save[--i];
5 q# c/ l; j! [( m                if (val != ~cnt) {
# s1 \" y9 P# E# T                        size = cnt * sizeof (long);4 g1 N1 W$ U1 ]+ v: r7 s! d
                        /* Restore the original data before leaving the function.1 g( C, h( }* ~3 D
                         */" D& {* {# N0 Y" M) s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* G  p% [: J" X& r4 X
                                addr  = base + cnt;
* o0 F) s/ W. @8 N2 f' w                                *addr = save[--i];
# D5 u# M0 e5 f( \: v                        }6 E; ]* z: E9 I% j) z6 K3 c
                        return (size);: ~& F3 k( C: S9 d) M5 t
                }' e# n: {1 ?4 I1 l1 g" l) _! U
        }7 v! V1 {: v/ F' W
5 x5 l5 _  \. d0 s
        return (maxsize);7 }8 [2 m; |8 j* \+ k
}1 e" A4 E8 M1 {. _
int dram_init(void)
6 J3 I' D" b' z; f{
/ l; K* D9 v+ K) v        /* dram_init must store complete ramsize in gd->ram_size */
8 `; ?* @8 d( q! {        gd->ram_size = get_ram_size(' [3 ?. Y& `  U9 y4 a
                        (void *)CONFIG_SYS_SDRAM_BASE,
' \4 Q& a' w/ t8 W2 c8 J# h                        CONFIG_MAX_RAM_BANK_SIZE);8 D/ P0 z( _  T' {
        return 0;* D. N6 R7 A1 L+ A% S5 c$ N
}, H9 o, L5 V8 j# s; e+ B

) z3 P3 {+ d3 S+ t( t, a, G3 S
9 g8 S/ ?9 O2 @- M3 r
1 q8 j  R  G6 F- K2 E6 A$ l  B+ V% y0 K! U9 [8 j: Z; n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 }! \) K$ W0 w2 |" {
* e4 {, N9 y, u  |
, e4 q8 k, V! U7 n- G  O1 {
$ L: Y: U* p, `$ T





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