嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 U% ?  L: w9 D核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 A1 s2 \- A# ~( C. P1 I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 N+ L4 a" f2 C6 w& P7 y' y

2 F' X# q* f' \/ }1 m, |- u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; y  }! p1 t" ?" n; l$ s

  o+ E' l4 t& ]% N+ O$ ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% ^: N( j/ }6 l  X6 A; n/*6 Y8 W+ _0 i" E) \' \7 I% \
* Check memory range for valid RAM. A simple memory test determines
- @1 ^6 l' }; F6 B; M* the actually available RAM size between addresses `base' and
# _; B1 d& j8 M0 ^  C" h/ N* `base + maxsize'.# Y% B; r! X" W! c) z
*/- D0 ~( L* \& |) e  d4 y( q
long get_ram_size(long *base, long maxsize); ~8 t( Q9 R5 R2 [% @& z5 o7 {
{
( ~) R9 w8 C5 P6 M4 U( h        volatile long *addr;
: `9 u5 u1 n* b1 a- l) D        long           save[32];4 D* r2 ~$ X$ J
        long           cnt;
3 e! L4 _0 h5 P. e        long           val;
5 |! R% x+ B: ]1 n% r0 _        long           size;
, D# A8 F3 m# ?* D6 ]! s% k        int            i = 0;
' H6 I4 ^+ J" z7 \/ ?# j, I4 S! c
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ [! r0 ?- ~1 A+ Z/ E9 h, u                addr = base + cnt;        /* pointer arith! */! Z# q; I" h& v! o2 a- U! n( z2 L
                sync ();
6 Y+ T8 W, T( ^7 p5 e                save[i++] = *addr;! n' c! Z2 ~1 q1 Y
                sync ();' I3 x( O$ n+ N% b
                *addr = ~cnt;
4 H6 q" V+ Z5 @% J2 c+ t        }
+ i6 L- v' R9 a! a  C
6 E! {# a5 n* o        addr = base;- p- t, |% `0 ]& W  M
        sync ();$ L/ i) k! x* c% }0 m; y
        save = *addr;
7 C% i0 n1 l3 G- M        sync ();
+ J  k8 ^) r) X. U# r6 w5 |/ o  }        *addr = 0;$ ^1 K3 `! ~8 K: C0 L: a
' O8 K9 R9 {  S
        sync ();
: K7 W- H+ H8 I) D$ I; E1 v  }8 \        if ((val = *addr) != 0) {" o$ l: h) m0 f
                /* Restore the original data before leaving the function.
! L) `8 }4 O$ v2 C0 j# k                 */) x# i) A, m! t" C8 [8 I6 \- U$ Q
                sync ();$ b- X0 y2 I$ M6 T) X
                *addr = save;
# m, V- B& R# _6 A6 j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 w( R+ q. S5 F$ k3 `8 l
                        addr  = base + cnt;
# w, h* O% O% s; N0 U1 |                        sync ();' a# C7 Y! P. C/ u1 h; b8 S% U
                        *addr = save[--i];: q* H1 K* P( S% z6 b) \; c
                }
/ b* q5 Z' t3 s* v' U4 p- d! G                return (0);
8 j. h: e5 F& i7 m4 y0 Y' [7 {        }: X  O+ X5 r. u
: ~/ v8 o1 j+ J# S5 t$ k7 g- D/ D3 }, i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( s9 ]! X3 Z% Y1 g/ p7 r
                addr = base + cnt;        /* pointer arith! */
3 D: `( T$ ?. p0 b1 x4 L  C                val = *addr;% K3 z3 t. S9 ^4 M+ M) u' m
                *addr = save[--i];
: k9 H! N9 q  [' D; _                if (val != ~cnt) {
# o, ]8 [( \# S: k+ t6 V3 Q                        size = cnt * sizeof (long);
% P; I, r" g; z% z" s                        /* Restore the original data before leaving the function.$ M7 B/ E. t* D5 Z
                         */# d4 R5 l7 P4 ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! i0 S, x4 x5 V& d, {5 N
                                addr  = base + cnt;
& S- H# `' A8 F0 e" O: C' T                                *addr = save[--i];6 s% e! n, Q# H" q; C: E* L
                        }  Q1 R8 h* i- L6 g$ j# k
                        return (size);" d* K/ }2 ?4 c& S( Y/ k2 M5 X, l; N
                }
" \5 M; h0 l4 P0 F& T7 ?        }
- ?/ A6 f0 d/ K0 \7 ?2 g! A
4 y" S( _& j1 I) y% ]* V4 o3 j        return (maxsize);& _0 G0 d' I9 V  z6 k
}
$ i% G" i* e1 C; {6 J' Qint dram_init(void)  Z  M9 e; Y+ R: t4 E
{2 J& w# b, s8 b. O, e% p
        /* dram_init must store complete ramsize in gd->ram_size */
5 y2 C& ^" L) N/ f" _        gd->ram_size = get_ram_size(& p5 C4 e- K$ y+ Y- S! J3 s/ Y
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 S# L4 q( N( m0 Z                        CONFIG_MAX_RAM_BANK_SIZE);2 G+ m6 d! ~  t& f
        return 0;
  d* ?; n4 H! K! r}0 B* k. v, o3 v4 o# |/ d2 l
/ z7 }4 K( K/ c: s; _8 T, n, X' s* {

; A$ S/ R1 U# M  r+ R6 N
9 g* O3 A3 ^0 ?' ?! ]- F  H% n$ h& p. b' M+ {) ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 b# ^! @" c, E0 y
. _% A5 D( U* K5 b) m2 R  v& H2 C( k8 f2 n& Y; A2 [

+ U/ |( K0 F2 B3 N: G




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