嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 q' N1 A1 y9 {: M+ `7 w
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 Z! M% e, F5 ]1 e7 w! [这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' X9 h$ [) J6 {. |! l5 `7 }) Y* b4 ?
) e" Y. M7 y) T' ^0 d3 c% C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% C, C. z1 W# O; ?' d% s( N& S* y# t% w. y2 z, h

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 A3 Q6 s* Q5 g6 w0 I9 i, E/ {4 W
/*
2 \$ Q6 U' O: U6 X; `& o; x* Check memory range for valid RAM. A simple memory test determines
- n' D2 H+ L# K3 V* the actually available RAM size between addresses `base' and! e# b" h  B; M4 }7 T
* `base + maxsize'.
# r4 `/ B  d0 I*/
' j" C" g3 H4 f: N' b& D- P3 ^$ slong get_ram_size(long *base, long maxsize)
. k3 q0 I' @' |0 V( G' @{! B1 @( a" ^+ d/ [/ Y4 A; ]$ X
        volatile long *addr;
$ K( l/ e% Z- S2 K, Y4 o9 U        long           save[32];! ]- ?2 {4 _- G  j7 X# O. F
        long           cnt;
6 B7 F0 i* S; a( M* f        long           val;. B+ R- B' c$ G% q
        long           size;
& E8 S4 U; S& N) `        int            i = 0;# S+ K9 Z( W8 l; q

0 u* J2 b9 Y9 b( z6 c4 U$ L        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* P; e  P+ n8 s5 p" H                addr = base + cnt;        /* pointer arith! */
- g! A$ u& ]! _& P$ M                sync ();2 S. d8 P% s8 W9 b' d* _
                save[i++] = *addr;
! A- P5 r  T. t9 k8 L; b. R                sync ();8 V' D$ J3 e" R. I6 @  k1 S9 M
                *addr = ~cnt;4 S' N0 J8 ^" ^& b2 [0 U
        }: e- Y4 W+ @/ b+ f: o7 N
- G$ n* l" x7 W
        addr = base;/ o  [7 W+ \7 T5 i1 H' T! i& p
        sync ();5 F2 R; O- U& t' M, {4 S
        save = *addr;4 S6 F% d( U# l- y
        sync ();: h) N5 f- s# J9 {" ]. H
        *addr = 0;
8 Y3 b& \3 m5 b. r8 F
) e& G4 y$ U1 L8 x/ t9 L: E( v        sync ();1 a9 J$ U( Z+ P
        if ((val = *addr) != 0) {  B3 i2 P4 Q. _. x8 t" S
                /* Restore the original data before leaving the function.- P+ ?9 U: H0 a2 I4 c" |# C4 N* W
                 */
) S- j9 O0 _5 T0 J0 b' R: S                sync ();
3 d% R+ D' U9 x& ~. S/ E/ W6 T                *addr = save;) e$ \( m9 Z4 X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% @+ L$ S2 P$ U
                        addr  = base + cnt;
. j2 \: ]+ E' A: T; R" y                        sync ();" n0 |% k% J% b5 G1 ~$ u
                        *addr = save[--i];
8 W8 L, ~6 c3 @; U2 n                }
0 [' [* Y( e% _3 e7 A                return (0);
4 P  @* t9 b" p8 Z3 \4 r* \4 P        }
# `- M0 n2 N  {+ [* v9 h) `6 l$ W1 F2 V  m" z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ }* c5 s" V/ U/ ~* i( W
                addr = base + cnt;        /* pointer arith! */
. B& V0 @! O. }/ \3 t' i0 n+ M; M                val = *addr;" ], i( B4 a. D1 g
                *addr = save[--i];
% E" u$ q0 i5 y                if (val != ~cnt) {
; Y' Z( q& M2 n& r                        size = cnt * sizeof (long);
2 T, s& H8 C( S/ e- }                        /* Restore the original data before leaving the function.
; @0 E! `* J' v/ T. u$ n8 z/ N                         */
$ j7 S3 o4 A' N" Z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 l/ T2 e+ F' s1 P
                                addr  = base + cnt;; |+ R6 J. F# e: V/ \* \
                                *addr = save[--i];
  l5 |8 i0 V! B                        }2 d  o3 C. g; X" i. f% d7 q2 m
                        return (size);
+ _) U3 r* M2 E                }
, {8 P5 e0 c2 Y: f% G        }# }  M. M. Y* u1 x# Z; ~7 O2 Q

8 Y& Q) ]( z8 b+ G/ C        return (maxsize);
' s9 ?. m$ U" p% T, d}
0 h- q* c+ m3 qint dram_init(void)1 _; f) t3 X. a; y; C
{+ D& s4 T& P: {4 F
        /* dram_init must store complete ramsize in gd->ram_size */
! w3 ?! h+ m# J& I* C, o) B+ U+ o        gd->ram_size = get_ram_size(1 c) u- h2 Z4 g( Q) W0 V' ]' e
                        (void *)CONFIG_SYS_SDRAM_BASE,7 D( f, q; a' Z& d3 _% b1 R; u( O
                        CONFIG_MAX_RAM_BANK_SIZE);
0 D# }+ [" {. w* l; F; f        return 0;! Q9 X* c, ]8 I7 b7 D' Y
}, M/ _" V' w; T% [9 ~

1 w0 z) C" E( a/ ^
& r6 I+ \$ b( k. I: q: ]0 U* F7 E4 y+ k& E& [3 {8 ?. k

3 \0 i3 q( f' _# o3 P& yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 F0 d1 S: ^& v. P3 S- M0 z
# q% x2 |! q' Y1 u2 B( o# G: x9 v. W2 L) L; Z) R/ R

. D+ C7 J1 A- p




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