嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ Q, n) @: g- w# c0 j2 Y* |7 ?. V
核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 f! N7 `: R0 J9 D- ~& L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 O7 }6 ^! ^3 A5 |; c' L# O0 m2 G$ |2 |  J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 x3 z, N# w5 E  f2 O: u# z
  ~8 L' j; \2 T( I
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 |( {/ S, f0 I7 ]/*# ?/ d; L6 @5 v. N/ k; ^
* Check memory range for valid RAM. A simple memory test determines
5 X2 y- y" e: c0 e* E# t* the actually available RAM size between addresses `base' and
. ]# U; O0 v* A+ o% m5 c* `base + maxsize'.! I$ y6 m3 ^/ O: ]  }  ?$ L& x
*/) k1 J( \" ]) Q. ]) @/ P
long get_ram_size(long *base, long maxsize)
9 Y' T! C2 M1 W) B! h, U- S{
: Y. [+ N3 q; v: k        volatile long *addr;
' f- L5 g9 ]. A- X2 s1 B) O9 g        long           save[32];
- }% z( S& o! m        long           cnt;
$ b7 c% X* k4 s, j; L& a0 k        long           val;
! u. r6 U9 ]3 k* ?        long           size;
8 y$ w; B$ Y5 L4 a        int            i = 0;
) T( y1 J0 `# B$ V5 W9 w& @# r0 H6 d( w) _( V9 v0 M+ V0 z) J( ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 l% W0 Q" I9 Z9 {4 K
                addr = base + cnt;        /* pointer arith! */# O! D7 S% r, f, r# L
                sync ();
7 A- P  `2 V. G1 |" d8 L  E                save[i++] = *addr;; `) e9 N. q/ e6 ]4 k
                sync ();9 j6 H7 F, S- ]3 D
                *addr = ~cnt;
  z9 S7 z4 Q$ u% C' r        }
% Q. w: v+ S% q" K4 }* n* P$ J" D% |3 g1 B8 e/ Q( V! I; p$ U
        addr = base;5 h/ o2 |9 e. X
        sync ();
3 z3 W. o! s2 @- s& u8 c" }        save = *addr;
/ U# X+ e# Y8 G8 _5 `6 y        sync ();
$ N8 W6 p% u3 Q2 K6 t- n        *addr = 0;
; v* h" q# D2 @% G9 T- T/ e) O8 l  h% n  \7 Q) w, W
        sync ();
1 }$ P9 Q+ b9 Q6 }- t" s        if ((val = *addr) != 0) {
- X) _$ I& s& H1 ^/ O) u- U                /* Restore the original data before leaving the function.
8 ]1 W+ Y# r$ A! B                 */
5 {# q2 [% M0 B) V                sync ();
9 a6 J6 _' V3 o% t  Q% V+ G                *addr = save;3 N1 t, q) B' T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* A0 u) u& m6 Z% G! ^
                        addr  = base + cnt;; }8 s4 J1 q7 s2 T9 J
                        sync ();( q1 ?- Q+ S% _# ]% U0 v2 {
                        *addr = save[--i];
4 o3 g# ]7 W+ _8 K5 J! U4 b                }& o1 p: R, E+ T8 |
                return (0);
5 W+ g. @4 i: {6 c        }
, s3 [# C) X& j  K6 E* w9 g' \) y; t; m6 r, \8 l
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- q! L. F1 g0 V
                addr = base + cnt;        /* pointer arith! */
& G' q* k& s6 z9 P0 I                val = *addr;
1 z4 E, g- g/ L7 j6 _% q  t/ A# N3 ?! [                *addr = save[--i];
! N) Z0 _+ e, @7 d# Q! S                if (val != ~cnt) {
% M4 E6 n) X* x, S3 r) [                        size = cnt * sizeof (long);: H3 b* e) t+ Q
                        /* Restore the original data before leaving the function.  ^+ Y+ r# M& B8 N" k3 K2 _
                         */! J0 r8 |- h: x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ B& e* R7 F/ m4 h                                addr  = base + cnt;
$ S8 v% D- o! m/ N3 i$ C                                *addr = save[--i];
5 M4 M+ s, _( Q& W                        }/ ~& k. X" K: p2 I5 f
                        return (size);
% ]1 i: `2 s, [; X: P0 p. H                }
, H7 Q5 ?/ h1 r% O; \        }
+ W2 \' y1 I8 a
) a" ^; ]8 Z' P' i; P6 |7 h8 d        return (maxsize);
4 E/ o6 G  g$ T" Y6 Z6 R}
7 }& @3 ?9 ^3 ?$ e- ^int dram_init(void)% N% p" {$ q4 d: t( Y; D
{& z% I9 f: d1 [6 I0 b, ?5 }+ K. B
        /* dram_init must store complete ramsize in gd->ram_size */
" A5 i( _% N  @5 D! C  z. h        gd->ram_size = get_ram_size(
, K, J9 ]9 D9 @+ d4 y% A                        (void *)CONFIG_SYS_SDRAM_BASE,
' L" u& {  g2 g% F1 Q) }# n! {                        CONFIG_MAX_RAM_BANK_SIZE);
) G3 T7 r$ p- W( J1 q$ ]2 m  N2 \# h        return 0;
5 v" _" H/ F7 T}
# U+ r, _, L" T+ C, D7 e  E& H' I; m. y% g

6 H) e* J& W2 N
4 V& Q& h9 m! i" \' _
/ A  f1 p* V! F: TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 B, c6 C/ \) K% L( V8 p

  u7 Z+ Z: H' C, H$ d1 C; ]: F4 Q9 e6 P/ ]7 U" s9 {9 K# ~5 r

/ u" D& Q! i: s) O4 v; _- m, @* Z




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