嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! [4 ]. ^% ]2 A  b/ `/ V5 L核心板2:DDR2 256M Byte   NAND FLASH 8G bit& S6 B; o5 s5 p* i( T9 T$ C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" G$ L$ o9 E  U6 ^8 h% C* s0 |3 I2 _+ K9 Y( S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 \/ F7 Y+ y  p; _+ N0 \
% N1 \4 y  U3 f& I8 m% @

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 I' H) L+ D8 e5 g1 L. @) M! g
/*
" ~' g# E9 O; C' y* Check memory range for valid RAM. A simple memory test determines
4 ]9 i" m& k, |4 l! G( u* P) w( R* the actually available RAM size between addresses `base' and
* |$ i/ i( E1 u5 l* `base + maxsize'.( j% r8 g% K- f" P0 D: R
*/: ~, N. J8 l8 G. Y% u
long get_ram_size(long *base, long maxsize)7 _4 G8 {8 z. P9 P+ L6 y
{
$ Y4 D! K& _. h+ a7 R        volatile long *addr;" k% n5 D2 S: Z# E6 X; t+ R3 j8 {! I
        long           save[32];# Y& C7 D! W6 {, [% Y
        long           cnt;
' Y: K: \9 |. l7 J3 B; [/ q        long           val;9 C3 [' r5 [: l
        long           size;
. j" q5 |$ u) L        int            i = 0;# w5 y1 h# x* V7 D

+ D0 y1 P8 L8 Q1 g# r4 c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! ^6 t8 D2 j6 l% @, F                addr = base + cnt;        /* pointer arith! */7 t) @: H1 a3 M1 w1 {' o7 I9 z' o
                sync ();
$ B( E# @8 }& l! f                save[i++] = *addr;3 q' |3 ^5 N1 u6 V8 _# U* D
                sync ();' A% `5 U8 a* R, P
                *addr = ~cnt;
6 p# R! T" D2 \* g, |% }3 s        }6 P( }% d3 @( S: N, {; ^; U, N

/ a8 y" ~+ ]( Q) t* z! `        addr = base;
2 z6 w9 E, T3 h% B! m        sync ();
$ x% C8 v8 ]: ?& F5 @$ a0 \0 F. w- F        save = *addr;
, k" z7 `3 E: V        sync ();3 d0 i( p1 P4 c+ n! l3 s
        *addr = 0;1 a) ?. K+ p: K# y+ b) {
7 y* X2 \+ Q1 A6 o
        sync ();, Q. F: y* [; U, [6 d. d
        if ((val = *addr) != 0) {9 {+ y) Q$ P$ {$ v+ n
                /* Restore the original data before leaving the function.# L6 L* T) G& V8 [* ]1 E- {
                 */
6 @& L# A; n/ |8 }! q8 J                sync ();
' e  M' }0 B/ e, h9 V. Y& l6 J6 z                *addr = save;7 z4 ]6 n* N: p
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& V" R+ m' m% ]1 S$ n
                        addr  = base + cnt;5 H6 D5 P) l2 G! g  K
                        sync ();
& c- \* h, K: h! x                        *addr = save[--i];1 T5 v( g) {# e  j" f
                }
( j# r+ P& q- O( p( {, T                return (0);
4 {5 @& ^4 ?+ \% Z; T6 F' I5 w        }3 y5 `% D' J' Z% V) r

8 L( [$ a3 o/ n0 B$ G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& t. X2 i6 T9 e: I                addr = base + cnt;        /* pointer arith! */, A* Y# |; |: W9 Y3 ~0 D* l0 W
                val = *addr;
; ]" k) H$ d) ?! d0 c8 A& F( E8 ~                *addr = save[--i];
6 ~% l$ z' G6 B/ Y3 X% G1 M                if (val != ~cnt) {2 K1 d& V/ M4 f
                        size = cnt * sizeof (long);
$ @( L- _; D( l                        /* Restore the original data before leaving the function.8 E3 Y# }8 C1 B4 O& E
                         */& R/ T) d6 q7 F5 u0 {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 S) g# j% w5 R) i& m                                addr  = base + cnt;
0 G1 f0 G- t' {8 e0 l  p. \                                *addr = save[--i];
* S8 h. V* y! e& y                        }
: |  O1 S  t- I& ^! q+ b; j                        return (size);
* m8 M5 `# j. e1 u5 |; [                }# k7 `/ u' T8 t* r- `, D
        }
; Z, n/ s5 O7 F7 X" x# z. w0 b2 i+ e6 l
        return (maxsize);
) c- B! |" d1 x# x}6 \/ V5 m" Z! e8 m- t
int dram_init(void)& g2 ?& A3 D8 e2 x5 [
{6 ]* i) d+ e9 ?' v' a# g/ ~+ {
        /* dram_init must store complete ramsize in gd->ram_size */" `& E: J# s. _: ~: o
        gd->ram_size = get_ram_size(" w/ V0 r) w; ?. P; A! \$ P
                        (void *)CONFIG_SYS_SDRAM_BASE,0 c5 [1 ~  h' J) [  w' a8 v2 S& W- g, n
                        CONFIG_MAX_RAM_BANK_SIZE);, j, y! l, r6 k; Z7 W& ^3 d7 z6 n
        return 0;
& f/ Y" H: D& h! R7 u. j7 x. L0 n4 S}
9 H3 ^2 o/ K$ S7 G4 `, X/ D: ^) `4 z0 U6 }# z
7 S1 o$ m3 c6 R$ J2 a3 d- B

2 Q- Q4 n5 v9 [' @. a1 G
+ K1 U8 e8 i- _8 FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& G( S! N9 w9 U, i% a
( f1 n+ N; w) ^4 p+ I8 I
" C& O. }! |8 e, g2 d

7 k' }3 \) U! [  C& H




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