嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) `8 J" c, p2 e4 {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( {! j! G- a# g+ v; L) H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ Q- H& O1 c* z- A+ w) _
# w3 b5 b2 p% ?3 v是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  d  o8 w; q$ K5 y! Y& A1 T- G

4 n( f! q# g% e7 V7 o
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 m& I9 T* e7 H9 c% z5 D% ^
/*) E0 u; O4 A2 ]
* Check memory range for valid RAM. A simple memory test determines( D7 p! M+ w- G" F# l
* the actually available RAM size between addresses `base' and
( c: A" b7 B( H( k9 U) U1 o* `base + maxsize'.
' P; m9 i, m+ v, i) r, b  b- m2 o/ @*/
( Q8 r' W2 R- C0 olong get_ram_size(long *base, long maxsize)2 j% t, r! k) x6 |6 m
{2 V6 v8 ]& |1 M
        volatile long *addr;  d. |: [: a$ v3 d. H% j: M
        long           save[32];
: p/ y1 Y2 W) V' g! X; g. z        long           cnt;
4 s) g6 N/ v7 d4 t0 O/ p        long           val;
* C( U& A4 l  @' Q$ W0 V        long           size;+ i' K5 P: f8 Q. d
        int            i = 0;! v1 X# [# }' c, F
: E6 m( b+ D7 J5 V/ P$ k" e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- x8 H  }. H/ t; D4 h7 d( B                addr = base + cnt;        /* pointer arith! */6 i. c% V' w- u' m# a! K
                sync ();2 w- m' T9 n" `  x  o
                save[i++] = *addr;
) }( l- V" r! `6 H; |! {                sync ();; Q5 Z2 e- z2 v. C
                *addr = ~cnt;8 B7 ?9 b9 A: m( Y. [2 C6 W
        }
8 d6 a# n9 W9 L" d9 v- E$ d* {) P9 }! z& s* l
        addr = base;; L! y* Y! C; D: _- g! S
        sync ();, @: X5 Y) c/ g' E
        save = *addr;, n& V! p" ?* h' ~8 x
        sync ();
: d2 i* g  ?, a& u/ r        *addr = 0;6 ~6 b  ?3 g0 i- u8 X4 s

- y2 R2 Z" h" `2 J, A, u        sync ();
/ [# p/ B; o9 @7 B% H$ M: T        if ((val = *addr) != 0) {, p% s) e9 K. w# k
                /* Restore the original data before leaving the function.
! {# K; S' c- Z3 \5 d- L- A5 {                 */
7 [; a5 Y2 u6 e! Y3 _, L                sync ();
! k& T, K- h+ r+ X  z4 q' ]                *addr = save;
% e2 @. F+ \9 c6 `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 R6 h: Q0 N# R; W9 u4 w8 b                        addr  = base + cnt;# h2 z. R" n& b- x2 j' ]
                        sync ();
" U! K$ j0 T5 _3 _                        *addr = save[--i];$ x( P- t: H4 p9 \) R# \
                }3 d2 ~$ b; s2 d$ x. u' _: ]
                return (0);
7 |7 S& g- A& g( S8 j% i, l        }
# v$ S# w. h8 @6 D( q( J+ H+ X8 ?, o, N) l6 R/ V1 ^; K, _
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& N- U1 Q$ I8 V7 m6 r/ V
                addr = base + cnt;        /* pointer arith! */
* Z- }! K& k5 m/ Q" D, v: G                val = *addr;5 _3 j* c0 V. \0 E- F% F
                *addr = save[--i];
6 X0 a0 B: ~; f- t% A0 M5 a, W% o                if (val != ~cnt) {
0 M' \) J$ c3 j+ @                        size = cnt * sizeof (long);
+ S) J9 \- }1 r: Y; b                        /* Restore the original data before leaving the function.
/ y( K3 ?2 R8 k; _8 o5 h; j                         */
( f, Q! S$ m6 e- m" w& A' }                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# h# d0 p/ F1 x* o5 ?" z% G' h                                addr  = base + cnt;
3 i2 n' Q9 U' N                                *addr = save[--i];( M0 S4 i% I0 F; s2 y( Q
                        }% _' x) o9 o( O
                        return (size);8 }% K1 J7 j* R
                }+ T) A* {  Q6 d. F/ e8 t$ K6 A& ^
        }/ h) g- N) W  m2 g- F

' v- }4 H/ N' V9 f8 U        return (maxsize);
6 L% K. h) B7 a4 i}
# v+ C) S( c, n1 l% @int dram_init(void)
9 j4 c5 I# t% X! M) y5 U{& U8 ?( [% d5 T; }
        /* dram_init must store complete ramsize in gd->ram_size */
' x- K, L2 K+ G' r        gd->ram_size = get_ram_size(1 P3 V* ]& a2 u- q5 g% g
                        (void *)CONFIG_SYS_SDRAM_BASE,
" [( M; ]6 T2 v& H  }& Q                        CONFIG_MAX_RAM_BANK_SIZE);
' L! k; H2 D+ h) G7 u# a: K        return 0;+ x  A& d* l9 I) l# O, h/ x
}
" I: C# T0 d. \" Z, q8 p2 K- d& ~  y! {9 D! y% r

1 @7 W  W% E1 u6 _2 Q( _
6 F( a7 f  a+ X- x2 \6 r, ^& Z1 u" o; ~8 |/ T2 L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- i4 y! I  \+ f) E6 M9 s; j5 ?& W* d" z' y& \
7 y& E; r- f! C" P

8 w) _7 B- X0 c! P




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