嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  x$ W8 J/ t" v) W$ j9 k+ `" u
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& \9 l0 l; |2 f) K$ j! X5 L0 a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( C% a/ n! T$ J% T% Q- a3 ^8 s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 k4 `4 i" u& r' x+ `- u! r# h- p1 `: H: G: O$ I9 T; d

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! }6 t) ^$ f/ y8 [* e" g2 X, b0 U6 p( C/*
1 L1 p  D. u8 A" A- W/ _# S* Check memory range for valid RAM. A simple memory test determines1 \; G, {7 H) C. \8 i4 D; ^
* the actually available RAM size between addresses `base' and
# r/ K$ d/ ^$ H) O' h. L* `base + maxsize'.+ u8 o' Y" }: Q  b
*/* V+ N6 H3 M2 R! N' ?3 U. H
long get_ram_size(long *base, long maxsize)& H  a2 l2 d/ y' u$ h0 w
{% v+ S0 ~# y3 h: h3 j) f6 G
        volatile long *addr;* T% p9 L, \" X" Y1 a
        long           save[32];
' V% V2 h4 T' R0 H8 k2 ?" D0 t: Q7 U        long           cnt;
+ f+ M1 `; c4 l/ T        long           val;
) I+ b) n, r$ l& |+ `        long           size;& z6 w' T' w/ f! v$ V% E
        int            i = 0;( H0 ?+ ]% d" {% \+ b

3 j, h$ D- h% |        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* z3 G( y5 `/ z* k" ?( w/ P5 J; y$ Z1 k
                addr = base + cnt;        /* pointer arith! */
5 C5 J+ v3 g$ P/ P                sync ();7 |: p2 E6 W% X  T1 A$ G- V7 u; x7 D
                save[i++] = *addr;
8 T) G6 O" |4 {) u# u( t1 A                sync ();
) f. m: B- p. X9 X2 {% y                *addr = ~cnt;8 [; [! ~! ]1 e
        }- w6 ]. n7 U2 r% C: h
( D1 o( c& d0 G5 Q* A+ k! H
        addr = base;
( I' d8 T- r: n( w* a        sync ();9 `# S( J2 a1 S# L  ]$ v$ `! p
        save = *addr;
" H6 G8 Z) H" ?6 v* u/ o- T        sync ();/ a$ ]- l9 d5 V. i
        *addr = 0;. O( J7 C: B7 Q- U9 K

( b3 X; M' T  t' v        sync ();
+ d, A& U, |$ |" r) U        if ((val = *addr) != 0) {  r; M6 ^' s/ V0 c1 p
                /* Restore the original data before leaving the function.
6 S& P( s% T, R, b: F/ g( D                 */
% f  k5 f. a, h6 _' V0 {, W                sync ();' |, {5 R: z% F+ }8 Z; d9 q
                *addr = save;9 {/ T9 J5 `3 D9 \
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- N3 _4 _% T+ Y, B- C; {5 Q  @: C( M- l                        addr  = base + cnt;
' D8 q. P, X5 n3 v9 `4 n                        sync ();! x2 y6 y; l9 Z6 v' w: W9 J
                        *addr = save[--i];" `  O' O/ R4 ?  z( k% }" ]
                }$ o( D8 k" ]/ n- f
                return (0);
# _- x. d: R" R* d( i) p/ r        }
6 V9 b0 V/ E# \0 e
$ }& b4 P& S/ {. b# ~1 l4 i. M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ X0 m5 W0 E7 F6 q8 _2 K! ?+ q
                addr = base + cnt;        /* pointer arith! */, n6 \/ j& a% l9 h3 q
                val = *addr;- E8 E8 p4 u/ F# o
                *addr = save[--i];+ t3 A& I4 B6 D3 h4 b' o
                if (val != ~cnt) {' j. J; `- l& ^% r9 U6 R" x
                        size = cnt * sizeof (long);5 l) B1 S1 V9 q1 ^! p: U: r
                        /* Restore the original data before leaving the function., I* c; Y: P) _6 p% @
                         */" x/ }' Z* Z5 e4 u' m$ H
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 ~1 q9 e3 n2 L3 O# F. p' n                                addr  = base + cnt;' G( z6 |- i6 p- v$ U
                                *addr = save[--i];
- r9 }! w! o' T  v/ w/ V7 S                        }
+ V( N4 r. |* J$ i8 s- C                        return (size);3 V) r! q. O1 u& f2 `; D( L/ s
                }- y4 k: ]0 c# \8 o0 m3 L
        }6 c. d# L; y6 w6 ^9 [/ f+ |2 a

" {4 P7 k# o2 n  Q8 |3 G# a4 R- A        return (maxsize);! N7 y' ?, [" O7 E
}2 X$ n& C  X( g* ?6 b
int dram_init(void); [2 g7 j" p/ P" g1 \
{; ^' M' F1 P: q  m# k2 e0 `
        /* dram_init must store complete ramsize in gd->ram_size */. [: b1 A2 z. z1 q
        gd->ram_size = get_ram_size(
  w/ V; }5 p) U" `5 Z. S                        (void *)CONFIG_SYS_SDRAM_BASE,1 Y& \( f6 }1 t4 j
                        CONFIG_MAX_RAM_BANK_SIZE);
/ m, \. B/ X; F        return 0;% u5 |$ r; u. j/ |3 [
}" L: x( i% c) y1 s" B; K5 r
7 c  G, M; N8 k; S# r9 f

+ G+ o: g$ B* a6 H- l* O/ G! i: c* H
9 J, ^" P( Z/ i
# o4 D+ K" Q# k+ v0 @# VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 s7 \; J& `3 W' o2 V
# g& ?! E2 y2 v9 T. k7 |9 F  M
6 b$ B8 ]4 g1 P# f6 f; H" O6 A

+ n5 {+ E, d2 y" r- h7 x2 P3 E




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