嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 f; G- x4 j$ ]) L& y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: `( v8 s2 y  x  {7 q, H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) d& G2 L. G# o+ I
! ?5 L* ^0 A5 A是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 b( t% B& D2 R" d+ W

1 E7 \) |8 H- ?* W1 E& N, B, b. F
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, d/ Y  Z. D' I, V2 ^2 C
/*
# d! X7 V2 _( J* Check memory range for valid RAM. A simple memory test determines
/ k+ @/ r2 U/ y! Y, y- v* @/ u5 N$ V& a* the actually available RAM size between addresses `base' and
4 N0 y$ q+ j+ @- j+ y& C8 ~* `base + maxsize'.
( ^" k! A" k0 W% C5 X5 f4 Z3 d( X4 B*/
( [& g- G# y6 ^, |6 S, Q5 b: }long get_ram_size(long *base, long maxsize)
1 Y: U* Q2 ?4 n4 V1 x, J{' M0 }) x9 {3 Q, \% S6 l6 I
        volatile long *addr;9 }9 y0 r. C( f0 j
        long           save[32];
" {$ W* m. T4 P5 N        long           cnt;. X+ d, r2 Q7 I0 v" d
        long           val;
6 g% @6 s" g; I$ ^        long           size;
! L; Q, e2 h# @5 P; T2 w1 [. C        int            i = 0;
$ ^) h0 j. n3 s- W& C) U6 n5 _5 m0 Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, ^; A, F# h* E3 k' L
                addr = base + cnt;        /* pointer arith! */+ _, |. x% d# ?5 ~* Q5 {2 U6 i
                sync ();
; Q" b8 e) O6 L+ L9 }( O( y, V                save[i++] = *addr;
1 K1 q8 p9 A) x) Z# O                sync ();( N% S- f1 ?/ V4 S* r6 X9 x. s$ l
                *addr = ~cnt;2 U3 K$ u# s& d" {% m' _
        }8 Z$ j6 K2 c6 H+ h4 I
; c: m' ~6 _3 L4 X& N+ I
        addr = base;7 w% p8 K7 ^* }
        sync ();
! D7 P5 X/ `3 K2 O4 \9 B  ~: E7 q        save = *addr;
0 F& g3 R5 I7 M! O% z        sync ();
% B) k% [: J0 f" U' T4 F1 Y' ?: |4 ~        *addr = 0;
7 t6 O* k7 c/ ]4 U: `% [9 p2 ]
' x# B, ^% p% O6 _( b$ S! |        sync ();
, v$ [; o8 K* e! x# f4 S: B        if ((val = *addr) != 0) {+ S9 D) Q0 D+ E& D, F& _: n2 g* o
                /* Restore the original data before leaving the function.3 G( v2 C* F7 L' h( y
                 */: \' h0 i( ]" b
                sync ();
5 S3 s. k2 S& d& V                *addr = save;
) o0 |  w0 E. ~* [; S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- o$ ?- z0 v# P# `7 [
                        addr  = base + cnt;* k* G4 A0 d. V1 w
                        sync ();  h- d: d4 o9 U3 `
                        *addr = save[--i];
+ @' D" D" c6 s! Y  v                }) G9 ?8 G  H9 F; d2 N9 G0 s
                return (0);
, ]* a: c( U* o* i, O        }2 `% W6 G, r+ |+ `0 W
) A4 E" l) f! o% u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 N- ?  M/ w( I0 M7 U% B$ v* `                addr = base + cnt;        /* pointer arith! */
& N0 I2 ], N9 _& x( y; A( P, S                val = *addr;  E9 k% r& R0 d3 X
                *addr = save[--i];- K& D- c9 g- |0 H9 T( C
                if (val != ~cnt) {2 C. I% L) N! u, @0 C  e; x) E; q
                        size = cnt * sizeof (long);
. G; }3 ~7 f8 S/ \7 y9 x" O                        /* Restore the original data before leaving the function.6 i0 _* e4 K% Q5 y9 N9 C
                         */
9 g$ s8 Y3 z$ t2 h3 V- s                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  e) I( I2 O  f4 G8 ^                                addr  = base + cnt;" N- d8 y( |& A% l0 _2 v
                                *addr = save[--i];9 M7 F$ _: o- X9 q! G1 G
                        }) U! i0 L( E; }) N* ?, [  ]% y
                        return (size);2 u" ]  v0 U) H4 u7 @) i
                }
+ s" V9 r* n# _        }
# O. G% a2 B5 K2 o" o. O% x) d
        return (maxsize);
6 }. I2 g& b5 S# @4 ~7 x7 h- R8 K& t}
9 E( t* R0 J! r: |int dram_init(void)
) g! ~, r5 {: k/ N( A{
7 q6 B, e) s& n0 o        /* dram_init must store complete ramsize in gd->ram_size */' B' R6 k; Q: P% Y
        gd->ram_size = get_ram_size(
0 l8 [, h! ~* Z; C                        (void *)CONFIG_SYS_SDRAM_BASE,5 x! ], }3 i6 D7 g9 J' P
                        CONFIG_MAX_RAM_BANK_SIZE);7 r6 T9 h; X6 e4 {0 ?' _
        return 0;
1 b) D1 o/ c" t  F* \" o}
! J) l2 ]8 T, K! T% y: P% i! h& i; F6 L  v0 Q- p  |5 w

% P9 t: C& {. m2 T9 L% d6 p, b! T' z$ U. b4 z2 h5 o

) ^. A% i0 k: DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 g; B% ~0 y9 ]9 O  H! z4 Q% F2 Q
! I+ y( j9 Y) m, z. ]6 O
8 A9 {- S7 l2 Q* J4 @

, k; T& K* L: r0 W& P




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