嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 N4 Z3 |$ L) _核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ [5 d5 ]0 R7 S" B* \4 ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* A# C, `+ K% S+ |! d

9 j5 W) d& f' v3 p" ?$ V. Y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 v2 z% D2 G# e/ p; S" l6 O: S. P  Y$ B/ Q; I6 I- d! i0 a9 X

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# ^$ r1 ~7 z+ ^; i4 C0 ~* A/*
. I9 p0 z/ F, l1 B* d* Check memory range for valid RAM. A simple memory test determines0 F. X6 Y! c2 d2 M$ n: d
* the actually available RAM size between addresses `base' and* k4 E7 s2 F/ ]
* `base + maxsize'.# j. B* f- H- G# C8 N2 S4 l
*/
) r; h. [( _% w4 G* Jlong get_ram_size(long *base, long maxsize)" X- }) F) V" l, {
{
" [" f: y" B0 {+ \% ]        volatile long *addr;
9 z% S& k1 a4 |$ I+ e# Y        long           save[32];. t) Z+ {) d% j4 S3 B& e; S
        long           cnt;, A, {7 p8 \; Q
        long           val;% {! u5 [6 y! w
        long           size;
9 `' I. \7 v: y& `        int            i = 0;
- {. ~/ V/ o$ ^" g5 M
! S6 u4 `) F) v4 \- P! q) O/ `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 O" x0 X" m9 J( f& }) e+ Q                addr = base + cnt;        /* pointer arith! */, M8 q' Z8 e+ s3 ?8 u
                sync ();5 g; ^5 j+ }7 R2 x1 T& L
                save[i++] = *addr;
- m& W- l* @6 j" M+ K/ s% ?$ W                sync ();
$ t7 u  v' t# R+ A0 G( \7 @# L4 _) t                *addr = ~cnt;
# D: a4 _9 {- b# A; a( m: Q        }
- b4 V( C' K! Y2 r* I9 v# ?& d) F9 J4 Z4 \1 |. M& P6 x# P1 ?
        addr = base;
( S2 d9 w; A; H  X) Y        sync ();
1 @3 t' `6 b% [$ u( V* ^        save = *addr;# k) ]( x% u! D2 t$ q+ D# p: G
        sync ();
6 a# S2 ]& @" T( E! W7 S% W        *addr = 0;9 d# n2 a* E8 Q$ Y
# }+ D$ |& b. x" b( z
        sync ();
1 D1 x  N* v& D7 Q5 ]. `2 c        if ((val = *addr) != 0) {
4 T# \3 C: `3 W, n                /* Restore the original data before leaving the function.
  F' z1 S, ?6 K$ b' e% B                 */
) U4 c* K- s9 p( C+ W- q                sync ();$ |; I5 h1 Y# O0 V% y/ B( E
                *addr = save;
1 r$ d6 T* s2 b$ O& z* f$ l! b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ @. p" t+ e, O7 V$ }& l                        addr  = base + cnt;
8 s) @8 M& H( u9 n' O  g* f" r/ R                        sync ();) i) v7 I4 U4 I' c' O* n& ?; O: m
                        *addr = save[--i];1 D3 U) _( M# S
                }: B2 E; B5 |+ b  n" u$ b
                return (0);
" \( V5 e. ~" G; y2 v        }
, {4 b8 I; p# X+ z  o9 \: d! d8 M! i# G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 l1 L( p1 H3 q" l
                addr = base + cnt;        /* pointer arith! */3 r0 d  p( e; @
                val = *addr;
! S, f$ g% ^& P1 o. [2 Q- h                *addr = save[--i];- p: \. I, @: G  y" l
                if (val != ~cnt) {' G! j% d; F. W/ u
                        size = cnt * sizeof (long);' J4 R" J" z* n$ b
                        /* Restore the original data before leaving the function.7 x! V; o# o, l4 e3 j+ _8 c
                         */
! C% O* t2 R; r9 H4 d                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' H. N0 T; S2 ]7 a( A% J1 C                                addr  = base + cnt;
3 E2 I6 z4 X8 h/ l/ w: M" v                                *addr = save[--i];
) A% D: [& y/ D3 U) ]                        }
! |& ?* I  a; P                        return (size);) c2 F+ [7 O  O& k
                }
* B7 l4 ^. d( _* T1 |        }
0 X8 w- X! j2 x- M) t
# s' E: _. r5 R6 a; P2 E4 O        return (maxsize);7 G: i+ l, D# g0 K3 N
}
: R3 f  T/ ?0 g- bint dram_init(void)0 x& c4 d/ u' G& V) j
{3 z+ N1 z$ p% O: _5 G
        /* dram_init must store complete ramsize in gd->ram_size */5 q9 B1 j3 N% ^2 P1 }$ q* A
        gd->ram_size = get_ram_size(
2 z2 E- p8 {/ D; K" _( }; }2 l( D                        (void *)CONFIG_SYS_SDRAM_BASE,
  t' R& I' @* z3 S* r, k                        CONFIG_MAX_RAM_BANK_SIZE);
2 F/ k& j  u6 \4 C7 D# z        return 0;
, L0 G6 i! O( O' j: z}& n: G% N/ p6 B3 S  {$ @
1 c4 n9 L- b+ G, D: y4 ^3 H
  ]$ ~( O3 F( @7 U

% K6 t3 V: `: x& }% c
" L8 g5 i# n' ^% @8 PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. l4 Y& o5 \9 h  H' h5 d5 V7 \- i$ U
/ Z" I2 ~, q4 ?' E) ?
4 `+ W* ]; V8 A5 ^: j* _* |





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