嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" h$ I5 W! N! B  A% H% h; j核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 {1 k! ?; z2 |7 @1 X: P- c' M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' u7 P2 X" B2 V$ T5 l  n7 A
0 Y2 I$ _" e7 [1 K: u" o3 D' f
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 }1 H3 e' m+ Q7 Y! D2 q5 g# Q
% p! W5 p' f' c  p/ z8 M, F. |7 f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  e$ ?+ W2 V# R) r/*
5 e/ O% w' d% }4 N( }/ l* Check memory range for valid RAM. A simple memory test determines
2 s7 [' b( X' A9 ]% O1 G" K* the actually available RAM size between addresses `base' and
4 |* O/ B6 C; R* K7 w' u0 {* `base + maxsize'.
  E( L# k' e9 U*/
) Y0 x; P) Y7 U1 u* f# c- ?% mlong get_ram_size(long *base, long maxsize)
* ?& J% E8 H% q' A$ B0 {/ h# |{5 L. S8 {5 B. N  |& O- h  h3 o5 R
        volatile long *addr;& Z; p; {7 _1 K0 c- f- h
        long           save[32];
0 O) K8 q. o' p# E  J2 D, N        long           cnt;; J5 L* l. Q; |$ D3 n9 @
        long           val;
' E4 X# m" N* X/ g  v        long           size;9 W5 @1 x9 |3 j8 X2 @& E$ ~
        int            i = 0;0 g) Y( _8 B7 d8 I$ W( w$ }8 q1 u

$ z, p) b5 r' _& f4 l1 s% h* r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 z1 }1 [8 U3 B8 N6 U                addr = base + cnt;        /* pointer arith! */. \5 r7 f1 c! s5 A
                sync ();
' A- m1 K4 D6 G6 F                save[i++] = *addr;
) e* ?% E, n  q+ e: u+ v, h( D, N0 ^2 a                sync ();6 d" M. x% B8 k# j
                *addr = ~cnt;
0 o! J% R4 G$ [$ P0 u% V; r        }
. J# ?* \. a2 Q' g1 r9 e
. i* b! r* v2 B" R' ]! V" m. x        addr = base;
2 g& d+ j5 U/ a) S3 o. Z        sync ();
" G7 ~# @. O' c) ]2 Y8 ]* z. e        save = *addr;
6 m( T9 r% n( k% C2 d# A        sync ();
, d, e' y) \8 P( s* `$ u2 j        *addr = 0;' n. J- f' X( [6 [& ^- Q7 d# D' C

  f: ]: q- n' W; x- F% e        sync ();
: z" U4 W' m' ~/ K- ~        if ((val = *addr) != 0) {
; C* I" m0 A4 Y/ h0 j/ C2 @                /* Restore the original data before leaving the function.
- B* z8 N# Z; g- U3 p/ |9 ~( H                 */
- X5 l7 K% M9 E+ W                sync ();! r0 V  b) v# l* X4 d0 c; }
                *addr = save;4 O4 ~4 s7 A, V# a% j$ N9 N. v
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) U( O8 `& Y# Z  J: b) N& g8 j                        addr  = base + cnt;
* h1 r: j  r% B9 M$ p9 @; Y  N" v8 b                        sync ();
: w1 Y3 s' H* t! C- F                        *addr = save[--i];
- f, }0 y1 v' W                }! R8 W$ f/ e9 f* i  V
                return (0);
6 Z0 K0 e# V9 K' A% Y9 u        }7 |& c) F7 f3 l9 R& i

' n9 @$ R  m7 ?        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 b* @6 h( V. }- I# h                addr = base + cnt;        /* pointer arith! */
" v/ O( i" C9 F' \, I8 f+ h                val = *addr;. X' I. K1 _! u8 F. E. e: A: R. }
                *addr = save[--i];
( Q: I+ Q# k" r. ]1 Y                if (val != ~cnt) {
; Z$ b! A% k+ w; t9 ?                        size = cnt * sizeof (long);0 t% q: j" Z) P! x4 ?4 b
                        /* Restore the original data before leaving the function.. g* F+ c% g* j4 n: J3 Q
                         */+ {4 k6 L) ~. ^. ]9 h/ i
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. G6 a, t8 Y: Y                                addr  = base + cnt;
+ b. _6 q$ p. A& ~, ^                                *addr = save[--i];
4 H% x4 |5 V  F/ P( H; ^                        }; ]+ t- p, }( p. M* G2 Z5 k  F
                        return (size);" Y( A, o7 g, I. }
                }. s2 H7 ?% A% @1 e4 P3 r5 f
        }
+ O+ M) f* i. D% P5 `# ?, w+ j& }2 m
) v: P  p9 D& l9 }( h        return (maxsize);2 @4 h/ c2 B! M0 B) |- Z2 b: V  G
}
& D" @) x+ U0 |; d2 d6 B1 V0 lint dram_init(void)2 y; b" S/ k7 [* k: k: H
{' D! O9 [# O/ e  B/ ?" `
        /* dram_init must store complete ramsize in gd->ram_size */. u# F2 F, o  N# |
        gd->ram_size = get_ram_size(
5 x" V' \+ h7 _% t4 S' P( I                        (void *)CONFIG_SYS_SDRAM_BASE,
" v- g6 c) R3 u2 R; ?  I( U4 S( W                        CONFIG_MAX_RAM_BANK_SIZE);% F- _0 I  V: q* L. U
        return 0;
4 {' `# v% ]( Z, {' H+ z" \' Z2 E}
9 u' {! ?4 v) c4 [' i. d9 X) J
0 k! v1 A% N9 J7 a# S6 b' w7 x
, q2 ]2 O/ X6 s: n; W, Q+ H# t- `- d. z
! ?' r- N/ h" f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 y2 K5 D* w$ P  [/ Q3 Q6 u
% l0 H( t0 j0 J! d- e: [2 a) ~: P

  P4 g8 A  M. ]) W4 n& n
' ?, X- M( T' C  B5 r) p





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