嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 ~. s$ ~* j/ W9 F* N核心板2:DDR2 256M Byte   NAND FLASH 8G bit, _3 Y# Q1 g. e+ ?- U* R* @, N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 L  ^5 \# t( l
$ B% {% y& S: T+ [7 a8 M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( B) {& w7 o+ d3 t. k) e0 {7 t) a3 P9 e

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) i* k( W! i& O6 S3 {: ~' Q1 V4 w/*
7 D3 ?8 J+ [5 Q& b0 f4 c* Check memory range for valid RAM. A simple memory test determines
6 n3 K6 h( E( o* J# X* the actually available RAM size between addresses `base' and! o/ u) ]) |' G( x* D" Y. D# j
* `base + maxsize'.
( _/ i3 K/ E4 P; d4 r*/1 I2 s6 O' D/ x3 G
long get_ram_size(long *base, long maxsize)
& J% x' s" n8 e9 U" S6 f" \{
7 i! a' u$ k# Y" E, f! w! u        volatile long *addr;7 X4 ?1 Z) o7 r
        long           save[32];
& ?- e4 I8 j1 J* T5 L3 ?        long           cnt;
1 h6 j/ d* r0 m0 A, M        long           val;/ \3 o- U- ?1 C, Q
        long           size;5 V/ x' ]3 u, t# Y  D! u
        int            i = 0;
% w  ^* |% x' R1 g  ]# w3 _& q2 S+ K  _) c* W$ l. }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  n# k6 Q4 L" h" s/ z9 G                addr = base + cnt;        /* pointer arith! */  Z, f0 Z9 T. ?4 x  P9 ?1 i
                sync ();
: P: r# f3 Q, P9 o% F                save[i++] = *addr;
1 Z! B! c) D' K1 T: v5 ~                sync ();
$ c3 ^5 }! ]5 f                *addr = ~cnt;
6 g/ H4 p) y# d3 z* f6 O5 L2 g! c        }
0 a# {" F) r; h) e* f/ I5 p
/ M! U  S  e3 }  I7 N4 S# K        addr = base;
0 S5 t9 _# {" H* t3 K; ~! ~        sync ();0 v" F0 |7 T, y% S! ~3 p2 y
        save = *addr;% u; i' e( A/ X8 i" Q1 n
        sync ();# B4 y) H. j1 D! ]. L: ]
        *addr = 0;
$ w! d. I& _* `0 V( f/ G- ?$ w+ ^" i! A, f
        sync ();
3 f- k4 i* X& z        if ((val = *addr) != 0) {
# Y3 k% o) ^; ?  s                /* Restore the original data before leaving the function.$ F) T: p; q- e# i4 U) }
                 */
! E0 l6 X. [9 [$ e                sync ();9 J. N% L! Z( |& `( F, K1 X0 _5 u
                *addr = save;
; Q0 e2 W* ]% r. H% b& o                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% |( j: h5 }6 X$ l
                        addr  = base + cnt;/ W9 w$ s- R8 Y5 F: G$ v
                        sync ();
) k$ l/ b/ n, L# q" ~: \                        *addr = save[--i];
; n% g) f  n# h3 R" D' W                }
: h" A, T# O) M6 x0 x" y                return (0);
8 M  i' z. O, D  u        }
2 `0 e$ N4 h2 c. x# F) O
) {8 L: ?! b% j) ^& V: e* K        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# B8 w4 ~8 o7 Y' P$ ?2 Y
                addr = base + cnt;        /* pointer arith! */0 v0 A" w" @5 W* \# K  k8 I
                val = *addr;
5 Z7 `  G) u0 \7 l! S1 j                *addr = save[--i];
9 ?% I5 Y+ Q6 n2 i6 h: X; F8 g                if (val != ~cnt) {
  p5 ^! E; z3 k4 \- _8 w                        size = cnt * sizeof (long);
0 W2 w0 x$ ~! h$ @2 w0 \, z                        /* Restore the original data before leaving the function.
' t% n/ A1 D$ ^* c( ^" S. j                         */' m3 X9 C  Z8 {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ A4 n6 y: D  U1 G7 [  m: E
                                addr  = base + cnt;& N  v- d9 B# l' `' d% `8 [0 B
                                *addr = save[--i];
& t1 h3 P+ `2 c, h2 G9 A& e9 m                        }
# a/ r; E; D# H$ G$ H6 Z                        return (size);0 T( E* k& b) z- W. H# E) b
                }
* V0 u3 U7 B5 W- _6 ?1 F* B7 k" z        }
2 K3 \* Z) P+ w0 |/ Q) e; S8 s' f- g- n; Z9 B4 c
        return (maxsize);
' }! _: N" h) Q5 `% S# j}
/ ?) o& h8 k( ~. s! o+ Xint dram_init(void)
8 ]8 m( Q5 |" w7 r: A: G1 c+ z, V{
* G, [) A. L( q( ~9 d( o0 E. a        /* dram_init must store complete ramsize in gd->ram_size */* _& a& b5 b( z
        gd->ram_size = get_ram_size(
' Z: r- Q) D% |: a4 a" t                        (void *)CONFIG_SYS_SDRAM_BASE,/ Y/ e5 w0 Q* a! P1 y' W; ?
                        CONFIG_MAX_RAM_BANK_SIZE);* a( Z) C9 A4 m9 a- P6 s
        return 0;
* e7 {: d3 O5 F, L! [+ |% U  ?* X5 ?1 P) d}- w; ^  Q( m% ?0 |6 J
( w) |3 Y: o+ `2 b' }. }5 z9 C
3 A4 r0 V9 F' k+ i0 F$ r' Y8 K

$ i+ V( K, g% g. v
! w( ?0 b; e3 Y5 L1 l' d, mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 e0 ]2 f) B; I& n+ b/ [0 E) C
7 ~$ a* X. ~6 Z9 E( A
3 V+ z+ R1 m' b# F0 i1 B
! d3 g# b8 Y6 o9 ~





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