嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ o! V* l3 s( u
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* h+ ^% D) l+ w+ \5 n, Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; f0 M: B# ]9 ~$ c% N4 u
5 y6 e$ }7 E5 w  o/ h: w7 z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 V& j5 L( T% C/ r3 y' v2 A: i& _1 U  x. t9 c

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: ~. S. |/ I8 T# N4 K! `/ N/*8 A/ w; W5 ?8 ]1 N0 R! I$ j
* Check memory range for valid RAM. A simple memory test determines
/ M( W: c# N& ~' O$ E2 y* the actually available RAM size between addresses `base' and3 M* U/ {, D. ?4 u- z! o1 Z, q/ {
* `base + maxsize'.
; L, H: `* d: w( |: A*/; n9 a/ d, o, I
long get_ram_size(long *base, long maxsize)
* I' M$ u  e. @8 V$ H6 ]4 F2 K* o( d{
  w0 s2 `  r2 j1 A5 `* x- L+ e        volatile long *addr;8 J) G. z2 a5 b- Z# G, n
        long           save[32];
' F" o" P2 Q1 o( t! P        long           cnt;
: T. o2 |1 A' E& u/ C9 w        long           val;$ T6 S( D' [8 k9 i; U
        long           size;+ N* A' b: }7 n7 S
        int            i = 0;. v5 \8 T1 j$ r0 y: r- r  N

6 Q- H- n1 X( m& y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 M  g- a& ?# U3 D5 Y
                addr = base + cnt;        /* pointer arith! */
! }0 g# f" U( m                sync ();
" l& x0 J( n: E3 a- g8 w                save[i++] = *addr;
/ B# h3 j' v4 B) j. v                sync ();
, Y1 r7 M+ B5 R1 B                *addr = ~cnt;2 K7 Z4 u5 Y* U8 L2 s6 e$ p
        }
) W) {. y& v, u; U( w! K/ X$ ?$ h+ n) w: I4 U0 L
        addr = base;
! [/ y( v7 ~+ B0 b- Z        sync ();
4 h8 R! z4 a: e3 R        save = *addr;
0 y3 A( A0 j4 w, V, H+ }        sync ();1 d( a1 A% I& o: }3 \7 l8 i
        *addr = 0;2 m: E3 I7 L* }

) g( [/ ^6 ^8 x% L! ~! N        sync ();# k0 U7 I: o) c2 l
        if ((val = *addr) != 0) {+ L. Q/ H) Z% @5 s- S
                /* Restore the original data before leaving the function.
9 Q+ G; q4 ^4 d) x1 v9 N* T) h                 */
' p) f# y4 K! {                sync ();
! f& z4 c4 h8 Q/ E  `. H) ^& _                *addr = save;
0 U+ E* N; y1 a2 u" W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 A) a- G+ q2 t! F5 I: c                        addr  = base + cnt;
% s- ^5 m$ _4 z; e( @                        sync ();, X# q9 d- c" M* p
                        *addr = save[--i];
6 P" z, W/ h2 c) a                }2 b) w4 F1 s# r8 Q) R) b
                return (0);6 Y. `# f! q# B+ M8 I! Y
        }) \5 r6 e# E6 z7 n; n
7 C! x3 F: W  v* d6 d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' C' q1 }, U3 y& v5 V( w                addr = base + cnt;        /* pointer arith! */
, V$ N0 j/ d3 c! Y7 O( _/ @5 D                val = *addr;; U3 s7 J% S% ~* [+ Y2 D+ A
                *addr = save[--i];/ d* R( U/ k9 x3 N1 s' A- D5 K
                if (val != ~cnt) {
. j6 v3 D' N, ^3 P                        size = cnt * sizeof (long);$ P( M* d5 h; W4 F5 O. d$ M
                        /* Restore the original data before leaving the function.$ C5 G# R, T! R% Q+ v; i
                         */2 B/ s8 j7 P- B! M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 S* \. n( m7 |5 L5 x
                                addr  = base + cnt;8 L7 p; l# [" d2 t
                                *addr = save[--i];* M3 a5 u6 U; Z# v/ d
                        }9 u6 L1 @+ {- y. D
                        return (size);
- X7 @2 r! r' A+ w( q5 Z                }7 J* B5 ]; {! ]+ l0 m" ^
        }
4 r% |2 y! R4 t6 g/ Y. u) W: Z$ q; E, {3 X. a" ^, o* _
        return (maxsize);0 X! ?3 }7 s! x
}
( s7 k: D2 Z: Rint dram_init(void)1 R1 a7 }! ?9 C1 N# l8 n
{) [1 s) H7 L" i3 T; V
        /* dram_init must store complete ramsize in gd->ram_size */
) i8 X6 j, c& F  V        gd->ram_size = get_ram_size(5 _" P- l9 l: z" u
                        (void *)CONFIG_SYS_SDRAM_BASE,5 \/ R+ W" @- A' m6 i
                        CONFIG_MAX_RAM_BANK_SIZE);
2 C! \& \- J7 v3 W* O5 [        return 0;
; `$ x8 v" S6 G/ M( d}
$ V7 l1 @6 _0 j7 k1 A4 E( a
( I. e; [' Y5 g! B! `3 h
; \4 `+ C( @. Y2 ]( S. u
1 f% m+ ^( h4 I$ c& M. P7 @& Y0 o* _2 L+ g) p3 X$ I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 p; k  F- g* t' p" T

" T6 Z7 P5 N( P, _
) x% Z% t: p( x3 y' m/ x
" X7 P0 o% j2 A0 y5 b





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