嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; n5 j+ @( D% Z( }& v9 c核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 |2 R. V2 S/ }. h; U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) Z, h! t: u+ M: R4 A( A6 Z1 a0 e7 _8 o+ }& U3 W+ J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 v; H2 A6 _0 [0 b2 }
+ Q. Q# M+ [8 k7 `

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 {# l& L* q: M  i5 j0 Y0 u) Y
/*+ {$ b* o, |0 }: K& p% Z9 L7 J
* Check memory range for valid RAM. A simple memory test determines
% F9 x) q6 W2 W4 x* the actually available RAM size between addresses `base' and
- K" G) ]: P, S  ~5 q* `base + maxsize'.
4 J9 z8 v$ W4 R. M7 G  t( o8 H+ @*/
) b$ o/ _( m( V7 g. ~long get_ram_size(long *base, long maxsize)
* c; E, x, w) b+ g7 i. N{
7 l7 g+ M% }$ \% U) [6 K( F        volatile long *addr;
. J$ H) ]; E- _1 _) D# k& D) p        long           save[32];8 E3 D' t* T5 w, a9 c( W; R
        long           cnt;
% a6 Y: D% p0 N/ e& Q        long           val;
/ q! S8 x& r& f$ ~3 e1 `2 I        long           size;
: v$ F1 n# u+ [# B# ~! R3 g        int            i = 0;+ [2 \- v8 o4 v4 z' q# D
% B# p2 l6 K* a! r- N/ P
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% ^2 D! x! E5 ]- X
                addr = base + cnt;        /* pointer arith! */0 Z  Z# X* }  b, q
                sync ();4 N: f" o# m9 G5 j. Z3 `
                save[i++] = *addr;' R: ^/ L, `3 Y) j0 C, C. C
                sync ();( G; H5 y8 A7 x+ J% g  o
                *addr = ~cnt;9 r* @6 J: t2 t% e7 X
        }+ f. h+ T0 Q) |- s  c
' r$ I' [1 c9 t& M8 z
        addr = base;* q4 L2 l1 j! o+ k2 g! B1 l
        sync ();
* M1 K' d1 T" C  a2 ]9 ^, w% e6 X        save = *addr;
: P+ u0 o5 W0 O0 J        sync ();
) j2 t! H  z& W2 c) R" @. B$ b! W        *addr = 0;
2 ~6 z  M+ n+ \. G# i$ B3 \
! g" @* `  y8 Z/ W6 A3 |        sync ();2 y* ]0 Q- m7 E3 _5 m/ L
        if ((val = *addr) != 0) {/ b# k* G" n1 ?
                /* Restore the original data before leaving the function.7 e. P4 N. J5 X( s- k+ C$ [
                 */
8 k3 Z2 O0 I9 a( H( S                sync ();0 c+ n; o: f9 X3 ]8 Q( R& l/ O% J
                *addr = save;
6 K0 O* V% g* D, e# r3 ~% ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 O( y, F5 }1 `  |& Q. ^" V; x
                        addr  = base + cnt;
! P2 H: p6 `* L4 w8 ?* f' x                        sync ();9 w7 F# L3 r$ n. p& @$ \3 `' G
                        *addr = save[--i];
  D9 q* q+ L+ v& B& B                }
6 Y0 x  r; ^& P# f8 V( w/ C                return (0);9 p( m4 v6 l) `, U) p9 V
        }: e- h) W. ]  r+ H7 t
  g9 }) Q7 ~- B% b) f2 E7 z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" j0 x8 [7 w, }( Y7 B7 J                addr = base + cnt;        /* pointer arith! */3 L6 W9 j/ v% i6 @' m3 _; m; u
                val = *addr;& ^5 p% p" M( n( f4 T! H
                *addr = save[--i];. p" T& W1 Q+ y" w5 N' u7 Q0 p& k
                if (val != ~cnt) {2 [( b% S$ y- T. z% E
                        size = cnt * sizeof (long);0 i* Z  @& U3 I0 Z/ [8 t( Q
                        /* Restore the original data before leaving the function.5 E6 J6 i. [! M- ~  f& `# e! T- @
                         */0 |/ _/ Y0 Z! g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ L8 ^8 [: O& R! C( m$ [, d                                addr  = base + cnt;
6 ^' D0 A6 D% |2 [, p8 r                                *addr = save[--i];8 I( A/ i) I) f* h2 }( T
                        }) {' K6 s6 ^) ?8 D8 L: u
                        return (size);
& n. v# v* u3 G3 P                }
4 h1 l1 ]4 ?2 W" t! z( g! J        }! ]. W% b9 `, K  o4 U4 G: e

, E* `8 e$ e1 X2 t# U5 q$ |" S        return (maxsize);6 N7 o& Q+ T7 \& d: Q9 ~$ f
}4 h( {# q$ G1 j8 N. C% ?
int dram_init(void)
/ F' o5 @/ n4 R6 }4 `6 C{" u8 Z( p) D7 N% j  ?& L
        /* dram_init must store complete ramsize in gd->ram_size */. K3 e$ n( u! d8 H5 T
        gd->ram_size = get_ram_size(
% F, @; h) [; H: l                        (void *)CONFIG_SYS_SDRAM_BASE,
! ]% A+ e& w" g/ @# a( V8 U                        CONFIG_MAX_RAM_BANK_SIZE);/ h$ c( n3 p# K: z% I3 w# s
        return 0;- V- I  }2 ^5 G6 L; P  N
}/ {! L6 C# K" C2 {8 }0 g

6 j/ h+ v1 w+ O- V! e- m0 [; V6 E3 ]
* D* E( n$ l  G% X; m2 w* ~
3 N. z8 }% X$ S6 V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" O/ v" I( O$ x) \  }6 l* L; ]
" p0 E- B7 K  m/ B: @/ X5 |

1 x$ Q0 {9 o9 i" Q

5 m6 x5 s9 o# i, v




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