嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* O* ~5 @: |- ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 _! m3 p9 I; _3 S* x! _这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 p/ P" j3 z; p0 _1 [

) z# Y/ R" Y- V6 [是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: m) E: u  C) c" Q1 m( Y2 q& |/ S) f+ ?/ s* J9 H& J* `1 T# y

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' b) c& P) S, R, Z, ^, S
/** L" r- U& V; e! p, W8 |
* Check memory range for valid RAM. A simple memory test determines  B( t( c4 U0 Q  y& s" b
* the actually available RAM size between addresses `base' and
4 ]" z! e8 x3 `0 @: |/ a* `base + maxsize'.. l3 _% \( l- @1 J4 n! R
*/4 \. Q# |! u8 s9 A1 ^
long get_ram_size(long *base, long maxsize)
% f  N9 Q' d* O" O9 J  H{
  _( X( b4 m( ^+ t, @        volatile long *addr;
/ Z7 D4 k, t) M        long           save[32];. X! R1 k- H. d4 B
        long           cnt;
3 ?0 T" h3 R: N: Q& e9 L        long           val;2 J8 c. |; n1 c1 J
        long           size;
, g( H& d8 _7 P; w8 {        int            i = 0;5 ^, y, V& P1 W
4 F4 H2 C: d9 O! y- U. K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 Q+ r# @7 g4 c
                addr = base + cnt;        /* pointer arith! */
! Q* w% ^# @" q' d0 ?, ?" O                sync ();$ P% L( Y4 G: u- [7 u( J( W" @4 K
                save[i++] = *addr;" s5 E, ~+ G$ D( {$ }! H8 Y
                sync ();9 b) J0 H" H8 z2 x. ]% F" K# u
                *addr = ~cnt;7 u( y* p  ]) h8 U) F8 f" z& y
        }
, }1 P1 X/ ^/ V, x+ x, o6 c. U, E: S) b' G  ]
        addr = base;9 p4 Y% B! k  r, j) B: n& E
        sync ();
# m$ [5 J# |6 Z+ [5 W% Q        save = *addr;
% K0 Q# \0 O: {2 B0 ?/ ?        sync ();
. I" i: ~5 n7 t8 G2 j        *addr = 0;
, Z3 @- G, J  O7 q6 U5 r9 [$ V% E# a! [! `4 A0 {' v" q9 V
        sync ();
- |# S! U0 R. T+ |  @' f% r        if ((val = *addr) != 0) {
* ~! q5 X; z) ~( b& e5 s" Y                /* Restore the original data before leaving the function.1 L3 }- q1 _2 ^- G
                 */
( m6 r9 _2 J* [) |                sync ();
3 k3 u- L! `2 J/ e$ P4 \                *addr = save;
1 D0 j- u4 o7 [4 d  j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ }. |. u2 A; P0 Z( ]% i+ B                        addr  = base + cnt;
# ?9 K9 K! ~6 g9 w* y6 R/ b. J4 o                        sync ();
$ c3 Q* C; E) m: k                        *addr = save[--i];
5 i  g" W- T) I* N                }
* r4 {, f" [% b                return (0);
  v2 S0 W2 D% S2 w        }
7 n! Y0 i1 {8 t  i: ^' l
; C0 f( N8 K3 m        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' S  I2 j2 q9 m- q4 H) n" v                addr = base + cnt;        /* pointer arith! */
& W) t2 P/ c( t4 g- y: I' _0 u) }8 ]                val = *addr;
7 e% B( D) \( k9 y/ i                *addr = save[--i];. h+ Y% W( C8 v6 Q$ S
                if (val != ~cnt) {
# N' X& `/ ^8 E, H  f                        size = cnt * sizeof (long);1 c  k+ F  T, p! A/ ^3 S
                        /* Restore the original data before leaving the function.
# l" b( q# s4 Z4 p) p# w0 Y' V                         */; I$ H2 }; N7 p' m7 j& `" \" S- {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) O  Z$ D7 W5 ^7 r5 V                                addr  = base + cnt;
5 o$ |7 C& R' ~! g( s/ X" T+ ?                                *addr = save[--i];
4 f/ t& T7 T9 W: |, W/ I+ ]( ]/ Z* z                        }$ Q* n  q: H, f4 M: A! @" f: V
                        return (size);
' S  E' c# z- _                }# B9 q$ H% _/ B5 }0 s4 X
        }
! _, }1 M0 Q% \* M8 \9 j2 h
# q/ z6 c  L( Y1 \6 k; w0 o        return (maxsize);
3 e& \0 e6 g  B8 u- _& x, x' n: @}
6 Z2 T4 N- C. a% _5 W+ jint dram_init(void)
' Y0 u% R0 Z+ w/ ^+ u{
% c2 R' T+ d& T( `$ A        /* dram_init must store complete ramsize in gd->ram_size */
' F* G( h0 ^5 P' ^/ S        gd->ram_size = get_ram_size(' z, f& n* z% O: m6 i, z7 @
                        (void *)CONFIG_SYS_SDRAM_BASE,
/ o. {3 ^+ f4 P3 t1 h$ e0 ~! z3 |% R                        CONFIG_MAX_RAM_BANK_SIZE);- |6 D+ c' N1 ?: O9 @/ W) N
        return 0;
* k( h/ U9 j. W9 _! f4 U- s, |}0 [1 P; H- b2 h3 R9 i' Z/ r7 C' M8 B
# i' ?) A$ p6 R+ b; K5 e

1 n+ |* u2 B7 Y( M/ T( a- S
$ E! O% I' v. m
( _. ?& d8 T- c7 Y) KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 B8 v, W  F7 A( b  Q

/ w8 y* j' z9 K# C: g( w) {; j
$ N1 C7 W$ _0 Z& z1 ?+ [# ?
' j5 T1 n' Q5 w/ R/ J5 N$ n





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