嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" E% c( {- q6 Y3 z# j
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 K, m) o2 _% o( P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: r+ k7 ?! R* Z5 A
) ~0 N, h+ J, S+ b4 ]& ?8 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 }- i! Q2 F$ c1 X' J: {

6 z. E/ x) _: ]3 d/ H& y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! I' R9 L0 `+ U5 ?* P/*' i5 X5 s5 h0 @4 @
* Check memory range for valid RAM. A simple memory test determines
% i; R, K% H9 W, ^0 f* the actually available RAM size between addresses `base' and/ C1 U4 ~' y! u( S( I, e
* `base + maxsize'.
, n8 y/ @; d6 y+ c9 v$ T9 v*/; d8 r8 l6 I! o! x5 E+ q' s; z
long get_ram_size(long *base, long maxsize)
) W# d# d: w; [' e{4 B/ q: \3 N% T
        volatile long *addr;. i: A" ?' d% j, t
        long           save[32];( w- e5 w9 [: ^( r9 S7 m, e9 H
        long           cnt;
* L) o4 c- F& E4 }+ r$ X; T: \        long           val;
" B" o% Z. d* b- D( H% k! _5 f0 b        long           size;* B- C+ W. y2 L0 v, q
        int            i = 0;
0 U$ ]$ y. S& ^7 Y9 j  b1 I1 B' j, {& Q+ N
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& ?. `1 p, `3 }                addr = base + cnt;        /* pointer arith! */5 K2 q# F' u6 h; q$ G1 {
                sync ();5 u' Q5 _  d  x+ L( z  t
                save[i++] = *addr;
8 h* _7 s$ A. }& w7 p0 N9 X                sync ();
2 Y+ |4 u, ^, E; j2 k* y# P* z3 }! o4 z                *addr = ~cnt;1 b0 U+ F  Y; U# r+ d' T0 C: F! K
        }
# ?- q2 j+ I" f# H- W$ A
# u) k- ?& n2 v& P& s) g0 m0 u        addr = base;
/ x% r/ v5 o/ F7 B& s  ~        sync ();
- O7 x; G9 U) `" B1 A# ^+ G        save = *addr;. u* D1 \, I2 H. V! f, {1 y+ ~
        sync ();) u2 L) @# q- F) W0 b  V# f2 x
        *addr = 0;
" i- B& g  _' v& A! v1 C6 O- r: y: n9 m4 _
        sync ();2 J* s& x/ N- V$ r  X2 [
        if ((val = *addr) != 0) {
$ Z- i: h: P# x! j/ ~                /* Restore the original data before leaving the function.
6 v5 G5 q3 F( G+ T, e                 */
9 k) E& ~  C+ D% o                sync ();1 H& R) G$ `9 y4 e  C8 v0 L4 |4 U7 O
                *addr = save;
1 m7 Q7 t% s' Q& D                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! I6 Q# f' K5 E1 @8 {$ K                        addr  = base + cnt;
3 k: ~1 g5 e* `) H                        sync ();
/ y& q7 d2 z! A) W9 W                        *addr = save[--i];' o! ]8 t2 g, ?) T  K( D
                }
6 d8 X, |" l" r! j% ]$ w% u! \6 Q                return (0);
, [! h. A; E$ S5 T2 q        }
5 o2 D7 r8 f# ?0 E3 g0 w3 b
6 V5 V# [  i" k2 L0 d# @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 X' N5 O2 b2 j+ l
                addr = base + cnt;        /* pointer arith! */
2 [$ A! f: v) w7 t( Z                val = *addr;
5 J2 Y4 e5 l& d2 i/ x                *addr = save[--i];4 |) S4 v1 m: k; |9 E3 H% k3 l
                if (val != ~cnt) {
' o" W1 b$ Q3 G3 d, y3 y* p                        size = cnt * sizeof (long);3 g' G4 ^5 M( |% @; a" Q; d9 Y* b
                        /* Restore the original data before leaving the function.6 `( y" h6 t. G1 c! q; t; s
                         */9 E. {) ]  K( u# `3 Q8 O) I. V
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 t7 E, |( {0 d* B8 s5 t2 ~                                addr  = base + cnt;  c2 C  }7 H- z% Q, P  H+ O9 i
                                *addr = save[--i];
8 n& L/ W- M2 N: n- z7 C                        }% D9 c0 h9 a4 Z1 L- G( A
                        return (size);
0 @7 c# `! g$ G- j. k                }9 q; S  I: D  j, p% {7 ^
        }7 p  q( Q. R! I: N( Z

) h0 m, E* i: K' ?. [        return (maxsize);
! F! X- Y4 l5 @! P' F, a}
! @: A, ^# y# F+ O' eint dram_init(void)' k: G& O& H  l5 @8 g+ L0 A
{' b0 ]7 w5 G2 o$ g2 m: ~' x4 X" H2 g
        /* dram_init must store complete ramsize in gd->ram_size */
4 S' u8 l7 _- f* j& A$ H8 B" `0 _5 N        gd->ram_size = get_ram_size(5 G* R: u9 p9 H2 d( R& Q& f
                        (void *)CONFIG_SYS_SDRAM_BASE,
. O1 A* ]9 v9 C# ^                        CONFIG_MAX_RAM_BANK_SIZE);5 H" f' d+ A% }. X( L
        return 0;) X: X/ A: X4 d* U) X5 _
}; K6 {) e" z: X! _3 U/ E

- @' q' x. o2 Z) Z' {) d% U
$ U6 P" u0 N# P" n" W
* T. y: b' T- Z, x- R# f4 v5 |/ S9 k: w& ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 {  u0 O- N0 f" _2 H$ [" J! c# ]* r9 h

3 c+ `, E8 ^: Q. p4 K9 _; y: f/ m

2 V. X$ O0 K" f




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