嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 `/ {! X4 _4 G7 L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 l% c' U1 _4 D这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( N  H' P9 _. ~: X1 W: h0 ~. S$ N3 F/ W  `% p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 q1 q- Q; K% U
3 @8 J6 p7 j" j8 l  V: Q0 V

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ w  W* `, D9 Y& J: l% g6 `/*6 h# `  O, ~: G$ g2 O% Q
* Check memory range for valid RAM. A simple memory test determines" _4 r; l' ^) _3 k
* the actually available RAM size between addresses `base' and
) w  K+ C4 B5 V1 I* `base + maxsize'.
# u5 T$ l' |1 @. _*/2 ~& u0 L8 B/ l7 |
long get_ram_size(long *base, long maxsize)$ [7 a- l4 n) h% y
{7 f' V% ]0 b& n( F% \( L# Q
        volatile long *addr;
2 l; @( N* I" B        long           save[32];/ X  h7 P, y  [! f1 n( H& a8 t
        long           cnt;) T4 @$ F  }' l' B
        long           val;
) I2 w; h4 J5 Q4 Z        long           size;
& Y5 ]2 R! b# m8 L# r. ?; l        int            i = 0;
2 x  z6 U2 _( C% e5 R" t/ O  U1 o9 c& p: Z4 e7 ?) w8 F% g0 k
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% i8 ?; I& d% u! v1 ~5 O) n                addr = base + cnt;        /* pointer arith! */0 s4 ^- i; B7 ]: \5 _
                sync ();$ C- c& K. Z7 N9 z
                save[i++] = *addr;$ U/ U- g" b. W9 l1 B7 G* v% M
                sync ();
; B' p; Z! z: K6 Q                *addr = ~cnt;
% b7 u& A$ V$ R" K. ^  Z9 y        }
9 k0 l3 K0 \9 o' Z- R8 P+ m
. }  q6 R1 m4 W3 O6 j& d( {        addr = base;2 d9 g$ ^% \2 ^2 [
        sync ();4 L$ T5 z0 T, x+ R0 ]" }$ a! u; V( w
        save = *addr;5 A  M# w) \( M  O; M1 ?
        sync ();9 C9 X9 ]' ?  {
        *addr = 0;) q1 P% G4 V/ M2 H, X

7 ?" M; T2 L. c, C        sync ();
+ v, i) b' z  [        if ((val = *addr) != 0) {0 P  O. t) ~! U  g, J% ]
                /* Restore the original data before leaving the function.
, h1 F; d: P3 k                 */
( d& g% j! Q3 q; Y  j' m8 ]                sync ();2 A6 o, D# j' b* r. M: \# H' `
                *addr = save;8 ?! ?+ x3 g8 Y' h& F# j  ?9 Z4 o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. k/ Z% X  q, }0 X! c/ a0 P                        addr  = base + cnt;
5 v, s, I3 ^9 b. [3 {                        sync ();
( c7 e1 s  u$ [9 t                        *addr = save[--i];- i. U  H0 |/ h1 v3 ~  {# @
                }
4 P% ~" S5 I: ~- n+ r* H                return (0);0 c* B5 ~& r' i1 b3 p
        }
- b4 Q1 B3 S6 L" q% r3 |, A' o$ }+ r7 p+ u( U+ H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ i* F/ h' o$ Q! R0 I  T) y$ m% P
                addr = base + cnt;        /* pointer arith! */
0 }! U2 }$ H, A/ g                val = *addr;
: C+ K+ f( v& ?) ]4 Q3 ^                *addr = save[--i];$ V7 S0 L1 q5 E5 L
                if (val != ~cnt) {
% }8 @# m- ]8 O4 s: \1 r                        size = cnt * sizeof (long);
# F! Z* Q: x5 J                        /* Restore the original data before leaving the function.# t9 L1 K1 t# z5 _
                         */$ q% s* J. _( F
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 B: l% M' ?/ ^/ F. n; G  S2 C8 B                                addr  = base + cnt;2 Y0 N& ^; J' z* b# @) l( u
                                *addr = save[--i];
+ d+ R: r  o( H$ L                        }
8 S. y( A' \) y8 \/ z! n* A% R1 ?5 Q. s; z                        return (size);
! @' c, D+ `; b7 H                }
  b: o* Q" T+ c6 a1 Z        }
* V" B, f+ M' q9 e! `: D& }5 F
        return (maxsize);
& K5 `4 V9 O+ g; l! U. a}4 P1 r- n, f+ M" c( n2 j6 K
int dram_init(void)4 I! L4 p. P* L# w: D8 r
{0 @4 \; s- X5 x5 X3 A
        /* dram_init must store complete ramsize in gd->ram_size */& }9 b5 ^8 R/ f) R
        gd->ram_size = get_ram_size(- Z. k) f  h# x( o
                        (void *)CONFIG_SYS_SDRAM_BASE,5 P* R% W3 P; a: X; E
                        CONFIG_MAX_RAM_BANK_SIZE);6 J7 h0 S1 o$ m* d
        return 0;! n9 z; [# F! X9 n9 ]  ]+ z% }( C
}
5 z% @0 c1 Z, J! x/ b# U4 y6 @" U5 W$ h) w( S9 b4 A3 S- A$ y
3 c8 f) z% ]! M: ^% U# E' q
  Y2 Z: g( f% R* L# d. G) [% s

( B# I% X; ?, U! i( G% H# N  ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  l1 d( f4 X8 ?2 b  p' V" V* w
1 i+ F" U( T  N5 M5 S  C

! ]; T4 O& W# N+ z* A: A) {" R' ]
# ^0 A9 W+ v5 b2 U8 h





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