嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! `# ~5 w$ m! ^' e) \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 d# H) h+ L/ E* A" ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 Q4 W4 Q, U% c! m' b- x$ ~3 w+ A
" [2 K2 u+ u9 F! x! {8 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- i4 O/ x9 r% O) q& r! k
4 T  z: C- y+ T9 _( T5 w9 e1 ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% z1 N: L$ e2 d
/*
( @% v1 S" ~* T5 I- K- N  N* Check memory range for valid RAM. A simple memory test determines' c3 }) A" o! [
* the actually available RAM size between addresses `base' and
0 d+ e; u8 b, I) W' p* ]" q* `base + maxsize'.
/ O  k2 i. r0 ]: i) s5 ?7 p*/! _$ I. E) ~  w& d
long get_ram_size(long *base, long maxsize)6 o4 A3 c1 K& m4 b2 l5 O7 K' U
{
) a: E: D6 V, U3 g        volatile long *addr;
( t' w0 |: m9 s2 s3 X  v8 ?. b        long           save[32];
1 W0 A# \+ X1 k- j6 r        long           cnt;- @( O  s1 H; F7 ~( Z3 [5 f# B: o
        long           val;2 }0 n& _( t" @$ I+ u) d: a
        long           size;
3 M) B/ N) [/ q6 l2 D1 i, R) u        int            i = 0;
- u' i, k% Y4 w$ I  C* Z8 T  i0 V! ]6 B' j2 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, d) b- F, j- K( {/ V                addr = base + cnt;        /* pointer arith! *// @' B6 @; K, x  I$ v: r
                sync ();, @/ E; E0 N  S; z! k
                save[i++] = *addr;8 W/ i+ Z9 z- q
                sync ();
" J9 r& S5 X) V! B- M) O; ?                *addr = ~cnt;# ^( A+ h2 V& A1 k# c0 M4 E3 v
        }
, Y- v3 ~3 g+ D
5 R; s+ _6 c1 Z/ k1 v5 D        addr = base;- B! m% r, `7 \+ B
        sync ();
# X+ d# w  {) ]7 I# r0 e) R, ^        save = *addr;
  U" h3 w/ [$ e1 d        sync ();
" o  |/ X* \; u) n) \5 O1 U' h  _. i4 _        *addr = 0;
$ ]' n- w  p2 Z; j( [, L8 i% C% v- N" t
) D9 ~7 V  k( W, B        sync ();; o! m9 A) e4 N1 c( s- e
        if ((val = *addr) != 0) {! j* x4 w9 C& {3 a  ]
                /* Restore the original data before leaving the function.5 b! i' S! a# R3 F4 f8 r- c
                 */- p+ T; b0 B' g/ p0 W* f! G. `
                sync ();
  B, L, \. z5 E8 L                *addr = save;
4 _2 q3 ?8 H6 d$ Q( K1 X. T* C# l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 q, R+ E. a+ X                        addr  = base + cnt;3 D4 C& q1 W" j4 [5 ^+ S6 E, L
                        sync ();& n% {+ `' m6 P6 w- |
                        *addr = save[--i];% D2 Z) X1 E9 ]
                }
7 j& i+ E- W  S( W- W' J" Z+ G+ a                return (0);
( ]# `( d! a- O* M; X% ^        }
2 e8 o) X) ~9 S8 {$ u* T; B1 C# U) z  {! F/ b2 o. X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" F$ [) K4 P# A4 j" @" @                addr = base + cnt;        /* pointer arith! */9 t% R: C6 `, @/ ]+ w7 g4 L
                val = *addr;  ]! |( o5 ?) D! M3 A) [
                *addr = save[--i];! H& C1 {2 h' \8 a% ^% v) p
                if (val != ~cnt) {4 u2 n0 G# g- d
                        size = cnt * sizeof (long);
& H; p' I0 e$ J6 i                        /* Restore the original data before leaving the function.) Y$ f! L% K1 p  g% ~
                         */
9 g% x8 Q9 [6 v7 V( [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 V$ f* F. u8 Y- ^% i) u
                                addr  = base + cnt;
! d2 y! {) s7 V: X                                *addr = save[--i];
# |0 g5 [7 p0 [/ Y                        }
% m/ V, G2 \( ^% k9 _+ O( s                        return (size);: Q0 I) S. w) ?$ k1 ^# m* |; k6 c% g
                }
& j/ N' R1 B2 g. h& `9 T        }* k* C& a1 Z. S# P& V5 G; a
# d- e& e  X+ T! g) s
        return (maxsize);
6 ~/ ~" ?3 J  B* f2 X# K. t}
+ j  M. `; r/ n" _$ J: W7 R9 Sint dram_init(void)$ K3 t& w$ f$ z
{! _9 l4 a* V6 \& A$ Z- ?
        /* dram_init must store complete ramsize in gd->ram_size */
; X2 ?- q2 M0 j. g& s  k4 t        gd->ram_size = get_ram_size(/ ~3 g' z/ S  z( \+ B3 E- y
                        (void *)CONFIG_SYS_SDRAM_BASE,
, k) q* M( J, }8 R5 ^                        CONFIG_MAX_RAM_BANK_SIZE);
1 |+ B2 f) n  Q2 V        return 0;! O, M  }4 V- R% B7 ]6 Z. ~
}
, `* P- y  _8 k0 o$ I& [6 g; z9 q6 V. t9 ?4 n6 q- Z

2 B0 O" q/ \0 j4 l7 w" v  T. H- k6 Y: B. n5 j0 h( ]$ I' p
- r4 a/ C. v/ H8 O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- _/ T* P5 Q, u. N' H  T7 N9 W" J+ s
' M. [8 }5 t7 M2 b$ q! _. |' W/ R9 s

; K" Y9 V9 T1 T8 \$ m




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