嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: }, l" c3 Q0 f' u3 r核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- S- v) r) }+ }5 c/ W9 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# e1 @! N/ L% J1 @2 [" g9 H3 T! p
( S# W% L8 z1 Q/ @! l( _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ]6 Y+ w% M- D
  R7 B( @4 D4 ?! \& g# J! K; g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 L7 U) \2 f# ~9 X9 ^) G
/*) |) V) R1 j' ], x  G8 D, f1 ?
* Check memory range for valid RAM. A simple memory test determines& i! c) I/ o8 p
* the actually available RAM size between addresses `base' and
# j1 E3 V* }% K: G5 _* `base + maxsize'.
$ S4 D: g& Q$ _5 W% @8 ^5 J: {*/
5 s8 ^* r8 k2 B# Ulong get_ram_size(long *base, long maxsize), h9 f& f9 v8 c: V, l- _  ]0 H. ^
{, j# {) Y: l1 W- A2 ?& g- p' [
        volatile long *addr;  w4 j: l( D. o! o/ \
        long           save[32];+ m. j  a" q% {; L5 o
        long           cnt;
5 t& z% [' b, Y  ]        long           val;- \4 x! w+ V) y7 p- [" e  Z+ [
        long           size;* l; D2 g6 z) H# X' J  ^; V+ @) K
        int            i = 0;
6 k8 \6 ~# |  S7 w6 H
& r) y& r# j2 a. k0 n6 U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  a5 b3 ^' X9 j& l7 p' V  H$ j& C2 F) S                addr = base + cnt;        /* pointer arith! */
; Z: s" M5 d4 e* F( D# Q; l                sync ();
% H! j4 ]: @- E                save[i++] = *addr;* Y1 j; v  G! D$ k- @
                sync ();
2 z( ^* g4 }+ i5 M" J                *addr = ~cnt;
* p  j2 O. u, H& f        }, {$ o. K* H, m$ h' K7 `
' R! `7 I. r- i
        addr = base;6 \3 _, f, V# T' w: o7 f
        sync ();& x( Q9 i6 I( X0 u
        save = *addr;8 Z8 v9 c; c6 d  S
        sync ();
' Y8 d5 h+ T3 J7 B        *addr = 0;6 w: H$ H. H% ?6 \4 Y! c, [+ d  {
8 d; x' A. p+ n* t+ M
        sync ();2 N1 S+ w- @- ^  m$ n, J
        if ((val = *addr) != 0) {$ Z$ a; T& ?. @  c$ ]
                /* Restore the original data before leaving the function.
3 a' j2 ^) y" E8 c                 */# E  c( O- T, L7 G: w
                sync ();
6 z, ]2 E* j3 t, O* S                *addr = save;8 ~9 r) ]& h2 Z8 B; H
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# J/ ~' C* @8 v: j0 I
                        addr  = base + cnt;
8 |0 b. P9 B# v* Q6 t. f" x                        sync ();
" W, k* x3 g1 |- m  x                        *addr = save[--i];7 v1 I$ q6 y& M3 p0 M8 `4 S
                }: ?% H- {/ U: u4 x
                return (0);
0 F- F- M) L) G  U5 w        }# J  f1 a9 H4 q; A7 d" m
* B4 ^9 H& O" l, C( a) Z5 N$ A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: l  P# B0 O  f
                addr = base + cnt;        /* pointer arith! */
- w6 z) O2 |: K) l2 }: U7 M' ]; E                val = *addr;$ f! j! ~) L' E% l5 n' b3 B0 t+ B& O5 a
                *addr = save[--i];
+ {& Q! h2 G4 `' a: h                if (val != ~cnt) {
* Z5 i! X0 X9 P0 G8 a+ Y                        size = cnt * sizeof (long);
1 e2 X! U6 n. ~' c3 C2 P1 U& i                        /* Restore the original data before leaving the function.# o) n6 w+ x6 C2 h
                         */
1 v+ u* A0 T9 c0 y8 V1 _1 g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# i, H4 m- Y# c0 {                                addr  = base + cnt;- b2 ~% z. p! Y- i
                                *addr = save[--i];2 n: ~+ ?+ Y+ }0 Z
                        }
: g7 W2 {/ i& i: j5 s7 G( n% q                        return (size);
4 W! @; U. Q! y: E* q5 q                }) h5 M5 q2 C) j* i/ I
        }! |% k( @* {  U: Y8 J; R8 m

1 S- E1 k( ], K5 N" P        return (maxsize);4 I2 e2 w6 v( _  T1 p# X/ a4 x
}
) h/ [. B" _$ h/ uint dram_init(void), T& ~# d) G+ ]0 w+ x. M* T
{% x0 m3 {7 K' O' ?
        /* dram_init must store complete ramsize in gd->ram_size */
- |! B5 f: H  @        gd->ram_size = get_ram_size(+ j8 x& n. O( }3 \7 T3 u. R9 f( k
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 m0 |" E3 K' G7 K- a9 ~                        CONFIG_MAX_RAM_BANK_SIZE);
  R* \6 V: h9 s4 X        return 0;9 K% @& B! k$ k" t' n
}4 @2 C' ~7 f& D+ V0 k
+ T3 Q7 {! v0 h/ N, M: r% V
* d7 x5 u" t9 K' A; U
% v+ }9 m3 U5 g0 q2 E% h' N8 B

) t. f1 M. N3 s0 xFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 i% `& u, g7 n0 _8 n/ M* H4 {  u6 G. z. m8 F: f

# D5 Q6 P" g. c* ]8 n! o
6 ]$ D# k/ v! H2 D, \$ j2 \! H0 r





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