嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* d! Z2 e. X% r$ }2 P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 s( V% O; `* L  u8 r7 p# u' w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 n( T% Q7 L4 p$ @+ K

6 e+ ]8 S: I7 ?- `6 p: T6 g1 c是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" [7 z9 t. A0 X
2 a: l4 k$ S5 n3 k7 J

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 e/ ^5 ?& _9 a# j# n  r
/*
( l+ A  g0 W+ Y& m: G* Check memory range for valid RAM. A simple memory test determines% m5 n) E+ |% j4 M7 g2 [/ [: U
* the actually available RAM size between addresses `base' and
6 D) ^4 a( f, \) u6 b9 K5 v" P3 r* `base + maxsize'.  B5 q. X+ k0 W  ]( V9 z
*/
4 I$ j! r$ c" b5 ^+ |  d5 ~$ olong get_ram_size(long *base, long maxsize)
( S' s' _- k1 _/ Z' J5 M{) W" ?& S3 P. w/ ^4 Y
        volatile long *addr;
) p6 U; y: }/ j" a: q: o1 N        long           save[32];
- t0 z+ R- Y9 J        long           cnt;
* l8 ]6 K( t0 _2 ?# _& i        long           val;
8 u6 H% j% L" ]! J( a3 O1 H        long           size;5 ^  I+ g5 O- l2 `0 ^$ ]# Z
        int            i = 0;
% U# P/ ^" F8 k* O
2 q! y8 j$ h% Z5 [( m1 K; U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 }0 L; x) F6 h. Y
                addr = base + cnt;        /* pointer arith! */+ V/ O1 L- M. R; @. i- F
                sync ();/ l; ]$ c% v: \
                save[i++] = *addr;
7 J- a* Z) j" c' ~3 x. f3 ]                sync ();
: U% E, `9 p! t) I) ^' _                *addr = ~cnt;+ m" K0 X" P$ f: @4 p  L  }
        }
) q# u0 k( t; ~; G* A! _4 v
7 c) k* l4 B' ^        addr = base;& E8 H+ b- C9 Z  D& g
        sync ();% `  g' n  b% _' q
        save = *addr;# ?2 X' a( r) o- j1 [" v' D' F
        sync ();
1 `& f0 e2 W5 }) |% ]4 H        *addr = 0;
% @; ?* n8 m1 ?" v# |- S1 @% k% v( `/ M$ y7 {" m
        sync ();% N/ h  W( z: Q4 m5 c  P
        if ((val = *addr) != 0) {* l$ R) S; L2 j/ n1 U' }' }6 |0 C4 O
                /* Restore the original data before leaving the function.. Q( Z. J- \6 S8 M6 a0 q' |
                 */' G  Q2 `3 o: t1 v# A( Y# f' r1 `: y
                sync ();
# |0 D+ ?9 Y) O                *addr = save;4 M" o& l' X5 f" O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ Z. V8 p' {5 X5 M) A' e7 M                        addr  = base + cnt;
0 ^' x( T, M8 w# B                        sync ();4 T; U, I5 p. B" L! F2 O9 }/ Q! [
                        *addr = save[--i];; H4 t" j2 p, x/ k6 [3 X" m; D
                }
& T# [# F, k, y+ M& \                return (0);
7 ]% R6 v. `8 Z0 Z/ V' a        }
9 ^. D. {2 f5 R0 M& D% H+ T7 ?- h/ W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  K3 e5 X: `9 K                addr = base + cnt;        /* pointer arith! */
8 k0 L% g; u7 O& C2 Z2 [$ |5 v- y* R                val = *addr;
& C* X+ ]* ]  R0 y/ v! s) n                *addr = save[--i];( ~" C$ E1 V- Y! j% D
                if (val != ~cnt) {
& T1 F% g! j8 v: l, q' v; C% g                        size = cnt * sizeof (long);
( @2 m. u' ]! b7 |* O0 K1 c$ q                        /* Restore the original data before leaving the function.
/ U1 _9 `, ?' m  V                         */2 O. o6 p  n& T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 M3 a+ ?6 J+ u( x" i                                addr  = base + cnt;
% f6 e* U' h. ^! e' G& M# F3 h& O* [6 P                                *addr = save[--i];
; o. b0 P1 Z' V! H# q+ a                        }  t1 J0 P: U! K7 D, ^
                        return (size);! }% T# r& S0 X# {5 Y1 N
                }, U  r* C8 Z0 R) G
        }% @8 Z+ e# W- d+ Z: h  g0 b

- P5 T  ~% d# _' ^( g        return (maxsize);8 a/ G" G  Y* G# V# H* d
}
- ?9 J& C1 ]- |& Q' W  V1 oint dram_init(void)) G3 b( L, ]$ L( v2 ?
{7 ~& e" i4 q) p( Y" j7 T/ X
        /* dram_init must store complete ramsize in gd->ram_size */2 d- C" Q; C1 v
        gd->ram_size = get_ram_size(. i. _/ k* T" Z3 Z' B5 u# R2 C
                        (void *)CONFIG_SYS_SDRAM_BASE,
& B- H9 s' S. A) p                        CONFIG_MAX_RAM_BANK_SIZE);9 [& O, H7 b9 ?! C* d
        return 0;1 t. L7 D2 B3 n, H/ G
}# ?3 {: D* ]  t% u. d3 `3 r
* ^5 k. A+ }3 ]

8 p! J! O6 Z, s- N! p( o6 Z8 ?" L$ |  F+ O$ ?6 e

- x+ Q; k3 @2 _0 M+ [8 E! G  hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 X1 b8 ]& d. p& p6 I( M

8 k  r  S) H4 N  c+ `7 z) W9 ~5 n" S

& W9 \7 {! h2 `# ?5 i. m* l5 e5 d




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