嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 N9 N& e& l+ q, Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* k/ B: a8 X- |9 c5 Z9 z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 K$ s/ d+ W, d$ m  R/ X5 H2 d& q3 O2 v  N: O9 p! F0 U, |$ c9 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: i; P: p+ }# _0 f
8 Q7 a. \9 F0 Y1 L4 C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 o" y/ G( m) f- L( F
/*
5 l8 a1 f  u( g7 e: B3 Z* Check memory range for valid RAM. A simple memory test determines
( g  a$ v( N  S0 e* the actually available RAM size between addresses `base' and7 \9 T; `9 I; ^* o) A
* `base + maxsize'.% o0 P2 _* s+ {" i4 F0 ~
*/
+ c) J. B/ F5 x/ T7 along get_ram_size(long *base, long maxsize)( n! `0 p, `: l! p
{9 L  @; ~: ^8 G
        volatile long *addr;& q9 \7 ^; l# l/ B3 S7 K& T4 ~4 `: l( g
        long           save[32];
+ U4 d: X! E' k6 {1 i+ |5 a9 }1 r        long           cnt;. N% G  _- B7 s; v2 b& ~- Z5 v( Y; F  F
        long           val;* j. \( D/ L* o- ]  R
        long           size;" o% y, E& w6 [1 v2 B
        int            i = 0;
' G4 s! @& `, Y5 b0 n' @3 l* M6 Z' G6 `% f  r
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ i" x- u( M* w3 w, l0 V' |4 Z. D" ?
                addr = base + cnt;        /* pointer arith! */
; m& f% q$ Y9 g5 Z                sync ();
5 _$ L, v  z7 W* F. w, ~2 j: O                save[i++] = *addr;
8 D3 ?' |; _% b                sync ();
4 |; N2 U# W9 I. S% N- B                *addr = ~cnt;6 r$ F( }. P, I$ [
        }
: K$ m+ ?' ?9 C5 z4 w/ u" A0 U, c
        addr = base;- G  z. |5 Q6 |4 a" i4 h9 \
        sync ();
2 a. `* ~, L( s        save = *addr;; U7 M1 o1 b/ b" V1 j5 k( Z) i; U
        sync ();$ C( N/ ?$ R  t: F
        *addr = 0;) }5 r; V( b* q/ z

3 `+ Z% t; m! K- O5 H3 P        sync ();
3 i! g; Q- j2 U2 m; p: O        if ((val = *addr) != 0) {
. T6 D7 m- w: R7 ^                /* Restore the original data before leaving the function.
& ]  H) \  l# h) X                 */
+ @  y# b# N7 _% A; h                sync ();
0 C$ p3 J- d$ l3 W% w8 s                *addr = save;2 G' C( U* K1 f8 L0 m, s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  O8 z$ X% \. R7 F' k+ U                        addr  = base + cnt;( V3 Y1 S. E. q+ f0 I' _  f* }
                        sync ();0 N- R7 Q/ g" p+ O
                        *addr = save[--i];1 ?) `$ Y9 Z3 ]) y9 k3 u* {$ z: |
                }
) }4 m4 P. F3 Y- j2 g' Z  [                return (0);
. R! r6 ?3 H8 ^4 s. L9 h        }
  B* `8 Z+ A9 \0 f. M+ |* S% w7 V9 V. V. U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; d% o7 C' {; l9 ?8 @* |6 _                addr = base + cnt;        /* pointer arith! */
, h0 r7 S8 I7 }  w' N6 R& [. g                val = *addr;3 [0 P' J4 t& n" n; ^: n7 ^5 ?
                *addr = save[--i];; J/ K7 {2 D* s! Y$ l: S
                if (val != ~cnt) {
8 q" r$ m( e! x( F% R, J9 r5 {* M                        size = cnt * sizeof (long);
+ `7 w9 b7 S+ N/ T5 \) Z                        /* Restore the original data before leaving the function.
0 i1 Y( l4 T' _                         */
( ]. V6 A( I8 j; C3 A: k/ x3 t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# v3 {$ Z9 h* p4 F( e; z: d
                                addr  = base + cnt;
, B9 b" B) J2 G  s+ N                                *addr = save[--i];  O- S/ _; l$ |  y$ v- E
                        }
4 u* ^6 V3 I/ ~& p- b  W5 s                        return (size);7 H2 N, d0 V5 y8 e
                }4 m4 n4 |, n& j
        }
" ^- r8 w6 T% y( c- k
* \' [  b+ h9 W  G8 S+ y) I        return (maxsize);
7 w8 G# c8 y+ i$ p3 f; c}0 v: l% ~: h( ^" ]* ?2 ^
int dram_init(void)4 B; s9 Y  V" j; @' }
{
" f8 F* T1 U9 Q  W9 `+ e1 V' [        /* dram_init must store complete ramsize in gd->ram_size */
  }% a7 l  N, p8 n3 @* |) H        gd->ram_size = get_ram_size(2 E' ?' y% I: q
                        (void *)CONFIG_SYS_SDRAM_BASE,
- k" m' |+ k- F* f# p' x                        CONFIG_MAX_RAM_BANK_SIZE);
& ]: k' z( `" i( b0 G: w        return 0;. j% O" h- T* l/ c+ V
}3 E" k8 K5 w# ]3 Y$ p* v4 N
, O/ |1 n. a' |7 `" g6 h
8 T- ^5 _" k. L+ }
% q! l3 n- l# x5 z" p, T! }
3 ]  F( n, j% j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. S6 J" v1 T& M# o
' J7 X, p0 [8 V7 ?
4 D6 k) z1 o1 o4 g' Y
& d  q) H% \/ f0 _& t





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