嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% g: [2 }, v4 N) C! f. S2 F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 S- w& o, H. O  K" G* E这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( A* G4 n+ Y- B$ f+ x" X
: o. }9 ~8 F9 @* J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ ~; i: c6 x/ A& J
, Z, r+ w' V+ o- @  C' |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 F* H8 r, k! T* i. s+ g
/*
7 L& \, y) e. R0 I2 F( _* Check memory range for valid RAM. A simple memory test determines; b* z9 V- F0 x- l, w& N/ a
* the actually available RAM size between addresses `base' and
: Z* ^: a: n7 p; P4 F- o* `base + maxsize'.
0 {! I' v* J) \*/4 T" z% r: H& {* ~0 K% i
long get_ram_size(long *base, long maxsize)+ }+ Q  o2 T- H
{5 y9 w' Y! O' ~( G( i3 r
        volatile long *addr;
9 e& t1 A/ x& q/ z9 }5 l2 b        long           save[32];( s; q% C5 M$ v% k5 Z" ~3 q6 D
        long           cnt;
( a  ?/ L* D4 P$ q7 B        long           val;
" G% Z8 l* X/ u2 ?/ J        long           size;
4 q  C2 e0 [- {5 M" x        int            i = 0;& Y1 v1 R6 I& f; J& r1 a" W
1 B6 z: r/ A4 x# j. X# j' d1 I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 L# F: J7 c( J0 y# U( I0 Z; @
                addr = base + cnt;        /* pointer arith! */
/ q$ S0 `& F, L  _8 Y                sync ();. x8 P# o) j6 l# L' Q0 C
                save[i++] = *addr;
' S3 A# Y; j5 O# S% M; y8 x0 G                sync ();
' g1 o6 q; J; O+ Q, S! }$ P                *addr = ~cnt;. O8 U: u. R# g0 k+ X, G/ F6 w: q
        }
$ Q- L+ U* ^& W; e5 ?* N
$ A! H# e' E: A  `7 `6 f; K        addr = base;$ r- H3 P- }% \6 i& H- T
        sync ();, a% K6 ~& t1 C+ S
        save = *addr;
; ^* l# }: F) a2 p        sync ();
  D+ y* s2 E3 m% p4 P9 ~: q+ s        *addr = 0;4 y" u& B8 k$ N) s2 g
" ]% e/ P' @3 A& l$ |
        sync ();  R) x: o; P" q- ~! e) l. b  _
        if ((val = *addr) != 0) {. ]5 q9 C+ b9 y
                /* Restore the original data before leaving the function.
9 r1 i% ]! s+ j. Q; u: M# Q: z$ B                 */8 b$ F, @/ D, k2 @. ~, v
                sync ();  |! m9 p$ s$ x+ }; D
                *addr = save;" q, F0 s% y( u! I5 U9 j+ o: s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  y6 [* u5 R9 m* v" H
                        addr  = base + cnt;
; A3 T" \4 @5 C2 M+ F: m                        sync ();
1 j4 p6 a% w, L+ R                        *addr = save[--i];6 P+ B- @" V, q* @  |/ n& A5 e
                }, G& u! H7 K* D( a' C
                return (0);
8 r+ ]% c  c/ C. K0 Z        }
5 e1 a# ?0 L8 q' {7 b
7 a+ h; D# ~8 f: ?+ |/ `5 g        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! w3 I1 V4 f) X6 C7 }6 O/ c                addr = base + cnt;        /* pointer arith! */
+ b- G9 Z' T1 ?" a) v                val = *addr;
0 o0 v0 b2 q+ i/ `, ^0 H0 u                *addr = save[--i];
  E& N( b3 S8 C; {6 W                if (val != ~cnt) {
4 C+ ~5 @/ ^' l& q( B                        size = cnt * sizeof (long);# K6 k; J4 v- k/ Q  H
                        /* Restore the original data before leaving the function.1 L& c! L8 d; P3 ~* q! J8 h
                         */7 s7 U/ [: n& {; d  _4 u" p0 H/ x6 J
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 O; b0 a- U% _* J$ M- j                                addr  = base + cnt;. ~/ \/ Y* f- E9 t
                                *addr = save[--i];
8 K+ B* O# U5 M0 H) ?                        }
% Y6 z- `' `, G3 M3 @( w; W9 y: y                        return (size);
& g  e" A: U( t! g* j                }1 {4 Y# j2 ~2 Y6 t2 _7 L
        }
! b& n* j: L1 ]9 J7 e/ g' \- f1 _2 B; x+ K9 a7 I
        return (maxsize);
  v% B( u6 k9 L, M( @/ w}! \* E6 |; b# k% ?
int dram_init(void)& `# J- i5 ~! k- Y
{. p* z1 }# I: u6 F8 W9 {
        /* dram_init must store complete ramsize in gd->ram_size */
1 M/ X, f8 a4 C: c: Y        gd->ram_size = get_ram_size(
' f- x9 I' b+ x+ O& o                        (void *)CONFIG_SYS_SDRAM_BASE,
) r" N; o, T# m3 A  m) E+ W' B) }, G                        CONFIG_MAX_RAM_BANK_SIZE);4 f1 ~5 O7 F: S8 h( L4 H2 X; |
        return 0;7 M2 ~9 {& T4 _8 i5 @! ]( }
}1 z6 ]& X, p: C( ~+ m  ^' M

- g' g- a6 u  V( I! W2 O# i' ]/ K: ?* \' A+ q
' X7 f, S3 y$ f5 A# y
. h( k4 l5 U+ C* x- m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) g" A# ~; o5 {2 @7 V

9 ]" @% F7 J: f+ c3 j, e! @% P
9 Z/ U6 d" X2 l8 g" \
0 _) ~' C3 k6 p1 L0 \7 b9 }! F





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