嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 U; F# f. y: Y# Y: [
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 K) B% n' o; \' j6 S% j; c9 M这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 B$ l3 C3 Q: o1 h% O6 @/ ]) e0 ^1 R2 S1 ^1 _, t4 S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( C* z6 G" d+ y  A) l. x. D/ Q# ?$ E% _- V

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  [% |: h8 r2 E- a" a
/*
6 R6 `. c3 \: a. ~' X* Check memory range for valid RAM. A simple memory test determines
; o1 z/ m5 D) m* the actually available RAM size between addresses `base' and2 ?% w) }) |) R- s* i( o
* `base + maxsize'.7 ]  y8 m6 [' ~3 Y1 X2 u6 a9 k; A7 Z, d8 K
*/
' c( I" A, G& H( S+ v  Hlong get_ram_size(long *base, long maxsize)/ `' s, l" _$ N: D1 h& {
{
( m4 G) c2 ]) N0 r* S( ~" i        volatile long *addr;
  [/ Z- i) r  ?9 g/ \        long           save[32];
7 g) Z- Q$ P0 s; y        long           cnt;2 I( x+ |* B4 R; y
        long           val;0 t+ x5 s0 X) ~$ G' [
        long           size;* @2 E# G: W+ D7 x. d
        int            i = 0;
% ]+ b$ U: ?6 M3 k8 Y8 [4 e- p
6 ]5 v3 I6 @5 y0 q! O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: \  `% _  @2 ]. P& O* Y/ G/ u! u
                addr = base + cnt;        /* pointer arith! */, L) U1 s, ^- a% g# E, \. M- B& n
                sync ();
* }, y/ M3 Z. A8 |* Y$ @0 r! D                save[i++] = *addr;
0 j5 t$ y- w! S6 F                sync ();
$ Y! i/ Z7 w: B0 t( K0 N                *addr = ~cnt;: I7 [( b. {6 k, \( K2 Y1 Y
        }
/ ^5 A. H7 z+ C" m6 ]& _' D0 p7 P5 ^
        addr = base;4 G3 V2 i& v0 F. z9 d
        sync ();
. {  w3 v7 A1 h3 C5 D1 J7 q  \7 \, H4 R        save = *addr;- x0 i) J& m7 [/ O6 C1 j9 F
        sync ();
! L# e" ]- M! o' ]9 R/ e; {% j        *addr = 0;0 t* g$ {3 o- f5 U) a5 P

7 w! h, q: g" g9 X6 @. h2 V        sync ();; O2 A" B; {- t* S' v( j
        if ((val = *addr) != 0) {
, \% t3 V, z& j" _/ E9 R                /* Restore the original data before leaving the function.
% P& U' |; a. v! q  @# R                 */
4 X4 [$ y# M! D% U$ x( i0 D                sync ();
+ l* v! Z6 Q% s& A9 j, U. _- Y                *addr = save;( P' z" B1 D; Y$ m1 w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  F# P- r, q* M, d" u
                        addr  = base + cnt;
$ e: s7 c) J7 U6 H7 W                        sync ();; }' p" S# u; Z* ~+ \! y- B
                        *addr = save[--i];
: P5 V8 \( X0 Q6 N* r& Q3 A                }
+ M5 _; t6 k# ^. P: o3 Q6 K                return (0);
% {8 k6 `1 {2 J# t5 {  l+ C- a        }( S6 T+ Y  h, d$ X- t) z
" a  E" i! }, k- b( @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% Z+ r4 w' L0 p5 S; z, Z
                addr = base + cnt;        /* pointer arith! */
3 g' s3 K! L5 T$ N; B. R                val = *addr;* q3 n7 m+ }8 r: T. b
                *addr = save[--i];6 B3 X$ L0 G% g$ m9 L
                if (val != ~cnt) {
+ k9 Y3 O; B- B  n                        size = cnt * sizeof (long);
  `( a& z6 O5 w4 I' M# v                        /* Restore the original data before leaving the function.0 {/ h6 g% }3 ~, \  m
                         */
1 E3 ^" B2 R6 v& \% R2 r( C8 M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 w. k/ _* z) Z# `
                                addr  = base + cnt;8 `" B: Q7 a1 f% T
                                *addr = save[--i];
* n7 S, O, v3 ~0 n                        }! c: x/ H/ n7 p7 m8 A% g0 W. y
                        return (size);
4 }+ M( A. H& ]+ L                }. g3 T/ A$ j( R2 |2 D. V
        }% I. s( G( w4 v5 J0 g
, n# {4 L2 N" r, d* a& w- a& O$ b
        return (maxsize);! E0 ?' a, S- f9 S. O9 B
}+ b1 Y9 O6 l: J, C0 p0 `
int dram_init(void)
: I; D) x' t0 V{+ j! m6 K2 ]$ p& d1 O. a
        /* dram_init must store complete ramsize in gd->ram_size */
3 D0 V/ L2 C4 e* `; C        gd->ram_size = get_ram_size(6 R+ {6 R9 ~4 g0 W, D
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 J% W0 \8 q9 m- f& I8 o, Y                        CONFIG_MAX_RAM_BANK_SIZE);
+ _1 M2 }6 q2 {3 `, r7 P, T: [4 B        return 0;
6 q) R* r6 H- a6 S! d}
, m0 B7 g. r0 T* r4 [- i2 x+ m
$ [9 T- q4 v7 a0 k5 X6 v/ r. d% a( o
& q, b2 |  g: [( Y5 D( ]% ^9 Z5 D0 B3 S+ Q
8 `2 ?$ M9 T0 n" R- `2 p4 M
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 u; n9 f. d% l7 U( a5 n+ K
3 R& s' X5 B* s+ G9 v) C4 @8 A# \; n# F& V3 [/ p
) d2 s- e( O! `! H; O





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