嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  p& d$ Q& h9 ^7 Q8 Y- P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! o& H. F! u, o# p7 _5 V这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- I0 ]1 ~5 s3 e) o8 N5 y  Q1 K

$ ]; w8 a# _) w: S  K( r  g是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* Y# w; |! n" s3 B& A, z7 J. J$ C1 {, v0 ^* v

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& u2 D/ U" C# X* K+ i/*" I* Y1 S0 ^+ s0 f& `
* Check memory range for valid RAM. A simple memory test determines1 U" M1 ~# K/ N* |& e
* the actually available RAM size between addresses `base' and
" ^+ j: j7 p& q- c+ b* `base + maxsize'.
$ @6 m5 w* b! s: R! m/ E*/1 y/ B7 {8 q  n* N2 R' q( w, J! t  }
long get_ram_size(long *base, long maxsize)* ], H: K; `9 O9 [1 a$ O
{
9 |1 W$ D0 u' K3 L        volatile long *addr;3 o  p/ E. s- C; j( M! O: ?6 q
        long           save[32];
7 x* O" K2 {6 A* m0 |) T3 _        long           cnt;/ E6 V' q5 P+ \$ i4 N+ A. k
        long           val;
0 N- v' }" R8 ~9 P0 |+ r        long           size;
5 |4 }$ `! T/ x6 U' ^* C  |+ }        int            i = 0;
& v+ ~- o* K+ k; y) v0 S3 G4 \& X, K* o5 ~. A4 Z  j& ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ Q' o4 e" W4 d$ W
                addr = base + cnt;        /* pointer arith! */
- ~1 c; ^6 D1 I9 O                sync ();; j# t/ L; L0 F0 L4 C
                save[i++] = *addr;  v8 s0 X( U. |8 F3 {  w
                sync ();
* E* W  g  [1 L7 f* k1 w2 p                *addr = ~cnt;3 u4 t. c" w" L, x( k
        }
% |" P8 m5 _( ~9 Q4 Y/ l
8 J4 q6 C$ [. p7 c3 ?" T        addr = base;
  o  V0 I% g* R0 O+ H/ B% h4 y6 f        sync ();
: _1 U, u; \, S' H( Z) b% ]$ Z        save = *addr;
2 x$ n6 r7 ~* e/ _# j        sync ();
- s6 o; X9 o9 g7 ^' ]1 E$ C7 K        *addr = 0;5 q7 z+ k4 u% A' s3 v

; z8 y( e! |+ }% t; t" N# H        sync ();; M  C+ ]( l( n1 D/ H
        if ((val = *addr) != 0) {) B: o4 s: d" V) u  v
                /* Restore the original data before leaving the function.% L& \) ]- G/ O- m4 g& [; E
                 */
& `$ w/ y' T7 Z% N0 o                sync ();- @! C/ ?4 Q7 k% x
                *addr = save;) N0 X1 Y" g/ q6 S8 ?- {; B' l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; I9 L' U6 P  q( C; @$ m
                        addr  = base + cnt;  a# K% Q3 _; Q( U
                        sync ();
3 N$ I3 Q/ h/ g' r9 v( I                        *addr = save[--i];
, U6 D5 P; Z' K7 n* A5 G                }
# ^' B- \9 I2 U, G                return (0);8 g6 C- I2 U* t- Q3 P
        }! Y$ b, `- i, B* X) K
) u3 T/ @  z& S( g: }+ B6 ?4 D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 M7 ~7 ~/ \# V* m
                addr = base + cnt;        /* pointer arith! */0 p& e- r0 M) I7 r, X
                val = *addr;0 Y) I) C- e% z1 G2 E
                *addr = save[--i];' C6 D5 f: d, v+ [9 I  {5 w5 j9 C
                if (val != ~cnt) {
! w- _& h" k7 u( h2 F# o                        size = cnt * sizeof (long);* E, D. B  \1 s4 n
                        /* Restore the original data before leaving the function.
( {% \) m+ X0 [' ^  L4 @                         */
# {) ]$ @  h4 l7 h. O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" V$ u' x0 I, w
                                addr  = base + cnt;- K$ M1 n- C# L% U  t; s/ B" p
                                *addr = save[--i];. W: x' k8 c- F7 C* L
                        }8 b+ x9 Y- V7 a+ j( ~8 E3 Z6 `
                        return (size);' q4 s" r  [# w# E
                }/ Z7 o9 O7 c: Q" T" Z
        }
1 v% P: g2 x# ~' z* I- i; {  y7 C, ]% G6 ~! `# \5 V1 b# D
        return (maxsize);
7 d3 u4 V3 C; Z: R% f}
) k  F$ X) g$ j- y5 J/ B3 k. sint dram_init(void)( q( v- ]$ e6 h4 S5 n
{
/ V. X' j& C- K/ c* _/ S4 B3 W        /* dram_init must store complete ramsize in gd->ram_size */
: b. P5 P0 R) e9 r        gd->ram_size = get_ram_size(
: `8 S  ]& D  b7 w0 X                        (void *)CONFIG_SYS_SDRAM_BASE,
& T" A  w4 V& Y! V1 @( `' c                        CONFIG_MAX_RAM_BANK_SIZE);# M& \7 F* K# t- j
        return 0;
  F5 m8 L& {( ?' ^0 h}
! a$ h6 t2 h2 |5 R4 p
$ w5 M, a* r5 C5 o4 [- W
0 x  z+ d( j+ _
+ u/ I! P1 J& I5 f* ]2 H. P) q+ r% u7 o( C8 e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 V5 C  Y% U1 P
/ ^4 y( m( x' X4 A0 u4 T

: l+ T! k  W- d4 S4 T
2 d& |! Z8 g8 n# v# X/ v  Z





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