嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) p: i& m, p% }8 _4 \7 c; E: |核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 t/ _) v9 j0 r% X% s9 N6 f$ [  g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  I9 y4 k+ ^0 J" h* o7 @
+ ~/ z, \! M2 _% [; l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 a1 l) \( `7 h& e: j

2 C" T* J# t/ S% w' O- L
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; L) x, F: C  t/*6 M* V* I3 M  Z
* Check memory range for valid RAM. A simple memory test determines
, p* S3 `6 j% x1 |* the actually available RAM size between addresses `base' and- R' v$ X' C# Q& q' v
* `base + maxsize'.
8 I9 J8 }. {8 _2 W" e*/1 |$ ^- @' `: V" U8 H
long get_ram_size(long *base, long maxsize). c  e  b$ n3 q/ h8 b2 |# L# G
{  E$ A8 t2 j  e
        volatile long *addr;
3 T5 |8 R( o/ _+ b4 y        long           save[32];
+ d8 p, A9 ?& m( a# ]        long           cnt;+ x$ r( y1 V8 M0 ]5 K' p  g
        long           val;+ f- y2 t3 {* K( L
        long           size;
6 {; \8 z, G" H# V1 R7 ~! J/ V        int            i = 0;, Q' @7 D! a- K3 j2 y. I: \
  `* C' e, t8 g
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* l( \, o- ~$ Y# N
                addr = base + cnt;        /* pointer arith! */
0 B7 u% n, y0 o" S) r' ~4 s                sync ();+ L" I1 }& d. I) c
                save[i++] = *addr;3 u$ \8 @* ~5 }6 Q
                sync ();0 K. m' l: U& k2 f/ H( X4 x
                *addr = ~cnt;
5 t5 u# O9 u% \3 |; D! f        }
( Z/ ?; Z. D% b+ h) X0 ?% ~! B  H8 H' `9 a  ?! i( q
        addr = base;. s5 L0 |; ^' q, J
        sync ();' `! j& k2 T' k3 ]1 m" B
        save = *addr;
! @& z4 M- ?: M  h9 w, d! t        sync ();( m9 z) |. T' i0 n# t9 l- u# B; e
        *addr = 0;6 L, M9 i: Y8 F6 a
" f& ]5 ~* T. U
        sync ();
5 l; C! U' \8 W8 i( X' e        if ((val = *addr) != 0) {' o/ Z% S  O/ a: H; V. I
                /* Restore the original data before leaving the function.9 `. S! j. B0 a: B5 x
                 */
* k! h- L2 Q% E: H! d                sync ();; X/ y' ]: @+ B4 r
                *addr = save;% l: w/ E6 N0 q" h/ V& p/ {; w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: C% b' r6 k/ [: d. z# w                        addr  = base + cnt;
# m, \, U3 \% o% W4 y                        sync ();  i. {( D; P  w4 ?
                        *addr = save[--i];3 p' O: P! P6 [6 G$ p" m
                }; v* K# b5 @1 K( T) g% V
                return (0);
  x1 }$ t* F7 u1 O, V0 Y, I        }* S0 Y1 @' Z1 s- p, E% X
8 Q: v, m0 S2 F9 M! p1 i) }5 n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! y! Q6 r1 p' y1 z- P& f7 c& |                addr = base + cnt;        /* pointer arith! */; T5 v$ o" Z- Z5 P& V/ J& [
                val = *addr;
5 J/ T+ K9 @/ p. e# w* S8 C                *addr = save[--i];
& {/ v5 b* h6 ~' z5 z9 x7 G: M                if (val != ~cnt) {: }; H. ~* ?9 @7 o3 i2 C. V; J* j1 f+ M
                        size = cnt * sizeof (long);4 B+ h/ m; L  Q/ ]2 \
                        /* Restore the original data before leaving the function.
" I9 F% Q: d( G) n                         */  u9 B5 W) V4 g: ?( L
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: J; B: ^% p: j7 G1 X& C9 G
                                addr  = base + cnt;' p" ~' G2 y8 X1 Y/ P2 s2 H; p+ j
                                *addr = save[--i];
  e) e- c; ^' M" h) r- Z( o- ~: y                        }
1 M" C9 L2 g' ^/ j( t( D* P5 H; p                        return (size);
6 d# V' n& z% L9 ]0 w8 M8 Y+ |6 b                }1 f& c' U: a" c
        }
2 n7 K& N) q) x. N" _2 z$ v9 {  z6 A. ~; R- `& J: C
        return (maxsize);5 ^/ X' I) \8 G6 `0 Q! m
}
, U$ n7 v% L- Q* O% Zint dram_init(void)
+ e! ^  v% L/ f, t- f. P* \{: I6 V$ X. {* t+ z8 ~* u7 y( ^
        /* dram_init must store complete ramsize in gd->ram_size */
/ o# j3 f# c9 m5 n# F2 e        gd->ram_size = get_ram_size(
1 z0 j8 C; D6 l" p                        (void *)CONFIG_SYS_SDRAM_BASE,
/ Q3 g9 f1 r6 T9 X* `& o. a9 d                        CONFIG_MAX_RAM_BANK_SIZE);
6 e* y$ Z' a! F' V        return 0;
/ S" a. s2 y5 u. o}
7 q. |( E: N  S2 J! D9 u/ A' W9 D2 C4 ^( H3 a
  t2 }- d9 N( v$ p

- Y# o# _; Z# `- x4 U9 v7 d1 ~5 ?( [6 @6 h) v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* [( Y3 E: Y+ D" ^* e( |+ d
- O7 \: j' _0 T* m* T1 ~6 l1 a
6 X$ F6 |+ m: k- z% Q4 B$ c

; J; i- o& O8 W5 j* P5 V




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