嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' k; `/ i+ b, [核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ N8 @( a' L5 S这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. y4 S8 W9 o- T( z& v" x+ V
/ k: I# _4 a1 F  V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& P' O  C1 ^) j
0 ~% A0 ?  O3 z* o5 x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) O" c" X1 k' H2 B
/*' d0 ^7 c" _3 w/ z* }6 ^. k
* Check memory range for valid RAM. A simple memory test determines$ l6 L4 @) w4 J* ?4 I+ w  b5 y
* the actually available RAM size between addresses `base' and
; E0 |0 e5 U( L* `base + maxsize'.! R! ]5 H9 \- t" ~* G+ L# E
*/# r6 G4 `  w9 L: W7 ]; x* E# ~
long get_ram_size(long *base, long maxsize)& j" s. z6 ~8 {, _& n$ J
{
4 Z- }7 C! m+ ~        volatile long *addr;
) [' J) X- `! W7 P2 q! t7 A        long           save[32];
$ `9 W0 i( S0 {9 q8 R# a3 \* u6 ~        long           cnt;5 d  B' {) z$ S" R* W
        long           val;" ?$ j7 P- N- }! v3 p" k" g
        long           size;5 m0 @9 V% k6 \/ E. |! ]
        int            i = 0;( F( n: k* \8 n

, W: f& W4 w7 v+ i1 j8 U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# ~) b7 x9 S& H# P                addr = base + cnt;        /* pointer arith! */( |* F0 J* N* \) G* e! K
                sync ();9 D& G' z: n2 `
                save[i++] = *addr;* m9 N  y  V, Y3 I& Q
                sync ();& X2 v" s" Y' W& ~2 |
                *addr = ~cnt;' R  c( x; z: T3 M
        }/ ^& f3 y  Y' J5 v, R2 g

; ~/ q4 {2 A9 i4 H- ], X5 o! S" g% F        addr = base;
  H9 W* l- {; [+ t        sync ();
$ w+ B7 U& Q* p- b5 U        save = *addr;4 V+ ~& b' V6 }; w7 n* T3 M$ t( o
        sync ();
/ V. U: {$ \4 i0 h        *addr = 0;. I7 |0 z6 o8 [3 ^, c4 d8 }

# \4 m4 R8 w. G9 @) V        sync ();% C3 k1 T. q6 Z
        if ((val = *addr) != 0) {6 K5 U# f+ `7 }3 G
                /* Restore the original data before leaving the function.
( V3 V# y4 }: D                 */' {- B* A/ p; G  h! ]! d
                sync ();
8 \/ D/ L2 H$ p8 E* h                *addr = save;, Z: k' C) A$ q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 o% C7 r1 x: S. q7 G                        addr  = base + cnt;8 |+ R3 x% N2 u( R" r+ e9 ^
                        sync ();
5 `- Z0 }" U# B; e                        *addr = save[--i];9 F) _- T) A. a7 g
                }
' x8 Y7 o- q2 R' Y2 O% c' @( D                return (0);! n+ ^/ J) ]5 T- D6 h
        }, N7 {3 K, t7 X: g: y
8 j, m' n& I  ^9 C* o4 V6 ^! ?
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& d4 j  T9 C4 ]/ M9 F6 I
                addr = base + cnt;        /* pointer arith! */
: L: K; b. x, H! V" u9 z& n                val = *addr;) T9 J+ T/ Z2 l& d: o
                *addr = save[--i];
6 j0 W: ]+ f9 Q0 m- e% B                if (val != ~cnt) {- ~; H' X# V' ^  F9 {* z0 B
                        size = cnt * sizeof (long);
  q4 j. X6 X$ n$ X2 O; W$ I& w                        /* Restore the original data before leaving the function.  Q/ L$ F! a  ^
                         */
% a* ~# s# Y1 L0 w3 n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# i5 Y9 b' }, t9 ^% O$ R
                                addr  = base + cnt;
$ c" W2 `. M9 f2 R; X                                *addr = save[--i];6 t/ k9 h/ M4 @, N2 t
                        }
6 n4 L; x: @/ S                        return (size);
# c) R* w9 Z- ]+ I5 j                }5 K4 I% a" Y$ g  w4 ]8 J- X$ b1 p
        }
) k) g# q/ i1 V3 t% O, g+ F! b% ?  J: ?# Z' _
        return (maxsize);
5 p- Y# p$ [& L3 @}0 A& o0 x% x1 B' B3 }2 q& Z7 z
int dram_init(void)
( L0 j8 |/ \' S, t{
7 K) X2 `; \, O5 C* p% R        /* dram_init must store complete ramsize in gd->ram_size */) x) I. G- [' w3 ~* W% g7 f$ d2 P
        gd->ram_size = get_ram_size(
4 z0 O. w4 K! D" y* g* O9 u                        (void *)CONFIG_SYS_SDRAM_BASE,& k5 {1 Z# s$ B
                        CONFIG_MAX_RAM_BANK_SIZE);  {9 U$ n, F9 i- d# @3 r
        return 0;5 O0 u; {7 Y. T) a5 @) S
}
* e' h- j/ G8 u$ m; T  A2 [. y$ E- V* x$ N) Q

3 g# o# b" [( B; t
0 |" ?4 Q; ^5 O
8 k" E- T) B% T) Z! I8 ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* A9 j% o( e0 j) a- f% @, e3 E

3 T2 ^* `) C8 X0 c" L! t2 w2 v+ _

8 _: u" y1 P9 s6 B




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