嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: `  f5 q/ E8 S7 K/ Z9 ]. v6 j核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 e' F8 C5 @- q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& Q+ o6 k) O6 i* R
$ {4 ]5 [$ M3 F  {3 i, i3 ^0 Y% }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' ~" v+ D; H* y/ F( \
/ c; M% P! |0 v$ C/ }
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 v/ o: O$ S3 h- Z7 R
/*3 ^% Z$ j- J; g
* Check memory range for valid RAM. A simple memory test determines
/ ~2 ]1 o( f- k& C/ s% e* the actually available RAM size between addresses `base' and
  |! n3 N* t" d- C! `* `base + maxsize'.
) e& o' W3 _/ s*/
( L8 J2 _6 |( g; e3 J( jlong get_ram_size(long *base, long maxsize)
4 z# R  E7 b% S4 y  {/ T0 B{' J% @% d/ n7 @3 W, Z
        volatile long *addr;
" z2 R2 K* X/ Y: [% z' _% N+ D        long           save[32];, Z$ R7 k% i6 L1 k  m: |
        long           cnt;
6 r( j# a7 {" s" E& O* d+ N, g        long           val;- X; a% ^! @& w4 B
        long           size;8 ?! f$ Q. K2 q1 p- d# h
        int            i = 0;6 K9 l; d8 X/ B1 P

+ y* J3 |: f1 g, K& s/ j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: b$ [! ~! m/ a1 n7 h& |6 H0 E                addr = base + cnt;        /* pointer arith! */) {" `3 \3 ]1 O% B6 k
                sync ();
* o, V, Y  d: P: r" [) z* z- r                save[i++] = *addr;( w( o: A, x7 g8 m; j
                sync ();
; X6 a% \3 M+ O* I0 G( b5 D                *addr = ~cnt;
0 y8 ]5 c2 n2 m        }
1 s8 c" i$ |0 b/ O
1 j3 S3 z$ ^+ g% k& `- _        addr = base;
( w: \" |- w3 p' G        sync ();6 e1 e4 J2 p: P) Y6 q8 q
        save = *addr;
3 h3 @. W1 j4 {1 @# E- m        sync ();2 ?* O' Q* F6 ^/ p
        *addr = 0;
; e# F$ u" a2 A8 I) t$ P7 O; d. `4 t+ Y- D/ f
        sync ();9 S; T. r( L$ U- I4 S7 a8 x
        if ((val = *addr) != 0) {6 L5 {; s) a# H
                /* Restore the original data before leaving the function.+ L* M# `# Z  B$ D6 f; x3 H
                 */9 B1 D( e  _9 f6 b. N
                sync ();7 o4 j/ M! [: G, l9 E
                *addr = save;
  l& `/ i9 i, J$ Q) L/ I2 T3 D                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: m  H( Q5 o" B# J9 ]
                        addr  = base + cnt;
6 r- T; M% k+ X                        sync ();2 |8 k; H$ J* {$ h( E
                        *addr = save[--i];
- w7 c3 B* A! L* ~+ a                }
( b7 {5 o' P0 ]5 P7 ?4 _                return (0);
; f- n$ ]& Z# I7 K        }7 @4 S6 q4 H+ m0 W( v* E5 j4 S
9 _2 j: \7 f$ @! h. M- N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ E+ X1 _- X+ s; d                addr = base + cnt;        /* pointer arith! */( B) r! q( q( s6 T0 I* y
                val = *addr;
9 y3 @; f9 B) e                *addr = save[--i];
% {; p& G9 X. B2 L4 M& N                if (val != ~cnt) {, K; i# c5 z2 R* W
                        size = cnt * sizeof (long);7 k8 R) j0 @$ X7 N/ s% a" X/ h; W$ c
                        /* Restore the original data before leaving the function., X, k4 a% ?" Q2 e& K- l) \) ^
                         */
0 E5 a: q6 Y; n9 p' {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 o4 h$ i7 w% u% ]8 {                                addr  = base + cnt;& R( H/ T; n2 j$ c  ^/ K2 U7 I8 t
                                *addr = save[--i];; f7 Z! {  s# l2 Z5 T
                        }
7 m. a6 G, P' P+ ]                        return (size);
! {7 C2 y1 K1 L' L                }
; u4 H# }7 {2 z. S, X) P        }& ~' ]0 w; {, W+ L- x
0 b1 O. @2 b& e
        return (maxsize);( |% N  V( p  D# ?. f' N
}9 e3 ]  U. p  x' H
int dram_init(void)
% D$ V! P$ l* }6 P" p6 ?+ p  B) B{
7 ~$ X0 m: x. C1 g$ _0 K        /* dram_init must store complete ramsize in gd->ram_size */9 Y+ a7 A8 s9 ~. Q- ?( S- r) O
        gd->ram_size = get_ram_size(
* [4 Z. `$ ?6 G/ Q  T9 k7 g9 W                        (void *)CONFIG_SYS_SDRAM_BASE,
% P6 U! n, F3 g2 @) Z: ?                        CONFIG_MAX_RAM_BANK_SIZE);1 L9 Y! Z+ Z: {7 b" |3 ]
        return 0;
6 K+ j* |' G% |  `7 A}
- K* `" ]& h% V' B8 o$ ~; H
1 i3 x4 u* K: h2 n) ]( b
: a0 P- O6 H) `* [  U
  A$ D- f: y5 ?. `" {& Y( a; Q+ ]7 O, I7 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 L  t( A3 [! C! y% _* x+ c; y( g( b

! K. N0 T/ p- z# O7 c9 N- w4 x
" Q5 y6 O6 R9 v; M% {





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