嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ u- X$ Q" Q' `* k5 q$ {. l" y7 x
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% ~9 M4 R4 m, c- I4 Y0 I- Q8 O6 \
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  u: V& P1 l! n' ^# u& C6 m, e
; T  h) k# O9 K& @2 K- z" c: P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 U$ V/ _1 C9 l
" R) h  V; L$ j7 R0 q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* W1 O& U8 v, b: L
/*
6 B/ J2 G' n* A* Check memory range for valid RAM. A simple memory test determines: I3 @9 b, F* X5 b( G9 X( R, p9 @
* the actually available RAM size between addresses `base' and
3 X' x+ q1 B' i! d2 }* @* `base + maxsize'., z: W, D5 M" g4 v
*/6 a/ P& A1 r3 j3 B  [1 S2 H4 z
long get_ram_size(long *base, long maxsize)
* ?. g; \3 |) `& w{
1 ]  N" L4 C; y& H' B# M& }        volatile long *addr;5 v3 y8 l/ B: D" S+ F
        long           save[32];
, I% v4 l. Y3 ~, R9 `8 R' Y        long           cnt;
6 D, r2 z  S( l5 u, G        long           val;
! b* F0 y2 h0 [7 c: N1 n& H# K        long           size;: [6 G- ]9 ^2 `9 c$ w
        int            i = 0;
4 E* u, R! p* {* e
. y3 _" Z0 z0 d, m/ k3 d        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 j+ v8 _' h8 S, j& j' e
                addr = base + cnt;        /* pointer arith! */$ E! Q, q  J" m) D# x- ~( p
                sync ();7 ~9 G4 _7 c$ A7 V( p: w
                save[i++] = *addr;
: t- f/ b5 L- _% v0 I9 o2 o                sync ();0 j, d& V$ d: n" p* S: l4 t8 U
                *addr = ~cnt;
0 ?9 z: R3 c& G5 d  s( o- f" X6 F        }( g9 }0 R8 e9 x# H
9 R, v5 o% E3 ~; C4 c
        addr = base;/ A( v7 g3 V& J* I
        sync ();
* d2 H9 r/ u+ ~4 i5 `) F, `        save = *addr;- d% ]9 Q1 @, v- V. ?8 U8 f
        sync ();3 t) N2 t$ S* v1 b8 Z. _) w( A2 Q/ F/ D  C
        *addr = 0;! Y4 D& ?3 \% g$ J

; P3 I8 q8 Z7 R. |; e9 G& X5 Z3 z        sync ();
9 [4 K+ z  k' R6 d2 Y        if ((val = *addr) != 0) {
8 K4 _- Z( t' c* d                /* Restore the original data before leaving the function.6 t7 b: f6 T- L; R9 l/ L
                 */
6 v% q; B% U* g  Z. |/ L& N+ T( c                sync ();
7 }0 j+ P5 ~+ R& u& S5 Y                *addr = save;
( B$ R( V5 a+ G! Z$ c2 g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 ?6 @: n" U, ?* |& s$ {4 J; o9 i( o
                        addr  = base + cnt;) o1 x, S2 l, X) [* A, V! e% o
                        sync ();# ~% X& o# S& Q7 `+ b8 a
                        *addr = save[--i];
. S7 P& b; v' G4 f# V+ }# A                }* H- e* G& @, p7 T, m; U0 P
                return (0);, f4 u, A) i. ^+ \3 g7 u. o
        }
3 A5 b5 n( B$ |# B" ^' ]
+ j' D. R/ i5 F; K1 h+ W        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" y9 Z6 k; C. w' p3 b2 Y$ l6 h1 J4 \3 y                addr = base + cnt;        /* pointer arith! */4 [. @/ c9 x) Q! V; y. J* K
                val = *addr;
7 ?  x9 U2 w9 n' E+ e0 U                *addr = save[--i];8 `# O  I' Z1 R6 I% Q8 m
                if (val != ~cnt) {
' ~; M' l5 F9 f. Y8 _! z& ^                        size = cnt * sizeof (long);
/ S- U" d8 m  d- E9 J6 @& K                        /* Restore the original data before leaving the function.
6 T  R% i; F2 I0 b7 F& P  _                         */6 {4 _9 G1 ]6 g+ Z* O: v' M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" Z+ c# G( }' s" H- f" u- s                                addr  = base + cnt;# Y  b2 ~# S0 I  Y% p
                                *addr = save[--i];
# [3 J7 u1 E: I- c4 O9 h9 m- s                        }9 q* D' c8 ~) o: b/ e- u. O: ^7 z
                        return (size);4 E2 v( ]% [! r
                }
" M7 T2 P: z6 [& h        }
, n: u5 m0 g4 @- g$ o7 _' R, N( X* j4 L: z3 C
        return (maxsize);
! I; T3 P6 i4 ^2 O+ X# z- j}/ h: e4 r5 m2 R+ M4 N
int dram_init(void)
8 d5 x, g' A7 s' [{
  F* G9 ~% v; m$ u" J        /* dram_init must store complete ramsize in gd->ram_size */( y5 E4 H0 K# z( E% @! I
        gd->ram_size = get_ram_size(7 U: c4 @4 `" b9 N5 X; Y/ ~; N
                        (void *)CONFIG_SYS_SDRAM_BASE,
& G6 P2 Q5 `4 \5 `) M) M                        CONFIG_MAX_RAM_BANK_SIZE);
7 ]; f1 j, J1 a9 |' M        return 0;; V' \( Q8 w6 G  ?4 R  A* z
}2 s: {" l0 i, l" ~2 G/ r& m
  g! U. W9 t4 I8 O6 u
$ M  o; s3 m* r: N0 Y
. H6 [4 ~0 m7 O! n
9 ^. s" }7 c- B. t, h3 B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( p8 j/ ?: K8 ^8 b* Y0 g, L: T" r" l% O6 c$ p

0 d3 v% A; G  y  z& }

, t) Z9 Q- y% a! l+ ]) E




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