嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& z7 D' K/ T4 }" Z. _, o核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ {! M* L" ^' ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  ?" N1 `; u, T0 k( D. ~

5 s( ?, |. `9 G3 }' ~$ b' ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 p1 V' L& }! K8 Z. ]
# b3 @1 m- K! W: d; M

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, @$ O2 w5 _2 A7 T$ a/*
' T% ^7 K7 B7 P3 @2 a4 N& m% B! r* Check memory range for valid RAM. A simple memory test determines2 x, V# W: n( R4 M
* the actually available RAM size between addresses `base' and2 M9 e, G. H  _# r2 \
* `base + maxsize'.% w: R3 @/ c9 b, P' d
*/7 ]8 u- V  H! F" w6 j$ n
long get_ram_size(long *base, long maxsize)9 I; p; x( h4 N$ b2 M+ R" Y
{
- Q$ v* E( K9 l" ]" K        volatile long *addr;
* u8 b( y5 m$ I2 B        long           save[32];- L  f8 A$ E: f0 Y, Q; P+ Y
        long           cnt;. t3 B  d: |3 U3 W* I  I* O5 C
        long           val;4 a. o# k9 k( l
        long           size;; A% r8 A( T2 b
        int            i = 0;
. H( ?. Y$ l: D' \9 s; [3 `' l/ Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& g4 k1 Q. e$ s                addr = base + cnt;        /* pointer arith! */
2 j" |) E& b" x/ M+ u8 G( H& T7 J                sync ();4 X" s8 A6 o9 l
                save[i++] = *addr;
+ r" I9 M) n5 r- O' t                sync ();
; j# P1 }3 C  B6 _* v2 ~. S                *addr = ~cnt;& E1 v$ K% a$ a) l3 X2 C
        }
0 y, `2 X& A, {4 i
' x9 z# I& ?$ l4 g7 ?( C        addr = base;
$ x9 l  J& z+ u* k9 e        sync ();6 j1 S4 s' X, L! L/ D, H) t) L2 x) J6 m
        save = *addr;( f) a( l  z: R1 p: \
        sync ();
/ X4 W9 S1 q. ^; v% t% n! Y        *addr = 0;3 U2 Y" ~( t! g

1 }& m: f$ d" i& P8 F        sync ();9 N5 c) _) @" H3 u( o) N2 x
        if ((val = *addr) != 0) {
+ W! b- [* u, w) m+ S5 d% c                /* Restore the original data before leaving the function.
% f9 W2 v" u+ j" X; H) b. W                 */9 X6 {1 g% z+ o/ \
                sync ();' X8 e+ P% i* v0 V+ M/ g
                *addr = save;
, ~+ a' R- y. l6 k- o8 X                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' p0 N/ i  `" g; `
                        addr  = base + cnt;2 T/ u! [5 _! C1 q$ q; v
                        sync ();1 Q  M8 `( C6 F& O
                        *addr = save[--i];# a* Z7 j6 a6 _7 `  \0 v
                }/ Y7 g7 l  q) E
                return (0);
4 h9 y( j- ^2 \0 y! P7 I7 s) S& w, k        }  o. [; m4 u& S

8 e7 B. w+ `% ]7 d8 f, s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 V! L) Z8 f$ C/ k) d; i: M2 p, r                addr = base + cnt;        /* pointer arith! */
- ]: _# p5 \8 p' v4 _5 H2 H0 d                val = *addr;
4 ?. A3 B; j  h+ a9 ~                *addr = save[--i];
) l0 d+ E/ Y. m7 e5 E( i; k* O                if (val != ~cnt) {8 f- N; l4 K7 r' j0 \8 m/ i% x
                        size = cnt * sizeof (long);
/ g* g: b8 U9 {2 \- r: K                        /* Restore the original data before leaving the function.$ n  o5 ~; x( D' X& ~$ s
                         */7 G- ~9 l, |' l; q6 ?9 [- ~& h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) }' n  }5 a" D; f3 ?( w
                                addr  = base + cnt;
3 v* K2 W" `; T+ m$ f7 {                                *addr = save[--i];
) Z0 C% B* h+ E4 j9 ^                        }; ~5 E; \0 ~% @3 K
                        return (size);' m1 [8 ?( F/ P8 I$ _
                }7 {! O2 l5 t. a( F- F
        }
3 o1 v- q0 }/ p2 H* l( V/ k: R& t. ^4 |* x
        return (maxsize);8 R- c# m: d/ x) _8 X; n0 ^
}! Z2 m& V/ P" W; U5 v, U
int dram_init(void)3 Q( b/ v! p4 ?. e0 |/ L; P
{8 c9 U3 s$ e; @5 L
        /* dram_init must store complete ramsize in gd->ram_size */, c) b% J5 I' d, p8 ]
        gd->ram_size = get_ram_size(
3 J$ x3 A! O( L# L+ k                        (void *)CONFIG_SYS_SDRAM_BASE,
) Q# i1 O$ P' A" H+ v% P1 B                        CONFIG_MAX_RAM_BANK_SIZE);
! I# p1 F. s- ~& ]" M) O        return 0;
4 x/ A3 g3 L7 y}
$ Y7 O/ F9 g2 ?; {% r: Q
2 {) l) Q' P+ Q8 J, Q0 V$ K1 G6 g7 q& }

$ v  F4 }2 ^% K' q
% x2 N' H. U9 T" q, U3 w! B. {/ GFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 e' _/ g: ?  u$ Y, g0 l2 K, o9 X$ V0 r' B: }
5 z; N7 f. k+ S
' l2 v9 m, {2 S% }+ `





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