嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 ~# e; H' z5 P; }核心板2:DDR2 256M Byte   NAND FLASH 8G bit, o9 i" k, Y; R' z3 j4 H# q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 T1 N( h6 N/ ]
5 |$ l3 G# ]0 q4 N! i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: n" y# T  _: {9 e" w2 {3 t4 x, }
- X" @3 ?0 l! H% J

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: U7 L- t; |0 O; ^1 q8 l7 u8 N0 {/*
7 u- [9 }* F& s7 R0 ?* Check memory range for valid RAM. A simple memory test determines" Q% ]4 ]5 X8 o- x
* the actually available RAM size between addresses `base' and
& ?6 K3 ^  F. I- B* `base + maxsize'.
% L. V' Q& q/ @, Z: A- l% M/ U6 B*/( T7 N2 ^& |. F6 |+ ^  N
long get_ram_size(long *base, long maxsize)
* s3 n2 e. V) g: J% W; H( G7 M{
% w9 i: w1 ?3 C" E1 d        volatile long *addr;6 K; o4 s& @0 J% o: d9 F/ z1 o
        long           save[32];3 S5 U3 O7 E# r% }
        long           cnt;
/ N) v5 h9 V1 K1 O0 w5 j/ o8 L        long           val;
+ v2 s$ K+ k  W! A9 }        long           size;
( j5 B$ j2 `/ X$ ^8 c        int            i = 0;
4 p4 R# J: D! [+ |0 _
3 f) ]3 }( x, [% a; c, {( L        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% ?' C: d2 l! D! W) T                addr = base + cnt;        /* pointer arith! */8 y* y; J+ X4 X4 B% A3 T
                sync ();* P3 Y+ @7 d: M$ y! A2 c, `
                save[i++] = *addr;
8 |- e4 b0 U* }7 d. g                sync ();
  M. z7 p8 ]1 W" `+ \% Y- A8 D2 O                *addr = ~cnt;' u- z. S5 U; ^" q5 s
        }
$ H$ @* P" i8 R# y7 \' J8 @# E9 X4 b0 \; c) f  b# D
        addr = base;
# X- y( }# Z5 ^: o5 v        sync ();& l. m5 \' j% d/ U! i
        save = *addr;
: @3 F+ n9 {7 Q5 r; _% b+ c        sync ();6 H& \! I5 K, x
        *addr = 0;
' C6 @. e+ A/ p! S9 L
) g, l" A/ K4 {0 g        sync ();# k7 a- ~. W2 `+ |3 x1 W( Q( f( R
        if ((val = *addr) != 0) {
' i' h, \  S9 g& v$ C/ A                /* Restore the original data before leaving the function.
7 g! C3 ]$ o0 m                 */
; }& e% E( t: K8 O                sync ();
! l4 _! l6 _5 A' Z  f; v- r                *addr = save;
) }; K/ v. O# V4 o                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 [0 V  V) [& l: e& |
                        addr  = base + cnt;
4 y  r& l3 J# G                        sync ();
5 r/ }9 D# |+ @" R  P: [                        *addr = save[--i];
+ v1 t  P4 R% A1 Q4 S+ a                }
: s7 h6 m. t" C) G                return (0);
/ Z2 k7 r' [& S/ P! D# m        }. d: U; v0 J& N6 `" I3 e( X
" b, Y5 \5 d( h" O* a7 O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" ?; c  c) [* O
                addr = base + cnt;        /* pointer arith! */
8 N6 X& B* a1 R! Z- ^                val = *addr;
! c1 N+ }3 x9 x                *addr = save[--i];
& X( v8 C* E3 p; x7 m" w& J# \2 B                if (val != ~cnt) {1 S% ^/ o4 j4 q& y3 G
                        size = cnt * sizeof (long);
6 }8 e, o& c: e+ {3 N" f                        /* Restore the original data before leaving the function.
- `$ s" X! Z" M3 c  V                         */
# X" ~% N& k, J" T: Y6 ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) _( L0 z, T! J
                                addr  = base + cnt;: N8 p! c, j: J9 n
                                *addr = save[--i];
3 h6 J5 z* K) a7 }6 v+ p                        }% D# l8 v0 o$ Y, a% e
                        return (size);
8 o1 m' M+ g% y! ^, K1 y% i/ L& u% ?                }, s# A9 A- T  {$ E+ y
        }
  Y, `- I5 z; T
1 {4 p0 H8 ^2 k, o" ], x6 H        return (maxsize);
- Q* K  l3 s8 R: j, e$ W3 `, v! w}9 O, }+ Y6 Y5 t/ r2 i8 _* ]
int dram_init(void)7 p/ p) p+ d/ w2 c) D- k
{
6 A. L6 M( O, I% x6 n( b        /* dram_init must store complete ramsize in gd->ram_size */  I3 @$ A/ I$ g, r' p
        gd->ram_size = get_ram_size(' g! R- a( J, W6 u
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 f$ z5 t/ y$ G5 |; Q4 A                        CONFIG_MAX_RAM_BANK_SIZE);
: a% f& _) W0 E, M8 t        return 0;3 o' j+ H5 a+ v' Y8 j$ d
}# o/ h2 t9 K% T% g& Z6 G# k4 F

+ e# R2 K3 w/ p- t, V" Z! r) d4 ^# |' H" c

4 h% ?2 P0 F: A1 v( i0 d. G( k; y9 p7 A) D  l; r
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 B/ d+ l5 U! f' k8 e, n6 [
: X; E' h0 E1 F5 N

, J7 [9 {$ Q" ^: ]
+ N- ?" P! M$ C$ _9 x# }





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