嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 l1 f$ _4 S" E: G% Z: U; C核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 t/ [; O  k8 b这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: x1 t! I# L3 R- e  s
+ D- l7 e& r& g0 U. A是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) T& m; D+ l" p0 D5 ?9 G

! a, B! [' G. ~6 J: |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, K0 q$ t- |( K2 g; j
/*$ ~: ]% Y, J4 w" z" D2 G
* Check memory range for valid RAM. A simple memory test determines& M' W' r2 H5 C
* the actually available RAM size between addresses `base' and
7 |6 S, E* r. L* `* `base + maxsize'.
. B, J' s. M4 w6 |*/
1 ~7 n3 b2 N2 N: B; U+ H0 ]long get_ram_size(long *base, long maxsize)
) |( b9 z5 y+ o( J{2 R8 L  \% e. T1 f
        volatile long *addr;
; w7 ?8 b. q6 k$ r( M2 Z        long           save[32];
% m1 {% @) M* {; H! C7 J        long           cnt;
0 k  s4 V( f( ~/ g) o        long           val;
* @! o1 q, O2 A0 J1 l4 M6 M! A        long           size;* F$ W! R! p' Y6 `+ @3 y8 _
        int            i = 0;0 E1 b3 O! W5 Z; ], Y4 M

1 u1 s4 I8 g% @7 m7 ^$ Y& \) J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ u& {3 h! W( r9 A2 ^* A1 S, z6 @! ^
                addr = base + cnt;        /* pointer arith! */4 A. t+ o" j* [
                sync ();9 S% [9 A& W1 [  I5 S& c0 x
                save[i++] = *addr;
. N6 [( n4 t6 V                sync ();
4 x% \0 U5 J- i0 [8 Z2 t7 m                *addr = ~cnt;
! b, u4 L7 X& |        }9 f* l' D/ I: h  c  I% `

2 f1 R9 F% A/ Q8 W$ R6 n        addr = base;
: l" u) Y# M0 @8 e' [- e6 b- {        sync ();, Z7 H1 u& ?$ y, A
        save = *addr;) w: k. E4 Z" {: z, E; }3 C# d
        sync ();
, i- v9 [  ?6 }        *addr = 0;8 S, P; Y- n; Q" Q: j

# t$ w  S8 f$ Z        sync ();/ L: s9 J" i' K6 h  T) S
        if ((val = *addr) != 0) {! M8 p" l1 ?, e5 V4 C- J( f% w' e; k
                /* Restore the original data before leaving the function.3 y4 H. L0 D, L/ V! `- h; Z
                 */
! x, a  c! f5 |' Q7 Y% |0 n# t                sync ();# _' z9 f# E3 a
                *addr = save;
: T( m+ `+ t0 Y' H5 ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) x3 z; x4 @9 V+ e% @) Y0 f5 @
                        addr  = base + cnt;
) F# G3 m! t  P+ A" O                        sync ();; J& Y9 {( j! j
                        *addr = save[--i];+ ]. E0 j. [) J9 _
                }, E4 R% R) I9 F7 i8 t8 E2 m
                return (0);
2 o8 z/ C  C! d9 H) V        }
& Y* T' c1 ]/ f1 p" p" b7 ^+ N" w7 r- J. u1 A& Q: U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. E0 g7 x; E; p: `( Q
                addr = base + cnt;        /* pointer arith! */8 T% @% n8 F. `/ k4 [0 V
                val = *addr;6 o+ M! C; F- B: P! K
                *addr = save[--i];
- L5 A- i. P5 V5 R& g/ m9 r% J' V                if (val != ~cnt) {9 D# B, v6 {$ A7 S
                        size = cnt * sizeof (long);6 Y! e+ ^" Q8 h2 t% D0 Y
                        /* Restore the original data before leaving the function.
$ e, Y" d' X; a2 a                         */
! _- Z( h* g! E. }                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* V) ~! M/ o5 Z, K, p
                                addr  = base + cnt;* s9 U% G! M3 f. X8 n
                                *addr = save[--i];1 z! E3 M7 Y$ i7 ?1 t3 W+ B
                        }! W; Q1 w- H: r, `# |
                        return (size);7 D# b2 z) D  V5 }. h& ~$ v8 w
                }6 f7 @0 e8 t9 n# i1 \6 I8 J
        }6 u: Q+ {. y8 e, z+ e: T6 c) `
7 _+ N8 B7 a2 ]2 D2 e& L+ F( Q' X1 y2 K
        return (maxsize);
2 x: \2 C* T7 \, R! Y9 f}
2 E6 `- p0 @) _" Fint dram_init(void), R6 ]+ }$ d$ M! M# }3 @6 {
{
% @  _8 M2 I$ q        /* dram_init must store complete ramsize in gd->ram_size */5 D0 v3 ~/ L0 k
        gd->ram_size = get_ram_size(5 p& P1 ~/ R# _/ {% @6 k. {! e
                        (void *)CONFIG_SYS_SDRAM_BASE,
) F% `! v; O0 w, x  a: f2 H                        CONFIG_MAX_RAM_BANK_SIZE);/ I$ L1 e! `5 S
        return 0;
6 v7 ?) @8 K" y+ z0 ~0 p* w}3 @2 ^% X; C2 K; O9 L( L8 X% D
* f% j' B# }8 v5 C+ E. K( w
  y' E6 z" A0 V/ H+ M; \8 P8 L: H. q
7 I0 |. K1 y* e, I; ]" U

5 _+ Y% V& V' e$ k- t! QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, U0 ]1 i8 G; ^8 S. s8 U" i5 d" ~2 @
. Z! y) J, }8 s, |7 z

) A. C$ K0 u5 N+ u* l
, Q/ S1 |: }# e. Y8 L





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