嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 }" ~  d6 y9 R0 Q. i. S$ F; l
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ u' l8 h6 o7 i) A- N) F" U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 h9 U* i4 p) T, E+ i
$ S! D- ^* V% h( ~" P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ [) Z9 |. g6 Z9 s
9 B% C+ V3 L  {& l

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% k, C/ d9 s" j/*( \6 k" E! Q* h+ U4 X$ T" F" g. X
* Check memory range for valid RAM. A simple memory test determines1 |" i7 J* o% `9 J, y
* the actually available RAM size between addresses `base' and
! r. ^: {/ J( G5 W- T4 ~* `base + maxsize'.' O! |0 K8 @+ A: |3 p
*/! I- r3 B1 Y+ ]( k9 F# a
long get_ram_size(long *base, long maxsize)4 n/ O3 {3 s5 ^7 V5 l' _- G: ?
{5 u9 @: _8 u2 _- M
        volatile long *addr;  I/ u6 D& n( E8 A0 B
        long           save[32];
9 Y0 f4 Y, o8 @3 j* ^  B( i        long           cnt;, K+ l1 I; x; s* t. r3 p
        long           val;: x& C" }4 q6 L0 `
        long           size;3 D! c1 J; R( n2 L
        int            i = 0;! i* ^) c6 K6 ]( `) j3 p- Q5 s

: a; o6 P, g& D1 c1 w" p* O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 Z" z& k! s9 U0 R1 p  T2 z  X                addr = base + cnt;        /* pointer arith! */
1 N! b% L/ S4 V5 P* u3 K+ A$ W                sync ();4 N" c3 [7 }! a) V8 j1 f3 @6 `" c
                save[i++] = *addr;' o9 B2 C) _! ^, ~
                sync ();& I8 G3 d9 m% j( o, q# V6 k8 I
                *addr = ~cnt;# \+ T' D+ ^& T1 P
        }( X) ^, X! L% F* O9 C: }
) J+ ?3 z" X5 g8 @- ~( f+ r5 y
        addr = base;
' h1 A/ _# b7 W' \        sync ();
% t, Z5 E, A# ~! k# T' u; j7 q        save = *addr;
3 b7 L$ w+ q% ~7 M$ N( z        sync ();7 h; l* L* m: Q8 s, V4 C
        *addr = 0;
/ ^' e* u' p. `  t) c( O! @) I% f% l9 I
        sync ();& S  a& [' L/ O! X8 M; [
        if ((val = *addr) != 0) {. V% Q4 f; F+ v. p- I
                /* Restore the original data before leaving the function.
4 o: k7 u! e' B4 b8 g0 a- n+ O  A                 */
- A1 |/ \2 l2 h& b) @                sync ();9 i" P  l. R' D3 M% Q7 c9 K& z6 _" I
                *addr = save;% s; v8 U7 A+ n9 V. c1 [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% y+ ?7 e. R4 @  x6 o8 G7 K
                        addr  = base + cnt;& Z' u8 R) N0 a( S! c2 s1 @
                        sync ();) f$ ^6 x5 j' M8 F3 N7 f5 T( B2 b
                        *addr = save[--i];4 s4 H) d. h' \6 }* f9 [$ o& p
                }# z4 i/ D$ k$ w1 g$ W5 N
                return (0);
1 f3 ^5 o0 {& X5 g" J        }6 q, n2 T: C2 s* O& G% t
9 |  Y  n' F! }
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ Q3 H$ e  o$ C+ R9 j                addr = base + cnt;        /* pointer arith! */
& d7 {& d  P+ N+ K" Y- y% }                val = *addr;
* J" j# a8 h9 C1 t% w" q3 s4 x! e                *addr = save[--i];! m$ Y* s' J3 {" d' y
                if (val != ~cnt) {
6 L( c9 d* C; ^: k                        size = cnt * sizeof (long);: v: V  i$ {- y) J2 v' m
                        /* Restore the original data before leaving the function.8 k. w% ?5 Z; @% J$ m
                         */9 P" _* u  w9 T: H% K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 i$ G# g7 g+ f( |- q
                                addr  = base + cnt;, ~- H9 [, C7 V5 Y
                                *addr = save[--i];
% v# Q/ }) }$ Y$ J                        }
! R" s$ F; `4 z' r4 `5 L                        return (size);3 h, H' A8 h; h2 ]  U$ H+ m
                }
& f7 {( w) L. X2 Y; S) W        }$ k& B+ k: _8 z" b6 w

) Z- x% c$ e- }5 k        return (maxsize);# i, Z; X; z: U1 B. h
}& {% A& |4 f( }" p2 D5 m
int dram_init(void)2 v) g% A! L( c2 Y4 u4 w
{
& c' O/ l7 K: {. n( `. r        /* dram_init must store complete ramsize in gd->ram_size */
: q; b7 y+ ?2 ^6 W+ K) P2 n        gd->ram_size = get_ram_size(
9 r9 z8 v. E4 Y% _% |6 A                        (void *)CONFIG_SYS_SDRAM_BASE," L* ^/ g( G: w! c) ^
                        CONFIG_MAX_RAM_BANK_SIZE);! O# e- P, _% t
        return 0;
% Q2 r8 _* T8 x! f# K' G}7 \2 X4 ?8 z# f* k( f& M* ]$ \
8 q, c$ w# F% _8 C4 n

) X3 m( s4 s# \; y* X; n! e! S! X2 m
2 i' |" `1 E7 J. R3 o" x3 U
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( K3 ?  k( _# v( Z! }

4 `, }1 Z& D, h) K# C+ t6 @; C
' I1 O" Y- q9 m; h; G  R

: U% X  f+ P- f, s! @  y




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