嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. ?0 P4 T8 P6 d2 I) p0 k+ Y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! F7 o9 e) V  b2 S这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; E1 {* d  h5 Q  K, S- e6 B

% s% f' h4 l1 D& e" x+ N7 r  l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 ~& H# n$ z1 y5 B) J7 q  _
& t; r% I# [5 X" U! V3 |& C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ t6 v; E) T* N/ i! Z9 J( \/*
5 a% g' E' ~+ ^- a8 V& {1 x* Check memory range for valid RAM. A simple memory test determines1 j0 i4 e4 h5 [+ v% z
* the actually available RAM size between addresses `base' and4 R9 w+ p/ l0 q2 f* ?
* `base + maxsize'.
# m' q. V1 v2 k% X*/
* Z% O7 x% C, _8 ^! }long get_ram_size(long *base, long maxsize)
0 D6 _9 ^% F' z3 Q{
& ~) k" w' r  E" h        volatile long *addr;1 @/ J/ L1 `  N) j, ~
        long           save[32];
5 T: `) c1 C! ]+ `0 O' ^2 ~% t        long           cnt;
6 j4 J, F# o3 W2 b0 q6 p        long           val;
0 D6 k, T2 k. t/ O  u+ ]        long           size;; e( q; e1 i. g. t  z* X" o: \
        int            i = 0;
  `- ?4 {* I, P
: q) ?" A" `% U' q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- D+ E& @! ?7 Z" x: }5 o9 K" f
                addr = base + cnt;        /* pointer arith! */
. w. P3 H# r- q5 {                sync ();, o, j  \3 O/ Y
                save[i++] = *addr;
& [0 T* S1 \' V' V# a                sync ();+ X4 ?0 o* O; Q: F
                *addr = ~cnt;
) q& F. _- m% e4 \5 @3 N- J$ F        }( w* f& |1 H' H5 T- b0 E

1 r5 T0 U# a+ f1 T% r2 I        addr = base;9 _& `! E. A# E3 ], Z2 x5 ~
        sync ();: p" O, m" `2 F3 ^, c2 t
        save = *addr;/ q4 X* Q( O+ Z8 x  B
        sync ();, b& d" g  i& u7 V8 g4 A: F  {
        *addr = 0;7 P5 u0 R) V( d( Z* G2 \$ W

, f! Y: T& ~8 T5 S( [) A* g        sync ();+ Q. W4 F8 y& Z- Z0 G9 x. I- S  j
        if ((val = *addr) != 0) {" |% }1 @" r8 ~& Q5 V
                /* Restore the original data before leaving the function.
- i2 Q" Q6 F  g6 u3 ], q                 */; r: E, X) F% f7 e
                sync ();2 o* v3 ~% S2 Y' k
                *addr = save;
0 K% d3 K* `+ v! v* h+ k( C: c                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  {6 o) {* Y4 @! r" [
                        addr  = base + cnt;! ~4 A. a+ L8 J  |( g
                        sync ();
! E- w) `8 \& T) i* R                        *addr = save[--i];
% g& y9 I$ V3 V, [1 Q                }
2 O' L; E# M8 S3 z' a! B# C& S                return (0);% O4 X* x( N* u- S+ r! o2 _
        }
- j* h5 B/ r. l4 s. E4 T7 A( n5 Z! d  \# g2 Y+ g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ s9 Z6 R1 ~( E" U% `& |* c                addr = base + cnt;        /* pointer arith! */& ^7 N% Y) i2 U' }
                val = *addr;
: Z8 N1 d8 m' T9 Z  [  D/ C                *addr = save[--i];
0 |' Q. Z' G, p9 c                if (val != ~cnt) {. Q5 @  N9 {0 I% t5 W) a. D: T* j
                        size = cnt * sizeof (long);3 e$ l' V6 L0 B: k. E
                        /* Restore the original data before leaving the function.! g! H: R* b4 |8 y1 s* C/ J
                         */
0 Q/ N- R$ `  D! [5 k2 O, k                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; F3 d% Q" E3 D$ ?4 j                                addr  = base + cnt;9 @- W" f- N9 A' Z" i: Y0 L
                                *addr = save[--i];
  U( `$ O" O" k* W( U                        }
4 i5 I& g6 v1 D- E/ v6 P+ S                        return (size);! a, w0 P* {/ t2 e0 A- L& d4 X6 }, r
                }
) I3 F; I4 T- ~/ V5 P( ~  H9 ~# X" f        }) J% K6 r- a$ z

8 ]9 o5 j: b0 `) o' H        return (maxsize);
( M6 \9 N& R" X8 P}1 Y8 c- F4 x& J7 s: t1 m9 |
int dram_init(void)
' p9 {- k, _2 @$ }4 C: D$ ?" j{% v& X# M) S9 p! \9 r4 p
        /* dram_init must store complete ramsize in gd->ram_size */) p9 {1 T! S. S& h) ~2 i
        gd->ram_size = get_ram_size(1 z$ d8 q8 a% ^) E% B4 Y
                        (void *)CONFIG_SYS_SDRAM_BASE,! }- s, i- F) N
                        CONFIG_MAX_RAM_BANK_SIZE);
, L1 A' B1 |4 }2 E+ B6 K9 H: i$ l        return 0;
% l( ^; d+ d4 V" j& ?" S- m' d}
( M+ Y7 ]  p1 N8 ~: U; y' Q0 T  t2 S7 L" s4 P$ U4 B) @; k
2 y- ?9 u' n" ~0 k4 X9 z
9 G* L0 \3 E! R, _6 i' t

8 h* l) l7 S/ Q2 S; T5 ?/ k1 lFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ P+ f$ j9 B! R$ T# Y

/ Q1 t* x! P2 |! Z4 G- U: U6 {) G4 l' O

0 w6 i# z' u2 x) H/ z4 P) |6 {




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