嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. {3 \  [' i/ E2 K) e! A) D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! M5 a- c/ C, E# Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  T8 E! _" w. ^0 G# u. ^$ N! B- Q

3 r: _4 X5 e% O/ j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' ~1 N3 h; K/ D. d* i

7 P" H+ V) V4 B% V8 R
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 \0 S' l4 w# T: I; H" s- u8 O
/*
/ I# W$ A( y- S+ {0 F5 F* Check memory range for valid RAM. A simple memory test determines7 P" Z- L8 r3 q6 z7 K- j
* the actually available RAM size between addresses `base' and5 R3 A0 x& D, I7 c8 F
* `base + maxsize'.) r; E( ^5 L  u' t3 |% p
*/
5 r- I0 r2 W% {+ ulong get_ram_size(long *base, long maxsize)8 J3 X6 N) j9 I3 M
{, K2 f# j* R0 n' d: S
        volatile long *addr;
. @2 [* _8 S4 }& O! o3 P        long           save[32];
+ E  p: ~+ R) V3 ]. C        long           cnt;$ h: l3 z' |4 X" Z) h6 \* n
        long           val;
" ]# K4 |" N6 ?: s4 F) i# w6 D        long           size;7 U  G4 A# H, c: q( s
        int            i = 0;& u4 h! G4 r& O: Z9 b  F
8 u6 {6 C, H9 ^: s& c& x
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- l  H: ^& P* u* T8 [                addr = base + cnt;        /* pointer arith! */
: [1 k$ I5 `& i                sync ();: p0 j; z& p" S; S2 z
                save[i++] = *addr;: ^$ [' w* ~/ F
                sync ();
" _0 I. k4 t" T$ T, f+ k0 m1 b                *addr = ~cnt;0 h% T' e+ u6 K1 x& Q
        }
( V3 @; o' z' f' Y) b; @6 S4 O! h0 |
! X' \4 m9 j4 P  k% J! q        addr = base;/ w, F. F# z+ W) e* s
        sync ();
6 E0 Z' X- p8 b        save = *addr;$ {( Y$ A6 u# ~4 b% f; O
        sync ();, K1 E0 l6 Z( \( k
        *addr = 0;
  D& T$ i6 }6 Q& v
/ A7 g8 L' R$ S9 t2 b( N' f7 c        sync ();6 ^& o1 \+ h" R2 @1 J4 c
        if ((val = *addr) != 0) {( t7 g0 ~( X- l" h2 v$ k. Z* K
                /* Restore the original data before leaving the function.) c$ L7 l& i7 `. z1 c3 G; W
                 */
2 Z5 u9 _) _# B% W+ O9 S  p                sync ();+ U: d1 _8 |; s4 p
                *addr = save;
$ T0 ~5 b/ B7 P4 h3 W6 e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: [- |9 p+ ~+ O- v  o5 [
                        addr  = base + cnt;7 {8 c, A9 _3 i/ [. M
                        sync ();
5 ?+ d6 |. ?4 v1 M1 o  L  Y. o" p% ?                        *addr = save[--i];3 Q/ S) K' D% Q( {9 a
                }
; w" s8 ^4 F2 W: c) q                return (0);
# U7 ^9 @3 t, M8 {        }
, S5 o# i- F+ R4 k, X# r& w0 A0 K5 n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ T( h+ b* v, H5 z: D. T
                addr = base + cnt;        /* pointer arith! */
& h- R, t  ]7 W4 }& {* ^                val = *addr;0 _6 q/ Z4 U+ ~3 [3 D
                *addr = save[--i];
5 w0 Z1 k9 |( `7 Z8 P                if (val != ~cnt) {) y& z0 j) Y1 `3 H
                        size = cnt * sizeof (long);2 I' \4 p* ]* X  `5 v7 d! Z
                        /* Restore the original data before leaving the function.
, k! k3 f3 [2 v6 p4 |/ G7 A                         */
, G' ]% `! q0 e* M9 }+ h' A                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. N. Z5 G8 E+ Q3 b  U                                addr  = base + cnt;) ~0 O9 Y' y. S3 o+ P! Q$ z# \
                                *addr = save[--i];  \, \6 p( a8 G! ~# N0 }
                        }
, Z6 z& b7 d! y                        return (size);. Y8 Y. B2 I' O4 n: F, B8 z
                }+ P5 }0 `  @( D+ }
        }
" e# u8 R2 |  Q9 H* V6 L: k
7 j% i% h- n5 u6 g) `, L; k        return (maxsize);$ C: Q2 N# s! w4 Q2 V0 \0 t
}
+ |" L- E8 E9 X# T' m' ^3 Oint dram_init(void)2 c% E( _4 w. z, @* Y/ C. u% c, O
{
8 ?! I9 M+ Q7 y. h/ [& O% c        /* dram_init must store complete ramsize in gd->ram_size */* Z) E9 U( |* b2 g- z  [
        gd->ram_size = get_ram_size(
- @- B" F+ F* s6 U, Z. O' v. C: C                        (void *)CONFIG_SYS_SDRAM_BASE,5 g$ h: q$ g6 a2 l4 D! H) B8 e! m
                        CONFIG_MAX_RAM_BANK_SIZE);- s/ S/ c$ d* d
        return 0;, p  G, G- J, e: W- N2 |: @
}" Z% m* @6 g; C) q" H
3 Z3 e8 d1 r! M
" V( F- p1 J; z3 }, Q; h" }- w5 K
/ z5 S/ [, F( N4 {; k- u6 o
4 d" U; f$ ]2 v( E; W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; d: f8 L$ B7 G5 p+ z1 ~' ]0 X  }' L- c: ~% S
; x' r9 C; q. j; w8 O% {; m: C

) X  Y( C: F& ^8 U3 ]0 ]3 r




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