嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# r. t! m( ]2 I  i& P0 A核心板2:DDR2 256M Byte   NAND FLASH 8G bit& Q# i/ K, s: ?6 Q- |& i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 [4 m1 }6 T; C4 t/ _6 ~3 J

! i% u& V/ h# f4 T' P' y* J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. `0 ]6 c6 |4 A, O- K0 ?1 z4 }  C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* p1 Y' z1 B# B9 Q! Y/*- Q! h, T  |7 ?9 T" V- D
* Check memory range for valid RAM. A simple memory test determines
$ I0 O( g  E+ y* the actually available RAM size between addresses `base' and' N' e1 h4 t% L( ~* E; I
* `base + maxsize'.
: E: B' w: N# g% V8 f& o. A*/
7 X/ r- W: a, \# I9 Along get_ram_size(long *base, long maxsize)
0 l# k# }* U, b{; H$ d1 I- c) _7 Y8 m
        volatile long *addr;
1 V& w9 z1 L' ]( A' H, `. u5 S        long           save[32];+ K' l( f7 @+ |2 T# [( O
        long           cnt;; K7 P) e( [' r! V; G1 b3 e
        long           val;3 L& T3 S# m9 [( n
        long           size;# G8 p5 _8 [2 s3 G2 N8 ~
        int            i = 0;
- d8 P$ w; s$ @$ T; w; X; _
, J, M& }* L/ C4 O% r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; }+ N+ J( J/ R: ]" S# q                addr = base + cnt;        /* pointer arith! */
6 L* m1 ?, o: [5 H8 k. J7 f                sync ();
: O* t' j, }! d. b  |4 F                save[i++] = *addr;
$ w" g1 q# _. q                sync ();
* J3 x) i  Z7 J0 c/ P/ \                *addr = ~cnt;$ |; [$ ?; M' Z* L8 u
        }% p7 Q0 \! I# p2 u: Z3 @5 x

) Z: l3 h8 D& {        addr = base;. _$ ]; d4 H& ~
        sync ();
: ^/ @* v4 |9 V$ B+ L6 J. b        save = *addr;( r) [  E9 X1 g
        sync ();
  `  ]& a4 q  R& ^3 r4 l        *addr = 0;
& W! }+ Y6 i1 ]/ u7 h7 j  E" K; r6 O# o
        sync ();
, h3 k! @$ z/ V1 F        if ((val = *addr) != 0) {* I# c2 _% p1 K5 a" Q( \
                /* Restore the original data before leaving the function.
, I0 B6 x5 F: E& W9 M# Z* |                 */
9 ^. a9 v; Y+ ?- R                sync ();
) H7 T" M4 U: p7 t( |3 T% g$ G  d                *addr = save;
+ H4 F! u$ U' Y5 t                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% L8 ^' p: O4 M                        addr  = base + cnt;1 `; f3 i. z- }3 j$ ?$ P: |8 s0 f
                        sync ();( A( z$ k0 F7 k6 l
                        *addr = save[--i];
% y& p+ t4 t5 Z( p/ V; L                }2 f/ W( |* q# C& {' T
                return (0);
1 w  r3 H, E0 F7 }+ t  C        }
, [9 A' o, T+ l$ ]) H+ ?
5 \% P+ x+ a8 ~: ?0 Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( A6 B3 j  p0 R3 B                addr = base + cnt;        /* pointer arith! */5 H/ t  L9 e& z1 }7 {7 q
                val = *addr;
7 u9 W! B: i, [0 `  A( i                *addr = save[--i];
$ |. R- ~9 c  ]0 y; d& F  _6 j9 F                if (val != ~cnt) {
  u' I) x# U. f: u; O/ F                        size = cnt * sizeof (long);
( O7 a; X1 o& a/ m+ H* W" j/ Z+ e                        /* Restore the original data before leaving the function.
4 g% o+ l3 m8 @, {+ C+ o# F: w( ^                         */$ f3 P& I! q% W9 p! V$ d0 s: C
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ s9 I+ o/ w0 z2 B/ \& `8 \
                                addr  = base + cnt;' X, R4 s$ G7 R9 Y( {. Q" h2 k
                                *addr = save[--i];, q" {" _9 v$ }
                        }9 P! u: r2 x2 V+ f' u
                        return (size);7 `" O4 J" k5 w+ ^- Y
                }9 H2 o; H5 ]! H, x3 R+ b8 o
        }$ f3 d9 F& h& s( W7 |! J4 S$ A

0 E+ f* O) F# k        return (maxsize);1 n- @+ [+ q, m3 V9 T1 U
}
1 `$ ^- w) k5 W1 g5 Z: \int dram_init(void)
7 X3 Y: C6 k! _8 p$ Z. Y{
! U* d# Q4 e7 R, z: x7 K3 J        /* dram_init must store complete ramsize in gd->ram_size */
' O, ~; q0 W& C# o+ L        gd->ram_size = get_ram_size(+ W! l- ]3 i0 T1 L% O2 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,! T9 \' \1 f6 S6 J6 Y! e! S
                        CONFIG_MAX_RAM_BANK_SIZE);, n- t) u; f7 n; W# ?. T
        return 0;
* h1 f0 M$ u9 k8 v+ r1 C- {}
2 T) L- }+ H3 g: Z) K1 J- Q3 J- s0 N" s$ J+ u& ~7 q
0 V. `4 w+ v; |. ~

- b7 A/ F+ \1 }6 d, ?& d6 `' H: j4 i+ t: ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* s& j- _* m, C3 N4 l( ^; q/ O5 ^
  R" V+ r8 U( B' Z0 a

3 }- ?6 N9 _4 T7 k: q, z; o
* I: [  }9 M0 P) j





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