嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. Q+ k) e5 Q8 Y, N% Y5 Q% d( b, x: \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) K1 G1 D0 J4 q$ a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( G' h& @: J* P% T" l
) ~! p0 e7 v- S# w! ~0 k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 m" K+ l+ {6 V" r, N$ B! M4 I: @8 A$ g

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) u* a% n9 F& G8 \- L" c  `) Q- Q/*7 O3 H9 ^- E! }; ?% g9 l
* Check memory range for valid RAM. A simple memory test determines5 b! n5 ~6 ]2 }2 ]) K
* the actually available RAM size between addresses `base' and* w# e0 c. P% q3 {1 s% A
* `base + maxsize'.
' x5 y6 {$ z5 G" l) y/ [- G4 M$ t. O*/- L  Q. s3 S' Y" k
long get_ram_size(long *base, long maxsize)& ?: C0 Q# f, ]
{
7 ^+ x. `+ A$ Y' \# v        volatile long *addr;
! }7 a/ M& Y  B" J        long           save[32];" M' G9 N4 Z6 g
        long           cnt;9 }3 j" P( d8 h9 X5 R& _
        long           val;- a' g, Q. C" _
        long           size;* Y  n1 O# d. I& a8 ?
        int            i = 0;
+ g+ I/ o- z7 C% o4 d0 D; }* }/ \& |- j9 f8 r2 g: H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 w" w; Z3 D- U. m  T$ O: ~                addr = base + cnt;        /* pointer arith! */
# B# n4 z! b0 r- c- m                sync ();
9 R8 B) n, u6 ]                save[i++] = *addr;& Y# {5 ^+ F% I" [
                sync ();
8 R7 F$ P+ p, C: c                *addr = ~cnt;
" `6 w& l1 o. F& D9 b7 ^        }
; }2 q2 f3 o% |; Y. g0 ]4 u
  E" ^% U' e! _/ q* O        addr = base;
- p  m2 V+ ^, S2 C, b8 W, Y+ r5 i        sync ();; f# V- ]& `8 n2 I, Y$ k
        save = *addr;
' P4 J4 S( h- L1 ]0 j- Z! s        sync ();
; U6 K1 F2 X4 x! d        *addr = 0;
$ B# B# D% ^8 ~9 }% ?- H5 X# Z- E8 Y# y
        sync ();  ]0 {4 U) f$ G" i1 x
        if ((val = *addr) != 0) {! ^/ d- S: l$ `2 G  i. }
                /* Restore the original data before leaving the function.9 ~$ r& x) t7 Z9 K7 I( K* G
                 */0 d1 N7 U7 a: \; r5 D" R
                sync ();8 v, v+ v8 `+ [+ ~) R
                *addr = save;
; n: ]7 i; t: Y1 @/ b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ P$ @5 i3 V3 b) G: u% h
                        addr  = base + cnt;
6 ]/ _! L. I0 i* x                        sync ();$ z) D6 J8 R4 E/ G, @1 W4 @
                        *addr = save[--i];, \9 h  U/ E; B
                }
6 w+ y, S7 o# s. J                return (0);
: E6 e4 g) a/ z6 p* x% l& u1 S        }
) b: N- F2 y1 ^; F( O1 I7 P) R
9 Y3 C3 E2 |5 q- q+ x        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( G7 e! F$ u& N, V- s3 u
                addr = base + cnt;        /* pointer arith! */) T+ I% l; t( G0 \+ J; t: P; D7 @
                val = *addr;
! U" ?# A+ E: N; P6 J4 L  f                *addr = save[--i];
. M6 [* G7 w1 A  d2 O. q% L; m% k                if (val != ~cnt) {) }9 Y3 h$ ^% b$ p9 i2 C
                        size = cnt * sizeof (long);/ v+ N; A4 j5 P) ?3 I4 \* m7 H8 `
                        /* Restore the original data before leaving the function.5 i- V. _% Q6 t2 z9 r) }
                         */4 J% N. K+ K2 H: |2 j: ~& e
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  H& \7 w2 O3 a5 G
                                addr  = base + cnt;
1 k1 P1 R6 \/ a4 Q1 ^                                *addr = save[--i];. U6 r. d& ]' S1 Y7 u% m; ^
                        }
) K& ?8 r7 H3 y9 x# g! S                        return (size);
. @- Z) [, @* {7 ?" J* x2 M                }, H7 y5 A9 t. D. X
        }4 W# _3 x% v  a1 A  P  a

: @$ q8 Q/ d* O* |) m0 \        return (maxsize);
3 H$ x7 q/ g) s/ ]& x}0 |7 v. j; }! J6 |. v, s6 k' L
int dram_init(void)' Z5 b6 Y, m5 D* ~; s
{% _: O+ Z+ b9 P
        /* dram_init must store complete ramsize in gd->ram_size */
( R" @1 c' J/ U/ m: x+ l6 F        gd->ram_size = get_ram_size(
$ p% {/ G" C) K6 N                        (void *)CONFIG_SYS_SDRAM_BASE,
) [* u- ^7 C5 p0 ^4 f                        CONFIG_MAX_RAM_BANK_SIZE);: l  l# q& O( k' b
        return 0;9 x2 ^. }0 R( F' W  ~
}
9 y1 N7 d) _% v! f9 t0 m9 I4 h  i' t8 @1 w* d* f
+ ^  U* e  j& [# C( M3 b5 X

2 @4 q4 x& L- v8 d2 J: g1 _  i, ~) Q+ _6 H; M. Z7 n9 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. |0 m  X! X  `: E( ?  l
! ~! P3 `$ W4 h) p8 V) F
7 a7 J8 g8 J7 V
* ?! E* H! A. S8 Y! P





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