嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: ~, q* A- q6 t% w$ C核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! y$ N4 Z" x* n  R) }: o% J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 N+ y4 d' A( V6 R
$ C0 T/ |& M! X- a9 O$ k0 R& I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 I, _5 [5 e7 y6 A, d/ K" h; A$ U; R0 I

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 t! S5 z( K) w1 c0 w+ {
/*7 x! K: ?2 L/ g# D5 g; _) a0 e- B
* Check memory range for valid RAM. A simple memory test determines* A  v* A( i' @' h9 H6 f6 O
* the actually available RAM size between addresses `base' and8 Q& ^: `' N$ {: e4 K3 A# ~/ q
* `base + maxsize'.
2 T+ O% [4 T+ ?0 P*/
& r: B8 f; R# j; H, c+ x3 _long get_ram_size(long *base, long maxsize)
/ D$ X( S5 R  @; ]$ ]2 Q- k! ]{
  d1 L8 P% ?7 x7 S, k7 e        volatile long *addr;8 d/ D+ i' X  ]0 g1 U+ m
        long           save[32];' S7 {( |5 {* k- i) E4 }+ ~
        long           cnt;
8 c3 M5 U; d, J% J) A2 l        long           val;
; W3 H+ c2 R1 F& [4 j9 w        long           size;
0 a; _. G0 B" I1 B        int            i = 0;
7 K  j1 l  ^7 m0 q
- r$ u- H3 S& j' c+ D3 l1 ]. p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; [; F$ v2 y* i9 A                addr = base + cnt;        /* pointer arith! */
& V8 d- R, i5 W9 z9 t4 |                sync ();. q8 D/ e/ t# ~! V  |) g
                save[i++] = *addr;+ a4 y. j5 g) r5 `8 y
                sync ();
; Q7 g( C5 O: }3 [2 {6 M( W, V                *addr = ~cnt;4 ]' l" w" D3 c; P0 c' i8 a# k4 F
        }# E5 J; S- I3 t  A
2 y  R" N, _* f3 @7 b4 O% d
        addr = base;
2 b% A0 _- D6 c8 Y        sync ();
' g$ ^) r; p( N        save = *addr;/ j' G3 u/ v* {& Z& `2 i- E
        sync ();' y' [$ j4 x* W0 b
        *addr = 0;; B+ g2 G! [' w# }% j  v
7 X. L1 a: u0 n$ m
        sync ();% p1 U" e. [' q1 {0 i4 X- j
        if ((val = *addr) != 0) {
  g5 }  [1 c( j  M) r. s                /* Restore the original data before leaving the function.
) q, W# w3 J7 j, N$ k$ c                 */
; O7 J6 W& U4 R  R$ R! l                sync ();
- F6 U9 Z. Y9 E5 n( X9 g                *addr = save;
' E2 Y4 f! _* k                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# k' N* J5 F8 D2 h( e! B                        addr  = base + cnt;
  m4 V$ G& t, p7 x# Y1 ?                        sync ();' u8 y- s9 @7 n4 S- T
                        *addr = save[--i];6 @/ y) L" \1 W" j2 D" h
                }3 v8 M2 i; C8 Q2 Z" c& f9 D! ?
                return (0);
9 ?: Q4 }, w8 d) a: n+ t, {8 Q        }8 L# {7 {! _' ?: e* d' Y+ a5 F
1 a9 B: D/ d% L9 X8 a% ]1 I
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 o  h; H3 c* s# l0 e9 m' Z" u
                addr = base + cnt;        /* pointer arith! */
! W: I8 D; @4 v$ K! w" w                val = *addr;
/ x# K7 M( ~4 m$ j; }                *addr = save[--i];
& c2 c2 s2 d; v: U3 d                if (val != ~cnt) {# \; r% R+ W4 n
                        size = cnt * sizeof (long);8 `3 [& k( o: ^+ d- h! H8 B
                        /* Restore the original data before leaving the function.6 O& \+ x  c* O7 j
                         */
; T, v# L" B* `4 o& ]2 q. C                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  d. E; @* _0 K
                                addr  = base + cnt;" ?! E! W1 N. D% [  o8 E' ?
                                *addr = save[--i];
  _  {* P$ v" @( Z7 L                        }
0 F3 D( j* S# d; D- L4 X4 O                        return (size);
- t3 x% J$ E  f. K! ~; k/ r                }, ^9 T4 @+ i9 o
        }
; g3 w5 O9 \: |4 ^7 V7 u( J" B1 `, g- K! P' ]+ S
        return (maxsize);
3 Q6 O1 O1 D9 N. c}
- z( f: O5 J+ j) c. [int dram_init(void)$ `  ]9 F* y9 J0 g$ l0 k
{
0 g# e* T) [/ D, X7 o+ I        /* dram_init must store complete ramsize in gd->ram_size */  {0 O+ `5 [( w$ Y, L
        gd->ram_size = get_ram_size(, v& A" E, j  p( c7 H0 K+ D
                        (void *)CONFIG_SYS_SDRAM_BASE,
  P. \/ I$ R' p+ t4 G3 b                        CONFIG_MAX_RAM_BANK_SIZE);
* \! c; P/ n  y$ Z        return 0;
9 z0 |7 H7 U5 v4 y" c- X/ W}- `7 `+ e% T* w

: K$ D. q% w/ W1 |
$ ], _; F' N- t2 b, c/ S& ?3 [# n' p) \7 i- _3 Z  c, q' a; o0 \
4 B; D9 L) y5 r4 C0 g  p. H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  F4 I! L! R1 [. t( U  _

6 E# g6 D! g6 {% g% H
% k" }* K4 E5 t/ P/ ]/ I7 H
# z0 J2 m0 z! R( [  C





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