嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. S) `5 i/ z# o# r- N# c, J+ i核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ I) W2 q: @( L% X2 k. O8 j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; P7 Y- y5 z8 u7 h2 Z2 I5 j6 m. g6 {

+ `# M, }1 s% t, j  }' n5 `; Z! C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: }. {2 }, o$ G

) I9 w, ^, S& G" p( j
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 I  L3 X! M1 s) B/*5 _2 Y! R# {$ i; h  X9 m$ P- K
* Check memory range for valid RAM. A simple memory test determines
6 |: `, X! x2 {) k8 ]* the actually available RAM size between addresses `base' and
3 ?9 ~) t+ }/ ~* `base + maxsize'.+ ?' P5 L, d8 B9 z: Y% D
*/' v+ ]! B% P1 K1 c1 R0 Y% A4 j1 c& n
long get_ram_size(long *base, long maxsize)7 s- ]4 v, \5 T: h0 R
{" K8 v( S+ `# f1 Q. m
        volatile long *addr;
+ j% {0 n* V) n1 T( y        long           save[32];
- R+ K* s# [* ?0 L  t        long           cnt;" Y' K. _3 N/ u2 j
        long           val;
* l+ G$ i5 J' m, u+ B( a  R        long           size;
) G9 _0 v& d2 p. R        int            i = 0;
: h" d" {; ?; ?3 z* F3 X8 }5 K
8 D6 r- E5 g0 o7 z  `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 r8 f) I& V6 ^* U- F
                addr = base + cnt;        /* pointer arith! */
7 A1 B# {# E' f% c- B6 a2 ?" ?& }                sync ();
# g9 }3 y% Z9 a2 L                save[i++] = *addr;: T0 a. S7 p  K6 O1 L. M
                sync ();
8 W1 N6 k9 `% E9 n4 Z8 U                *addr = ~cnt;
  \4 Y4 T6 a# k+ b, U! p8 j  x  V        }
1 n% n4 r' V% p9 ]7 w9 L% M
1 K: d, I4 [- r+ ]/ c+ V: }) q9 D        addr = base;0 h5 [" E: ~1 r: M( r) T( X
        sync ();
$ d0 {" I% h2 K# F        save = *addr;
! W# x! f/ u1 x0 z9 b4 T6 ^: b        sync ();. Q2 S7 U+ u. w. T: H" f9 Z
        *addr = 0;
8 I  A" X8 s0 X% d( x, F* h, }8 k
6 w) D* r8 i% J1 [! J4 I7 {        sync ();
, W% d, L: e0 N8 t2 I        if ((val = *addr) != 0) {
% b: v8 R; D/ S& t                /* Restore the original data before leaving the function.: N* J8 G; c3 Y' G
                 */; G& [$ m% R& E% r
                sync ();4 G- W% w, ]' k1 r
                *addr = save;
* A$ I8 C5 N5 ?  @; A                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) I# X$ U) A  G( k5 @: `# v: H, N
                        addr  = base + cnt;& S! p& l; `0 f) q+ Z- {
                        sync ();
+ p' E: D. c$ x: n- m- o                        *addr = save[--i];
) y- _! s$ o+ y( J% |$ R% k                }8 X# N0 f0 A" q0 }& p, ?. j  r+ _
                return (0);
" H$ D0 Q& J! U  O6 t& u& ]        }! j/ f* X3 K  _7 R$ L: {
  Z1 C! e9 c; P5 @& G* S$ _+ i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ l6 i& N9 ^% I6 A  W
                addr = base + cnt;        /* pointer arith! */
5 h$ D" c7 C" D& v& c( e' [! Q                val = *addr;
" `! y8 N$ h' F; J                *addr = save[--i];8 ]. T# ?. J7 A3 ]9 V$ z
                if (val != ~cnt) {
3 w4 Z% P8 a& L& u! M                        size = cnt * sizeof (long);
" R5 F/ d$ `0 ^2 F: @# Q5 {                        /* Restore the original data before leaving the function.: S$ K# Q, r" \- O: t: T; L
                         */5 A1 c7 x8 H2 X' s7 h' @- g! k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) g6 v% R' R4 |2 \; m                                addr  = base + cnt;5 g. U5 G. _4 U- u
                                *addr = save[--i];: _: c6 O* ~. i  F0 g) d
                        }
9 u$ B: \* d) a# O  y                        return (size);
1 L+ f) D! d" _" `; ]; A+ j& }+ v                }
+ d4 G( T1 a# Q- r- G! E1 t        }
* r# r% ~4 [- R
6 O% D+ H# `# ~; N" ]        return (maxsize);  C+ i) e! x1 ^) x
}
% p! P! A  ^: r4 F8 ]  cint dram_init(void)/ ?$ {1 S: G, k) h+ N& T& f
{
! r8 S+ o, M/ M7 s        /* dram_init must store complete ramsize in gd->ram_size */5 k/ e4 N# x& X+ L
        gd->ram_size = get_ram_size(4 |0 g! p0 Q9 J) U
                        (void *)CONFIG_SYS_SDRAM_BASE,/ O& f- b' u; C8 l2 Y" Q* R
                        CONFIG_MAX_RAM_BANK_SIZE);4 D, W  t0 W) U) ^3 c. q
        return 0;
0 ]4 F5 S& c5 k' m& Q/ q3 T}
2 R* f) Z) [% o+ Q% s3 X  C, c- N4 n+ O( [3 _

  E6 v( \- r9 S1 J9 S: T% {! {; {' k. O) N6 w! K6 l, G# {# }# J

% J, J7 A% j/ yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* [: b1 V3 w8 Z  N0 E
& I! I/ |$ b+ \6 K# {4 t$ l5 D

' S% |1 b2 J' \6 v* J& K
% l% M' N0 Z3 y- C2 r





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