嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 W% O3 q$ ^: g0 F" M1 D* j' {: C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 ~! E- t3 t$ V, g; [9 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 w3 V( ]/ F% R5 V* l+ t; }. v6 |

, M. I6 R+ n5 X# D0 ]/ g是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* l* R+ n7 v9 h5 H9 W7 C( V+ ~- \! s# L) H5 B% N# b0 J& L. O

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- x+ A* K& ?/ Z! Z% f/*0 l( ^# [3 `/ w6 W; k
* Check memory range for valid RAM. A simple memory test determines+ g  `2 r. _0 j3 @5 C" \- V2 G  S
* the actually available RAM size between addresses `base' and
. H6 |6 Q6 [# v- A' C% E9 q* `base + maxsize'.
: N, f- w9 B5 ]2 S, Z8 ?& P*/
+ [* `2 l, t  A0 Dlong get_ram_size(long *base, long maxsize)
4 a# k, g5 s6 N) P& K: p: W{
' K1 q; X! ~2 Y7 W( T2 l" S        volatile long *addr;% N& y. D4 _  y; W3 T
        long           save[32];
- p" ~. ~7 X- ]. Q6 G: V        long           cnt;. ?; `* H3 i5 c% P4 r; U
        long           val;+ `7 h3 a* a! Y( L6 W4 U
        long           size;
9 k  \* D2 N0 s- d/ U% @        int            i = 0;
1 Z4 J3 T' s9 c5 }& t
4 y/ J3 D( C5 x& X( P1 I2 S$ e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" y9 K) v; m" N; J  \$ T
                addr = base + cnt;        /* pointer arith! */0 @' I& a- ^, J# S/ T5 p2 r; D
                sync ();  Z0 i0 M, }& s* P5 G, k7 ~+ _
                save[i++] = *addr;& m# t7 b0 P* U; V
                sync ();% S, l- ~! m9 m' ?/ q/ a- I7 f
                *addr = ~cnt;
; G2 n- V1 L  K. w7 Q1 X        }
$ b2 o. w) H- A- `+ \9 \/ `" v; V5 ~
        addr = base;% p4 W* K6 |% \# x8 m( K
        sync ();! c: W, {! _6 M5 K: J4 v  c# U/ w
        save = *addr;, ~; B5 F' R0 _: S: z* q
        sync ();2 y& ~& K' b  p+ Y9 I# O$ a; {. U
        *addr = 0;
/ N6 @* o/ f1 C2 T8 u2 m1 B1 _4 }5 M* C& _+ b# y3 ]+ t
        sync ();$ `2 y5 j3 O0 L4 }
        if ((val = *addr) != 0) {
2 S* U7 c! q, }2 d                /* Restore the original data before leaving the function.
: D2 J$ j, a/ c6 C) d' c: N" k- f/ B                 */
8 M6 `, q$ R) J( e                sync ();
9 p) e" o- Z3 b1 p                *addr = save;
1 ]6 W' r1 w- N2 d+ |2 ]% w                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 V6 ^: w- T4 C' m                        addr  = base + cnt;3 q0 J7 p; H5 f, F$ w  [: j  g
                        sync ();
# S! b; a3 S9 H4 j                        *addr = save[--i];
0 f( G. ?8 z* l$ Q* _/ l, u                }) F0 t. w5 S( e. x2 x) a2 |
                return (0);, J1 w% Q" W( d& V
        }7 n# c4 `& V% w, V2 Q4 F

: n( l& |$ K8 n! z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: P# p; d7 [5 {, b  Q3 ]0 S9 x. S- h                addr = base + cnt;        /* pointer arith! */
. x3 L( A0 D# q- Q. l2 H                val = *addr;: L2 V5 E$ F1 f# h2 I. ?) t2 }
                *addr = save[--i];" l7 @4 Q& p$ P8 p- b6 q( t
                if (val != ~cnt) {
' s  o2 g1 P, {" Y+ I; ~                        size = cnt * sizeof (long);, T( S$ h+ i" B5 h. B0 x
                        /* Restore the original data before leaving the function.
- |8 h3 ?+ x0 @6 E                         */
7 M0 \2 {; e% ]$ m4 Q/ H                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. F1 s$ Q" u, R. I
                                addr  = base + cnt;) c/ V  A" Q% v) Y( \9 |: d
                                *addr = save[--i];
+ [% M8 b+ X' C# `                        }
3 F# F3 Z- c3 I* `3 Y                        return (size);
: N( F: d6 n) v( m                }+ t0 \" H) {2 W, ?0 m/ \. H( r
        }
$ q) V. g- e. a: r# H" u) F% ]- j& p+ y3 D
        return (maxsize);
+ h% C1 h1 o% n8 r}
( K8 `; |" v8 I  {' c. z8 Cint dram_init(void)2 h  x8 q5 I  ?5 U2 |
{
  i  y- w$ b' T  S+ C* F        /* dram_init must store complete ramsize in gd->ram_size */! C4 e- ?7 l  z' c5 a+ B9 m
        gd->ram_size = get_ram_size(
1 Z1 U: g! ?& j5 Z  o                        (void *)CONFIG_SYS_SDRAM_BASE,
' O$ J( n& z+ m. `1 j                        CONFIG_MAX_RAM_BANK_SIZE);
$ @" s/ y9 m) i& ]: p        return 0;0 Y' f0 R! x/ V/ w& x) k
}
, N: x- O$ {/ J
8 O' e+ w$ A" V4 B/ B" m
' x9 F( k- j: l, E! {; ^3 ~% `9 n0 g; ^% u, I2 g" q4 x

, E7 c  E+ K, Q0 PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. K0 F4 R7 o5 R4 K
1 X4 {- c1 B3 [9 v, c. D
/ T) r7 e5 I1 L
) J+ U! J$ I0 b' U9 k





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