嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 T% B  I" u; ^. ^. F8 p. y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' D- S. e; b4 q2 P+ ?9 x这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ f0 _. w# ^- K& G2 s: t& G% G& V1 f" }3 ?1 f* I. z; |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 K  M+ Y% x* B5 g5 }; f
' A' \! j3 X% f9 I2 |4 e& f9 K

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: Q. T% A$ M& J3 o* `1 P4 S' G6 @
/*4 p0 P0 V. p1 B6 y# ]8 m- D% `/ C
* Check memory range for valid RAM. A simple memory test determines; R+ s9 R. f( U- ?1 P
* the actually available RAM size between addresses `base' and" X5 E% C/ V# k7 N
* `base + maxsize'.5 Y0 M7 \; v/ U$ Y; U$ L
*/3 O( d' L, K1 ^4 I
long get_ram_size(long *base, long maxsize)+ _. r' u5 y1 }4 D9 I
{
4 A7 j* t  n9 [+ d+ G  N- U        volatile long *addr;7 V" t2 i' s& Y. E3 J( L; |
        long           save[32];
* G- W/ ~# K8 e1 f+ E/ y        long           cnt;7 {2 d. \5 S/ t0 s
        long           val;# `3 E5 \  B* M7 h7 }" v2 j( c
        long           size;
" t8 B$ g+ |$ i2 n        int            i = 0;
1 K: s* R5 O7 O- J) J1 n! B: G0 F/ k( E3 C+ o5 f$ [
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 Y; s1 @0 ~! f2 ^8 l
                addr = base + cnt;        /* pointer arith! */
, ~5 K) R# j- U2 Y  Q. G% E  [                sync ();' Y2 x7 L8 ^' u+ L0 h* n
                save[i++] = *addr;8 h0 }/ a& O5 S5 |' o$ f' K% t
                sync ();
% S9 d# }3 b$ b+ s                *addr = ~cnt;
; Z' g6 u6 F  q3 i! `' T& ~        }
9 X( D+ p3 o5 z6 G6 A( J: h2 L; a- N5 R4 S% `/ D
        addr = base;. G0 G+ J* j4 r
        sync ();/ ?3 i" z3 V. H) }" [* U, S
        save = *addr;
# {7 ?% H+ }: v+ y        sync ();
' ^; n2 u  D5 i# x+ U' G% A        *addr = 0;
! p0 d6 ?2 K1 S9 s8 x* p7 u
) ?0 {9 I# K9 y( @3 D+ U8 f4 L3 @0 W        sync ();7 s5 L% o% A/ v  |' J: ^
        if ((val = *addr) != 0) {9 G7 N0 P! X+ [5 e8 a& |7 A6 r( l
                /* Restore the original data before leaving the function.
9 S* z: Q8 Y/ @                 */
" ^& M) W: N. M  P; g1 }                sync ();. N3 @( ~0 A7 X, ~, Q
                *addr = save;
4 S% \+ m( I7 K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ Y$ H; c$ c: V3 G
                        addr  = base + cnt;
7 b; _: G" X" Z2 P& f4 i- Q                        sync ();
( r* Y% s7 v/ M$ }. Y                        *addr = save[--i];
% u/ B$ `2 C3 Q# I                }
. _+ d. A5 X- k3 n7 I7 G6 u  {; u5 C                return (0);9 G' L* Y' @! N
        }7 l% u6 A9 r0 s

% V: j' [6 ~* {& d, w        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 m4 d8 e6 p9 N0 [$ y/ k
                addr = base + cnt;        /* pointer arith! */! j" n  F- G' ?  \
                val = *addr;' y* P9 G7 i% |5 ^
                *addr = save[--i];
9 A# E+ S* z+ Q4 z6 u, d                if (val != ~cnt) {; }9 u2 t* `0 u. c% x
                        size = cnt * sizeof (long);2 p  @3 t3 m- W/ {2 x
                        /* Restore the original data before leaving the function.3 i% i3 G3 L0 I/ `% r
                         */* x, [9 }8 Y" E; A* r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  N0 M2 J% E+ l* E) u                                addr  = base + cnt;! J5 y# g1 l& J2 T* y
                                *addr = save[--i];6 N  H" K1 o0 v; ]# q# j
                        }" W2 i  s# Y6 E2 B* v/ ?: z
                        return (size);: c' I5 }5 U6 S; |% L
                }  Y! p& A& `: H2 c" o3 K" h
        }/ S+ ?  q) L! K) J

) L# U3 \" a* z" U+ d; M        return (maxsize);
: ^% }: d. W/ c4 N) V( U( \}
1 R& |" U( O. J! ?5 r6 \1 rint dram_init(void)
9 J( n' g5 l  I" ]4 a, d( H{
1 Y8 ]: W3 H: {; {4 `        /* dram_init must store complete ramsize in gd->ram_size */* K2 O5 R  w  M' i. f
        gd->ram_size = get_ram_size(& W' q- _1 V& w+ `/ {. _5 M
                        (void *)CONFIG_SYS_SDRAM_BASE,/ `1 T6 N0 o/ `" x
                        CONFIG_MAX_RAM_BANK_SIZE);
* o6 K8 X* g" e' X, C& S9 U        return 0;; }+ f( e' k% X& M
}
! R" F2 L" @# w' b* e' q4 L. x" m% O: @/ M; z# L
9 U9 T0 l/ y9 _5 {7 b7 Q

3 e$ l, c  E! Y2 d# J8 y
4 z% N; l. n2 ]5 @$ _7 \9 CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
  b  [, }+ B+ H% j- Y) b1 K- w, F; D" x# s3 e# x! x
* V" j6 k( V/ v9 K

6 G$ k9 [4 |; l$ G+ U6 ~( D




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