嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- ^9 H  K) F; q* B/ N9 n: s8 C. f
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 Z& \' U' B+ v- o- Q; ]) k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ f; {" l: q+ Q7 E# g" {! t  {
# [2 q& z# o% f) P" j9 X8 n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 x( a7 w  p: [" {
+ B; D# `! q) U8 N: t8 k

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ C: \& n! ?, ~2 v. _5 R$ T; d/** P3 d  \! G3 F: C3 q# M+ H0 V
* Check memory range for valid RAM. A simple memory test determines
" B' t1 Y8 i2 _& y* the actually available RAM size between addresses `base' and
6 S, @  g# N0 }$ w& F' B4 s* `base + maxsize'.; s7 K( P3 p  }8 b4 ]( ^
*/- V+ N  i* {1 F6 Y! L  v! L3 g
long get_ram_size(long *base, long maxsize)4 x# X+ r/ |+ c' d' `3 ]
{
2 X# W2 z/ g# z9 e# R) u7 m! \) j        volatile long *addr;
7 l% P+ I/ {( W3 X- y+ Q6 m        long           save[32];5 t% v. ?) e3 P! @+ ]! }- j* l
        long           cnt;
( {( V5 I& q2 d        long           val;; y! c; C3 m1 w5 m8 z5 e3 W" w
        long           size;9 J8 U7 y6 b/ q* R. {' j) p
        int            i = 0;$ K. ~: @2 t# c1 U( V7 Y2 e  i; f
4 q# F1 J' u3 M% T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 R: ?; P! B% h5 G/ x0 Q" G
                addr = base + cnt;        /* pointer arith! */
# w9 y2 L# O& I% c9 }7 K+ N; ?                sync ();! W7 `3 d$ O8 ~; |+ R% n
                save[i++] = *addr;
8 \, j* d5 H  T% ]4 @                sync ();% I2 @2 y+ \  e* z% E, ^- W/ K8 ^' }
                *addr = ~cnt;; f' Z# C2 W* c
        }
  X: E1 X7 s: w( V* Q. `2 ~' X+ B+ @8 s. u: S, f# S
        addr = base;- D5 G/ p- p4 s3 I0 m+ F
        sync ();
$ R; G, I; x  W        save = *addr;' r4 _9 N; n* ^, S' w: F9 w( D
        sync ();! ^* a; ^; l) ~, f6 E  q
        *addr = 0;
4 p- f2 n4 Z4 A7 i; o
" C+ b+ ]$ P' u        sync ();% D1 R8 j9 v9 O/ J2 w
        if ((val = *addr) != 0) {! p" r: b' O5 j! n& B
                /* Restore the original data before leaving the function.
8 @% |( h9 Q) v. g                 */. P# d* t4 ?' {& @2 J" m) V
                sync ();
: [+ f6 X/ G- X3 c+ p% a                *addr = save;
, X, S( A! C( I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& C: ~% k( d$ p+ {' k' `                        addr  = base + cnt;$ Q) @2 T/ I: g+ e$ Z6 k
                        sync ();( D4 L; t+ p1 `) M& E
                        *addr = save[--i];
# X# @7 M9 M' F% q. z                }2 e( g. l7 l4 w. E, _9 A2 O
                return (0);
6 q3 y, I% x% N# F  j7 a" ~        }8 p% Y- Y9 E( g' E

. I" i$ n  A' b$ B. t1 F* j        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 r, S3 f. {' I+ C4 G) Z                addr = base + cnt;        /* pointer arith! */
2 q/ ]# w4 l( H1 M; }6 |                val = *addr;6 a$ G& q9 {" H9 {( j0 V; v
                *addr = save[--i];& C2 R4 e/ a8 T6 D
                if (val != ~cnt) {5 c# v  ^1 |. \9 B; M
                        size = cnt * sizeof (long);
( e9 I# J" [( c: ?. f& O                        /* Restore the original data before leaving the function.( J1 W! k* R* t0 l9 ^  Z' j2 K
                         */
+ H# ], I& ^' x5 w# x$ i  G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 s% d+ A2 [4 D7 K0 S
                                addr  = base + cnt;
$ B3 G0 C: n: H& p2 y( K                                *addr = save[--i];
" F. r  I, [+ k  q/ [4 @                        }
  l, G& J0 t+ s                        return (size);
" v; f3 k" u* s; h+ I# q( H7 k                }
  {' g5 E! r1 N' a8 |        }
9 {& I) ]; X4 V* h
" o  {/ p, ]6 s( n- ?4 P- H# b: [        return (maxsize);
& a: Q& K/ s0 p3 ^  {+ }. e}
, j3 t4 A$ O4 d) Y/ e) Jint dram_init(void)
) S9 l2 g/ I4 @2 \# A$ c8 Z{9 M5 d9 F: t2 I; p
        /* dram_init must store complete ramsize in gd->ram_size */  N3 ^  X; ?5 _  d
        gd->ram_size = get_ram_size(' E& C  g9 z- C: D& v8 u
                        (void *)CONFIG_SYS_SDRAM_BASE,
& q: W$ |. Q! u                        CONFIG_MAX_RAM_BANK_SIZE);. L3 ?" M6 c) S4 q
        return 0;
7 J8 B+ q0 a  D% G$ o) M}
0 [% o2 z6 r7 w  A& r: C8 A9 C: @! U! f8 x0 t  D

3 P  r7 y; i  T3 Z. @/ `! T/ m1 [6 m5 P$ A
& ^' J) c# x2 M2 k. b5 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) g, Y3 a; c, n% ~% _
7 a! D$ p: O3 @* X$ ~/ J

# f) u. b! o" h% ^: B: O$ o; O
& Z# L  r7 x- ^# s: T  [





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