嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 G. u- y& O% P) N& m9 W) k8 C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ j: u6 b& S3 C& x8 D$ F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! }9 q* K+ p7 i. O( {1 t& \
2 }+ L* a3 @1 J8 j4 K0 W4 M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, L& o" p; W' s/ H3 d" ~

8 ?7 y3 l( [0 T# x; a0 y' g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: v! N8 |8 ~1 @6 e+ s5 N
/*! r; a4 c( l( R, T( q% R
* Check memory range for valid RAM. A simple memory test determines- q  s1 G+ G0 u) V1 H, X( j. h
* the actually available RAM size between addresses `base' and
8 a- y! [6 C+ {4 t5 r! h* `base + maxsize'.& t* m2 p' @5 D" o+ s, A
*/
" j! @1 y% s" A6 h6 n! y( F" @long get_ram_size(long *base, long maxsize)
" F: Y) ?1 U* q1 [2 a8 y{
; @+ m$ n/ [2 k% m5 A5 N  S        volatile long *addr;" v  B5 `7 E8 s$ |. S6 }/ n  z# w
        long           save[32];
8 E4 U& N. x( h# L1 _! l. L        long           cnt;' S' P' @! Y: g" ^" w
        long           val;
/ M! A* v0 s9 ?2 H        long           size;
5 M, W! x2 Y3 T8 @1 ?0 B        int            i = 0;% N# m8 b- C9 k9 s! Z; K8 {$ v

# L0 u, s3 F+ h5 [, d$ t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) t- d& p$ U( t! {4 [                addr = base + cnt;        /* pointer arith! */
# L. R& `, t* ~4 _  H                sync ();
& C; j4 P) `- {5 j) u                save[i++] = *addr;
$ w- F3 Y( I8 z$ p- l+ g' j2 U                sync ();
4 c/ k" i3 c0 C& h7 F5 g% d                *addr = ~cnt;
/ b  n1 r, y& {2 E        }
% h1 \, Z9 N% x' k" H) ?+ m+ k4 E' u1 a
        addr = base;
7 U3 Q0 F% V0 s        sync ();5 l& E/ b* F! E8 O
        save = *addr;
" x: v% ?7 i5 C6 v& E% M        sync ();. w4 E9 R1 |/ W. Y
        *addr = 0;8 [* }. K: d4 x% i6 r

! O0 W- x( P: \' V2 ]  m        sync ();
% w4 E" e5 ?3 O' m        if ((val = *addr) != 0) {9 D" F$ v& f7 ]
                /* Restore the original data before leaving the function.
5 l- c8 I0 D! K" @& X: k                 */
8 e' Q+ O" d4 [: y, E                sync ();% o* L2 @1 R2 b
                *addr = save;
" o# H# y# U" i7 r  T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 W6 J6 `! M/ `& s                        addr  = base + cnt;+ y$ F: w7 D, p- G3 I
                        sync ();
" c0 ?; `$ e9 V                        *addr = save[--i];# d+ ^6 p( y, B. A3 ]
                }
4 {8 v7 c  D6 M, E- m                return (0);
5 I- ~3 B, X" [. _+ U, _* j4 ]        }
5 x: @8 ]& H( ]; X9 e! ^5 Q% W/ p4 ?" |/ f) E% ^  R
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ V7 e5 w# B4 {2 n/ l5 P
                addr = base + cnt;        /* pointer arith! */0 R' Q9 ]. f0 _6 z/ `8 H+ R
                val = *addr;
# `% |) l! d1 x( B+ N$ V                *addr = save[--i];/ H' Y* \4 P, g' k1 Q' A
                if (val != ~cnt) {
8 \" x! L8 ?& P  N9 O                        size = cnt * sizeof (long);: l0 O1 g7 V6 i- g" a
                        /* Restore the original data before leaving the function.
3 L* h" v) [/ Z6 c$ |. K; M" J3 Q( _                         */% D% u+ z- q- Y8 J6 O9 L) D
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 [/ `0 x; C# S# j4 M% z                                addr  = base + cnt;
- H% F. J& H2 |( |                                *addr = save[--i];
5 @% z7 a! ?  M) @5 n8 q                        }. [1 `/ b% t/ w: U' A3 |/ I/ T& P  Q/ h
                        return (size);6 L5 ~+ e6 d7 p$ ]
                }
- h2 c) Z# J3 {& j" W; ]) x6 a% A        }
7 O& t( }" b: k7 y+ v0 \
' C, o- m$ f* C" A        return (maxsize);
% }6 w0 X# _! x( Q0 j  k/ c( A  G}
, `4 b: y' ~. i( Rint dram_init(void)
( t) J/ F7 @0 i0 w{
3 Y* h& \  n' r9 ?) Q$ C        /* dram_init must store complete ramsize in gd->ram_size */
+ g3 O9 W( q( X7 m$ J& W, \7 |        gd->ram_size = get_ram_size(" R: s) i( X3 t- z1 f" P: j
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 `3 L7 s; O3 l% z* d                        CONFIG_MAX_RAM_BANK_SIZE);
; q& p9 f) U1 \0 k: ^        return 0;( T" S' Q5 G  Y1 f
}! [0 z' |4 Z" N( \0 w3 R! u1 M

( A% L: h. r6 P) H% q
0 K* h; ^4 {3 g- d4 \- S; M% r2 Q1 d3 O7 X
; e4 F) y( g) s6 W8 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ m0 ^* M. l1 L8 ?4 ?4 T
1 J: b5 }* {! r
- \+ E8 o3 S# [, U

& J' ]& J9 D: W( s) r




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