嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( b% c; f7 x5 z, j; ~" N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ I% E1 O- M2 u0 a( k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& d" j1 C% y: |6 U/ ?; {
, D4 K5 Z$ Z6 u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 A$ ~; U  J/ w/ S! C8 G  D4 U
4 O- H3 s2 \( Y) D
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ i0 M. i! t; h5 n/*
/ P! r4 l% ?9 z% s8 o# U2 c5 R5 K* Check memory range for valid RAM. A simple memory test determines
  g. t" r& V* k' _! e' g/ j8 e6 _! b! v4 j* the actually available RAM size between addresses `base' and
# E7 K$ |) ?, `2 S) ?) V3 q* `base + maxsize'.
  V+ n5 y* R. c5 T2 u*/' H% {- C- ^1 V; t
long get_ram_size(long *base, long maxsize)" E# f) Q% |, L8 j  n
{
* ?3 F7 p2 ?8 ^+ Y! `" c        volatile long *addr;
( w, I! z- W6 ]% r8 f) D/ k: `        long           save[32];, ?9 h: W8 t' M6 d
        long           cnt;
9 ~* Y4 B, W! y( P6 Z1 @+ h  Q        long           val;9 l4 B' f6 G5 |: \
        long           size;: p! V( d/ E" W3 A( k4 T) Z% `4 }3 X
        int            i = 0;' {  i+ i4 I8 {, G) z. N8 e

" H- m& D  `" g( c5 f4 D        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* J, r3 s. I9 j' g0 Y0 O" J                addr = base + cnt;        /* pointer arith! */
/ I% r( w- X- L! h' `1 o                sync ();" x, T! d/ N# q! b3 w0 J
                save[i++] = *addr;
5 Y) T& w  O# l                sync ();
" {! e2 P, y& |  j) A+ r. T                *addr = ~cnt;  X5 ]5 a9 l9 j. D- o/ A
        }  U, U+ ?' W# a, y, b; i

6 [' k7 d1 S8 F        addr = base;
! [4 ^! o, s' }2 {        sync ();2 D  @* S5 A1 @* {+ u7 W, R$ D
        save = *addr;/ i4 K$ i7 {, V0 O& d, e* E
        sync ();
- r  v' @" l+ A        *addr = 0;
8 j' Q( l4 J( C8 Y  }# g( C& |7 W6 `) i- m9 A- b
        sync ();
" g: c1 Y1 _* n5 \; x5 P- z: \        if ((val = *addr) != 0) {; F, r" T% ], ?/ e# P2 d1 X
                /* Restore the original data before leaving the function.% |  b2 D7 o  [! B
                 */
. ]+ i' P8 j2 j( n* S. A8 P                sync ();2 D. Q2 P2 E' Q$ Y5 J
                *addr = save;
2 G( r- c& b8 e( ^$ u( E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 r8 T0 F* p' Y$ X) y% m+ l" F3 @                        addr  = base + cnt;
6 @! K1 C' E. d0 l1 w/ r                        sync ();
& j/ h( ~8 l/ A7 ~: X                        *addr = save[--i];
8 z3 s$ x  `& \( M8 q! D% |+ x                }! g- {2 ]- l2 U- Q
                return (0);" M" M' H& u8 C7 I% h
        }
; g1 z& D0 h5 u3 L, k3 f/ h3 ]8 z9 Y' j! t" x( u" Y2 T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 s  i6 d- c4 s! R- e
                addr = base + cnt;        /* pointer arith! */( A6 h4 c0 X$ `; W5 j
                val = *addr;
6 y1 v) L" J, D% u: A                *addr = save[--i];
& K$ @! |+ d3 ^+ X. s* ?- t                if (val != ~cnt) {8 p  d" C* N( }* i+ w0 Z
                        size = cnt * sizeof (long);
8 N' A: R0 Q  m$ ?' x                        /* Restore the original data before leaving the function.2 D, l" a" @7 m0 z& \
                         */
) z- C( l( _7 G/ D5 [4 @                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 C9 P7 j8 F# @) @
                                addr  = base + cnt;
* f2 r9 c$ }  y. Q  H; c/ _( m                                *addr = save[--i];5 T8 Q5 E. L" S# j" |: Q4 s+ H: O- ~
                        }. [, \( Q3 e/ I) k! C
                        return (size);
; g$ a. X- e# D* ~6 v                }
$ V/ }- z$ G' @4 G1 p: o; G- V        }
; t' u# I9 x9 I, d- Q; j7 P5 Z
+ D) O7 L" n* f, ~: P  C        return (maxsize);6 O% e+ t+ h, e( c5 ?6 T
}8 Z9 |- _. z) W2 a2 O& Z, Q4 {2 Z9 A
int dram_init(void)
3 q" E3 m! H4 ?) G( t' _{
, B: f: P" V6 I        /* dram_init must store complete ramsize in gd->ram_size */
" u( k$ L$ p/ M: R) B        gd->ram_size = get_ram_size(* F) e; {3 L. u' l
                        (void *)CONFIG_SYS_SDRAM_BASE,. O0 Y# \3 W1 d% a' e, x! K
                        CONFIG_MAX_RAM_BANK_SIZE);
) T& E8 H7 v& H0 g) j        return 0;9 f& y- D: R, B7 T# b3 l
}
% y" u3 {- h% q* S* _+ ~3 m5 [* y) l& h. O9 e8 W

' X& L* f& C( H. [8 \2 s* ^
2 ]( B% D% Q% R; V8 y6 A" z" D7 u! k% |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* t/ P$ v2 A! a; E; Q: T

+ v& `; G/ x8 C! ~4 M8 u- [! `; B1 R  z* S( i8 J
0 y% j+ m5 B5 @3 y: ?. J$ o6 s





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