嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 d/ q% F9 a; w核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 _4 Z$ d# D% L* ]0 ~5 X5 P- T8 t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 _2 e; B1 P7 v, a  ]# T5 E9 K1 ?
3 g  S5 D% }5 P3 a( ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 e8 z, o$ K/ @$ x0 V$ G7 z$ h  v5 G5 B/ _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 D& D9 [) X5 C! u- D/*( v2 S/ f6 ~" z' v
* Check memory range for valid RAM. A simple memory test determines
2 q9 x) `7 Z+ _: P; \* the actually available RAM size between addresses `base' and
2 m( d6 H$ ?, O& n# q! g# h4 ^* `base + maxsize'.# `/ R8 P2 u0 I" Z" E; n
*/! L- N/ B6 f) ~0 `
long get_ram_size(long *base, long maxsize)
, Q: K. u& h# K* y; \4 I% ~{
3 {" H0 S" v6 v* B- C        volatile long *addr;
8 P; ?, c3 j+ O6 d+ K, G        long           save[32];
, g6 f4 @- n" v        long           cnt;  Q8 T  l6 m6 \  u, Q  f
        long           val;
' J% Z) G, e2 v- ~, i% t        long           size;
" M, l) P- a; B) Y/ L0 f! c: P        int            i = 0;: @* z, z7 Q0 f/ z
1 J. Z1 J) u% Y4 l+ q$ H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, x* b2 p+ e! I6 k( x% Q2 [& o                addr = base + cnt;        /* pointer arith! */
" ~' x# ^! t3 m! h                sync ();2 S) L6 j! S0 P, r
                save[i++] = *addr;
2 K: g2 c* p. d5 a& n; g                sync ();
( p+ m0 w; x! D" X/ T! H. R                *addr = ~cnt;! S9 r+ ~% ^! G  u
        }/ z' S% h7 U& X

; B- O/ M9 R) |. ]% T1 N        addr = base;
6 ^* d0 X' |( `( T; s3 v4 T, ~$ k7 Z        sync ();
1 E! u; T, K4 B; J9 J        save = *addr;/ h* U1 r. Q- h' s- T
        sync ();
6 C% H: }; n3 y% }5 i" N4 X        *addr = 0;
, _0 T4 _( A1 p5 I/ g, s& J2 r
* t5 B  v1 P5 w% R% C& H        sync ();( f# W# j0 X/ p$ ^) ]4 T" s. m
        if ((val = *addr) != 0) {
/ h- ]2 B6 f9 ]                /* Restore the original data before leaving the function.3 ^1 k) j; x+ ]/ f4 U4 O, m
                 */+ N) ?$ T) T; O/ S
                sync ();: T( ?5 T  r* [7 ~
                *addr = save;
) @+ e. l9 O5 Q6 s                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 |9 t' _& {( l, c( k- Q                        addr  = base + cnt;$ h) F9 |$ X7 G6 @' x# ~8 c# Y
                        sync ();0 \/ z3 j- `' T
                        *addr = save[--i];
  h9 o8 t: f' U9 r7 [                }
8 V/ w$ E$ s$ l3 g8 o" ^. \& V                return (0);+ W) w1 g$ ]: `3 I. M
        }
. K) L' k7 B- R7 X1 Y$ e
+ g6 m4 l; z, `. D        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# A- N5 V  |6 @! ~2 U- y                addr = base + cnt;        /* pointer arith! */
2 V, s6 {+ p4 J; x. ^4 T                val = *addr;1 e) f' }7 u4 q
                *addr = save[--i];
2 F" o6 G5 S5 H; v$ Q                if (val != ~cnt) {
3 i+ Q- N2 u2 U( d3 R$ U                        size = cnt * sizeof (long);, K" D+ W. w, Z2 f7 M! Y5 M2 F
                        /* Restore the original data before leaving the function.  C8 t- B6 I6 q# i. X- N
                         */: }: T6 E3 Y: x) S* X
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' j- j  k4 k8 l3 ~5 v7 s
                                addr  = base + cnt;, a+ T1 y+ Z- U* Z. Q* L) ]  v
                                *addr = save[--i];0 M' h% P1 A% G( g% V
                        }
0 u( a. T: A" m" g1 k                        return (size);. g9 i* D* Y0 W6 j% ?
                }; r* Q' |& z: p  R
        }
6 r5 K+ y3 p2 L0 E  `1 V; E* s/ G; ^4 C0 V: V3 s" h$ L
        return (maxsize);! s  n" @& f9 r
}% M: M: f5 s* Q% M% k3 i: _
int dram_init(void)2 m+ m" v) O1 h3 K$ M" X' e7 r
{
4 r6 o% T, N7 ?0 G1 _  E- I        /* dram_init must store complete ramsize in gd->ram_size */- D2 C# ^# ]; ~& [
        gd->ram_size = get_ram_size(& x! k( L! h& y" Z( z5 ^* A( ?1 T
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 Q& s" w: a- u& y" I                        CONFIG_MAX_RAM_BANK_SIZE);: [7 N% ^! v9 |4 \, N
        return 0;
8 d$ r$ }4 v2 g8 Z& ]. M}  |3 y+ L; Y0 @7 g- ]
/ {6 g* w; Z# C; v1 r
( Q1 K' l$ \3 b2 W# A: H3 T

  ]" d: J/ Z) Q- j
4 G/ i  }: n& g$ q' g2 dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 Z( G! B4 e" N

- h! o) d  X( }# B$ a7 Q$ z# m9 _* t; @9 s+ f8 e7 U9 i
, A6 j( E0 H6 x4 q' K





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