嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- A. s8 i  c! D0 ?) k5 R( U. e, N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 Z& z+ J/ @9 r7 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% Q8 l5 T$ u& c, ^
( |; e" Y0 y/ D+ F! I是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ J7 }* x1 e5 h2 j% w

: E% P7 |& S2 w" Z5 h0 W" r
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- [; v0 L& X' K7 Q* q& t4 H
/*5 x7 H1 u: g9 t# _& ~: \$ C
* Check memory range for valid RAM. A simple memory test determines7 {5 I) a9 ?. B' _: y
* the actually available RAM size between addresses `base' and; m: D( U- k% {/ L3 m+ @1 ?
* `base + maxsize'.* H( i/ Q5 Y& z6 r4 D0 r
*/. m6 Z; v9 C6 T8 {5 V) ^- B  t
long get_ram_size(long *base, long maxsize): Z7 }( Q7 S) S6 [' Q6 F( o. V. U
{
; U+ ]. e$ s1 r0 i2 E! U1 f        volatile long *addr;; Q* p1 g% T7 z( S( o$ M
        long           save[32];
! ~0 a0 K# {4 k  N6 `* o        long           cnt;
' c9 ?$ m, }6 u  @! p$ V        long           val;
3 M- Q* t; E' S" ]        long           size;6 g8 b% i: q1 Z- F
        int            i = 0;$ @, L" B9 L4 A5 \7 q9 U

3 I6 U- S. U( w% u% l. r! K        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, l8 H! l% G! d6 Q# o1 i                addr = base + cnt;        /* pointer arith! */; g  `" x: b# U
                sync ();
% s: L3 W. A8 ~                save[i++] = *addr;/ C* v7 P9 d* b2 I$ E" `1 l/ Q
                sync ();4 {; l8 S) l0 v! S/ u
                *addr = ~cnt;
! f& O5 |  x/ W& X) w% M7 i; F        }
) a, M& J) s0 ]
. A7 g# u4 B: e0 M- D" I* c! ?6 B; w1 m        addr = base;2 P# P2 c' G1 @' R) h) ]* X6 P
        sync ();
/ I3 y2 W1 I2 ~# g" k" o4 g        save = *addr;1 Z% d/ F" C5 k1 B3 Z% `
        sync ();
+ u. I0 K5 K+ M: g        *addr = 0;) C9 Y. Z- y" C$ E/ e6 ]' }
% @. |0 g* A4 q
        sync ();
! Z( p/ F5 q! Z; ~. g8 z1 g, `        if ((val = *addr) != 0) {+ J$ }+ U% K: r0 p4 E! n2 }" n
                /* Restore the original data before leaving the function.3 W) K0 V' Z+ y  A8 M7 q4 c+ _
                 */
" \' _% V. E: ~/ ~7 u: m( S) X                sync ();
  I3 s3 u  |: K) ^6 P                *addr = save;: T& L( l, G' l' Z7 D- h/ q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) T  @4 L: n4 ]" C- i% n# Z& y                        addr  = base + cnt;, g- v' f# g) F/ q9 ~8 i
                        sync ();
0 y0 d% [6 c9 ?' Q5 ~# ~: C/ v                        *addr = save[--i];
- r9 H2 i$ ^. a0 g5 D                }
6 C7 Z/ p) B/ B3 v1 g; b7 K* G                return (0);
9 B$ h" B4 {( \. c+ F        }1 ^1 x/ U+ k* f( J
4 R, R% q( v4 R3 U; l
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- b: i4 D% F$ c* K
                addr = base + cnt;        /* pointer arith! */
5 H5 k& f7 q) [- g2 E2 T/ L                val = *addr;
& W& n$ T; X5 n! Z                *addr = save[--i];: o/ w) ^1 n( D+ X! p
                if (val != ~cnt) {
4 r5 _" X' }# a# X                        size = cnt * sizeof (long);
% ~' T( V% n( m$ u$ t8 t                        /* Restore the original data before leaving the function.
/ P8 N3 Z. s9 d0 R$ I3 s4 W( @8 Q                         */* f) e( X4 F8 u4 B; J7 ]) U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 ~" n+ P  q" v
                                addr  = base + cnt;
8 j- s; o6 W! W0 Q8 P' b                                *addr = save[--i];9 x+ F# u% m% P9 H& t4 U
                        }
4 a3 K& _- s0 c+ Q                        return (size);
" p& ~# G- F0 G" e0 w0 k                }" m9 q, Z* T, x* y- h- x
        }
: r: N# f4 p$ L8 y( n7 `  k
! c& m$ _, d: i: X( H% a  z        return (maxsize);
5 n; W* d* j/ D* t! S# |}
3 v# l5 Q; N8 r- W- x6 Yint dram_init(void)& D' ?( L3 Y# `! M
{4 e, c& ~( g5 m# ^) h$ f$ \
        /* dram_init must store complete ramsize in gd->ram_size */" q6 B: ]. G  H2 [$ h
        gd->ram_size = get_ram_size(
) Z: P" t0 c3 r+ w5 p; E                        (void *)CONFIG_SYS_SDRAM_BASE,5 Y# F+ F( n' b* T1 |1 h3 {% j
                        CONFIG_MAX_RAM_BANK_SIZE);2 |5 _  O, K0 M/ U  ~" {
        return 0;" j6 {- o, L9 t: P+ P8 V+ ~
}& Y' |% V1 D4 S% o. [

/ z. f0 X3 F' _- k3 N* U, c1 }% X9 W8 x8 N

6 ~* z1 M- A( g/ o8 j. {0 j7 u( J4 L6 c  T% e7 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# ?3 ^( i4 k, l) h5 {8 f

+ \- [# M5 H" I
5 M  {3 v& e2 p

6 Y" D) ]# H. d/ H/ _3 J




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