嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ N' @  Z$ w0 o核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 P  r" ]$ p/ I* }  d7 t: c0 _8 k4 w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 L% b0 A+ d6 Q5 ]$ n( g8 E" x. p
' F3 a3 x' \9 M9 |) a: {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; q, v, q; D6 ^1 j* ?7 {

. K5 N8 @+ c5 \
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 e' Q% o, y% T. I& l9 h) M$ r% @/*& H8 \$ |( t- [( ^. {- {# f4 ~
* Check memory range for valid RAM. A simple memory test determines
  V# |# n! x( ]* the actually available RAM size between addresses `base' and' b/ m2 q7 R6 a# n- u
* `base + maxsize'.
# C  x* k( x* t*/
/ c, u" D8 y* ^3 u, |# ylong get_ram_size(long *base, long maxsize)1 e8 R$ F' n- g, \) s. X, ?; W" r
{' o$ a9 ^( E5 q) u* c! p
        volatile long *addr;1 }! m. }* d% m
        long           save[32];; L1 q' c7 p' O6 @: t
        long           cnt;4 t8 B8 {( c  y' z- E. F9 E
        long           val;
. o3 m/ t* x3 G( p0 C        long           size;6 f8 G4 y* c5 ^1 N+ C. y
        int            i = 0;
9 L- \" R  A; e' H* N  Y3 q5 J* T$ q. T5 m* q  K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 o3 `' k+ ~6 ~* X
                addr = base + cnt;        /* pointer arith! */
. P2 |9 x* A' ~( ^9 v) K                sync ();+ k: J3 K/ H6 \: E. @
                save[i++] = *addr;
$ e( n. ^, }% ~                sync ();  d3 p( ^: }* f# L  p, j; l
                *addr = ~cnt;, C, u1 i% J7 Z) {3 k
        }
% ~+ F3 Z4 L/ ]2 |7 P1 n. n+ k+ G; r
        addr = base;
. }6 l' N& T3 ^5 O' ]" f, U        sync ();
2 Y3 X' \2 O/ u. B$ A# F        save = *addr;1 h( {, i$ Z( _3 A
        sync ();
. y# W7 \2 ?+ B$ f( n% ~        *addr = 0;
  C/ ]8 S. y! O2 J! U1 O/ L7 o
# e( y. l6 {7 J# h# U        sync ();! T' D1 k! Q0 _- S6 K+ C: e2 |
        if ((val = *addr) != 0) {
# o3 z% n$ R/ y' U& v) p, o                /* Restore the original data before leaving the function.' |/ M0 N- P( Y, i- N3 K5 V
                 */2 a( b' @' K" p! B& G
                sync ();
( ?6 u0 i2 J9 ~1 U                *addr = save;
5 W( E( n7 {* O% [- `% {                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. }6 @9 K, B. T2 q# D9 M; N
                        addr  = base + cnt;
; E: l/ M0 _) L3 p( q                        sync ();
4 s* R! g: l3 g; n% f4 W8 D1 u- x                        *addr = save[--i];
2 Q& O+ H- ^# z4 \& x- }3 ^5 M                }& ]: b0 P/ u  W
                return (0);
' U0 t" m. p6 f; `        }
& _* r# c/ [- Y. H" Z# d1 p- y, u+ \9 [0 C* B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ]; L6 l& y9 s6 N% H7 r                addr = base + cnt;        /* pointer arith! */# {9 N4 H# L  @+ m1 H
                val = *addr;: F3 A- l1 m) W7 [2 e& E) g
                *addr = save[--i];7 s5 l( x0 b/ J
                if (val != ~cnt) {
6 w& d: L1 r! h# c0 o& E. M                        size = cnt * sizeof (long);! t: U3 D' G$ {2 d& b: T. ]
                        /* Restore the original data before leaving the function.
4 l0 V$ e# x( b2 v+ O( Z                         */* t6 V" M: f2 P: f- S
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# q0 s# M" ?, J  l- w                                addr  = base + cnt;
* I  z$ S/ Z/ u, H* t                                *addr = save[--i];
  D0 P: j$ k" ?8 c; P7 x1 B9 N                        }; _$ u% t( `9 k. f; U8 q- q
                        return (size);; U, k+ n# y! s
                }3 |" t; F% a) P6 F" u
        }
3 Y# d! |3 ~, K, j& g3 U0 k. x9 G' p3 p
        return (maxsize);
! c: c6 v8 o( t1 m& W& l, F4 Y}" _* L5 W" f) P& @$ D9 l
int dram_init(void)" T: C, x# \+ ^7 t8 K" h
{$ M9 `1 l' w5 R- W  ]) E$ k
        /* dram_init must store complete ramsize in gd->ram_size */. a& M) m7 |, M! F& `; y
        gd->ram_size = get_ram_size(
9 O5 S0 f' @$ @4 `( u                        (void *)CONFIG_SYS_SDRAM_BASE,
- {6 r/ u3 H9 R+ C+ U* p                        CONFIG_MAX_RAM_BANK_SIZE);
  w+ |0 G* |: j9 j5 x* \        return 0;! I* r% D" v7 M; ~
}
& x" c9 }" ?* j
  p+ f) T% v. e8 Q' G) ?
" [6 j# S9 `& @/ `! V; s) B5 M; H3 Y8 T7 N/ j

, R! ?6 T( g: g5 ]! @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ y$ Y+ B% g% I* b( B( ~7 \' a
) a, X; V& h+ v7 @

) \; E# v* ~6 w0 _  z

& ]2 u/ E7 ]& f! ?  l" p




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