嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- z6 x4 q& ~" W0 J7 o3 M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 n7 B( J& k+ H  w2 t) R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 I: w1 Z9 o% U) ^
, X- }# r  X  Z$ C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 \/ Q- t: Q# }& G
5 b* E- r8 \- s9 Z8 }2 g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! h; W9 C% {- ^$ m7 g/*( k  c$ O: Q( {. [9 n5 r
* Check memory range for valid RAM. A simple memory test determines/ X. s- g7 k! Z" W' f) R
* the actually available RAM size between addresses `base' and
% n  p( }5 q0 N5 ~5 O* `base + maxsize'.
) A$ g3 s- l! Z*/7 L1 J4 h* l; [4 M5 ~  C3 u) V) @
long get_ram_size(long *base, long maxsize)
. \& {. E. S2 F( k2 q/ t{
7 y) T8 ~1 X% G5 v- U* U* P        volatile long *addr;
. _7 `0 w' m+ l3 d1 d1 j( g        long           save[32];; G/ p0 W' |% f$ E3 i5 j! M
        long           cnt;; `' w# M0 f' b
        long           val;: k  m4 r( }6 U, e
        long           size;
4 |  ]/ c/ v9 Q6 B+ W! u  M$ ]        int            i = 0;
( U: u/ C2 b# F; ^! K
6 |# n2 o8 P4 }/ M/ ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* o( O$ P4 A& H5 Y/ W8 Z& r
                addr = base + cnt;        /* pointer arith! */
: n% @4 B; h0 v/ A                sync ();' j; S6 B( j7 Z1 Z  K: H2 L
                save[i++] = *addr;
  y" q0 W; t  O' h9 d1 x4 \                sync ();# {3 x* q% ]! i6 H* s
                *addr = ~cnt;: s. R) M2 b# I1 @4 x& p7 E1 T+ l
        }% V  b- Y9 Q. e0 M6 ^

" F- ?" W% r8 n" W        addr = base;: W/ z, Y) H9 ~
        sync ();  r! C( T* i, E, r) A3 ]
        save = *addr;7 G  `) T3 r: C. L
        sync ();
- U4 n+ D% v5 w( ]1 ^' I% {3 L        *addr = 0;
8 N1 g3 [/ s4 j: @5 e
: c9 p' X8 X2 v- @& V        sync ();
8 W! ~5 e5 F2 C- H        if ((val = *addr) != 0) {& U1 [# g' ]  A; b
                /* Restore the original data before leaving the function.
/ t4 o6 m# c9 q- `6 ~% f3 [                 */- N" \8 _6 i6 w0 ?0 ?- b( p
                sync ();
+ P) F2 W+ q1 ?. _( Q1 w                *addr = save;
3 x. B) ~4 H( N" S- E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 D! [5 _# l, E. {$ U3 |                        addr  = base + cnt;
' d! D0 c1 m/ ?! X                        sync ();
, o) ]- {3 ]! E( S! x, q) ]$ ?8 K                        *addr = save[--i];- N6 o- ~5 ]# [" k
                }
0 X8 W# Q' `. K+ W) M% i. N7 f                return (0);8 S- Y. l! n: M) Y' b0 {5 F7 |
        }0 Q: h7 |# w6 ?  @
- {4 B6 g# M; u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& V2 K! k3 n- T$ P
                addr = base + cnt;        /* pointer arith! */5 [' O4 {9 J% ^( O2 q) D4 o1 X
                val = *addr;
9 @* P$ N: H+ O2 I                *addr = save[--i];
. w& O# e4 t# l0 o4 T' g                if (val != ~cnt) {& [. {4 u: a8 E; E" u7 v
                        size = cnt * sizeof (long);
  H4 ^& ?8 s3 N* @# |7 n6 w3 a                        /* Restore the original data before leaving the function.2 H0 l, K. W7 S: t3 W; F
                         */
& f$ H1 \. x, D9 i8 O  I! o                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 k. M3 ~7 v/ X$ a& C6 [4 m                                addr  = base + cnt;( z' V& d* C! u, ^! B4 A
                                *addr = save[--i];/ v6 L; r% f4 t( N
                        }
: O! u& @% O6 Y6 f                        return (size);5 h' d5 ?( z8 W) b  z
                }
5 D$ X6 g/ x2 q7 i( S/ a        }3 k3 ~2 y% W' I  \; f+ T! Z
$ {8 a3 L+ [% k5 i( |" f! k4 o
        return (maxsize);/ V+ _$ o; g* o
}' E/ O3 ]8 K9 x
int dram_init(void)! j5 v' \4 ^/ m7 q" l. `
{2 `+ A1 I) l( d% q. M
        /* dram_init must store complete ramsize in gd->ram_size */
7 H7 A8 h  t9 {, C        gd->ram_size = get_ram_size(
4 H& Y$ R4 t, ~* _' P: v% `1 L                        (void *)CONFIG_SYS_SDRAM_BASE,3 v" e- y) A9 n4 f0 g
                        CONFIG_MAX_RAM_BANK_SIZE);
+ |$ j6 J* p" C" S/ S7 P5 \        return 0;1 ^0 [5 d6 i* a. L# j$ J* N; ~  q$ \) @
}6 ?. B3 [  l6 \5 n* c6 I# B
6 P5 |; l8 n& Z- l) v

' v0 Q7 K4 u" K4 n# K4 U& R; }/ w, Y
: S" O% v# ?5 Z2 |  }7 g2 c5 K1 @" n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; X8 A- X& c( b3 l0 J2 O

- p+ D; X2 Q- d6 p1 n8 X! d  p; \( a' A2 _  R

. _1 h1 t" ?% ]) p. D




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