嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( j% O+ O  M1 d6 D核心板2:DDR2 256M Byte   NAND FLASH 8G bit( S* C. f' q5 [2 U1 S' N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 U: V9 {, c1 S0 A/ I8 S' e
/ B9 f+ s9 E9 v2 E% {' @/ V2 c' ]是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* q" O4 R) K! P9 V' j6 k' z  E5 ~& F
+ F" x7 \" E; E+ H, P* r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 b; t( I: C! T  j- O$ Q
/*8 r9 i  U- E6 i; t" y: w0 f9 O
* Check memory range for valid RAM. A simple memory test determines
  x( l: W! z4 a2 ^5 B2 R* the actually available RAM size between addresses `base' and
1 D2 i( ~- {1 Z; c$ v3 d* `base + maxsize'.
/ |6 t1 Z7 ~8 ^. _*/
) s! {" C' S6 b0 i3 {* x) V# Xlong get_ram_size(long *base, long maxsize)4 u# J! W6 K- y% `  s6 [
{
1 U! [6 s6 Y, [0 p) D        volatile long *addr;
' }/ O0 a8 K; G9 Z        long           save[32];
( o' i/ o0 j$ f6 ~6 i        long           cnt;* O; V6 G2 [1 ?# w
        long           val;
/ S+ j9 {5 x- i        long           size;
. G. F2 ]) l9 F" j  @& l+ }        int            i = 0;
  L4 ~4 W- r4 a" z3 D5 B# C* G' x# b- `$ Q& s" x( r
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  F1 g9 @9 o% R: @* X
                addr = base + cnt;        /* pointer arith! */
3 m& l& M, O! z6 g                sync ();. J/ t# K; \. S  v
                save[i++] = *addr;& K: n" S: ?+ O. L) A3 ~$ G2 v
                sync ();
, K6 [  v$ m. D2 r3 M$ V  m" Q1 q                *addr = ~cnt;7 a2 b% y" x5 g$ R! {# a
        }: |( ?" |5 y* s1 A& y3 Z0 v9 [4 X
$ i) z1 \8 \, L+ h# w0 u0 Q  ~
        addr = base;! N+ J6 v4 y# ~; q. C
        sync ();
/ d) R2 B8 G3 ]- n        save = *addr;
0 w9 y. x% C! m& `4 \        sync ();
  N$ b( ~' f8 ]" v* J8 F        *addr = 0;
+ _' T2 p7 ?( G
6 a! N! ?; F! \; [" a9 K( n6 [        sync ();8 F/ G, t, V+ d2 H! x# P) _
        if ((val = *addr) != 0) {) F* R# @3 |  s* w4 X/ x
                /* Restore the original data before leaving the function.' I. P% ~/ D/ a; S7 Y" e! L; G
                 */( X0 C) i/ Y0 t: i6 @% Q2 H
                sync ();5 H6 l/ B4 H0 q  p' [: K4 k
                *addr = save;
. _8 ^: H: h8 o2 ~                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& B, ?) T, C& I% s+ T( A5 @
                        addr  = base + cnt;
4 W! I" p% ~" U9 L) E/ t                        sync ();3 I/ y2 C) {1 X  k1 G5 ?! l
                        *addr = save[--i];$ j9 f5 j% x2 m2 y/ H5 s2 p6 A
                }: S- ]  \4 `3 M
                return (0);
' f9 f7 \* j- l& e/ g$ I0 _        }
4 {' z% t# P) C6 |1 G8 P# T( J, k( [( c
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 N& w$ I" d6 a3 h
                addr = base + cnt;        /* pointer arith! */
* z- `' E; N' ^                val = *addr;
- j4 A* K2 I4 N- }3 L  @                *addr = save[--i];# A6 V! S( S0 `# T
                if (val != ~cnt) {& z+ V: _& p# L* q& M* h: R) K
                        size = cnt * sizeof (long);( p6 R- E/ N, P* `. ?9 T
                        /* Restore the original data before leaving the function.
9 c" z& @5 D, Q' z) M- E. r; H                         */
6 F6 m* O: u; ]9 J+ `1 b% H8 s* p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 ^: p2 Q8 P+ f1 h                                addr  = base + cnt;, D, G' \- L- t$ e4 l! p0 m
                                *addr = save[--i];4 n% S4 {' a& P  W0 ]& g
                        }
: O7 e5 ?5 @4 \9 H) w# W) h0 i                        return (size);
& F1 @" c8 i! z* h1 e  Z) q                }% K; t0 S' y% c% a" m
        }+ a% U# W% K8 W  N
6 V" J" r; m) D& @6 }/ O
        return (maxsize);
( q; o  V2 `8 V' f: ^; A! P' u}
' P5 Q$ r, ~9 B  j$ e0 @int dram_init(void)2 R, v1 V$ p* K; @" m" ]
{  c2 _# R" F$ L! Y9 r: r" D3 {
        /* dram_init must store complete ramsize in gd->ram_size */
6 L! i2 p* s. x2 w+ W4 u        gd->ram_size = get_ram_size(' u3 W4 t$ n4 ?
                        (void *)CONFIG_SYS_SDRAM_BASE,9 |& X6 [3 g, H# @. C
                        CONFIG_MAX_RAM_BANK_SIZE);
& k$ p0 S! Y+ n$ u% p        return 0;
* |( n+ y9 D. F4 A: E& j}
3 A7 t- l! V6 H$ P) @, K: ]; O- W# x; V: F

5 P+ m% l3 `3 ?
5 m: a  y: \1 D. ~: F) P; c" o: w8 J. X. u8 v, l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 ~' g: a5 q7 M7 I% N: ?9 c  f& o: c$ x$ X

$ ^2 B5 U% d) N4 z

& ]6 c+ h) |% M4 q' ^, V& d" i




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