嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) J! D1 l  m) T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, y1 D1 J- {' {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 w: B) H( l" m. `

  A; j; B' a3 J7 h3 B  W1 ]是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" P! j7 s  q* v( Q7 _9 a1 o% P1 i+ C2 H2 r2 C; y' x

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: o% f7 J2 Q9 V  l  d/ t7 D/*
* b1 q4 U2 h) I4 L' [  U5 C* Check memory range for valid RAM. A simple memory test determines8 F. [  j, A9 o* m: g4 v- g
* the actually available RAM size between addresses `base' and8 y/ G8 V% [% P- T
* `base + maxsize'." g7 t6 V. q  @* E8 z
*/" B2 f  G  Z/ r4 S# \$ J' c
long get_ram_size(long *base, long maxsize)0 X' Q: f- Y5 u; D; s
{
9 V  O5 J9 h4 _& u! \+ C: A        volatile long *addr;2 G; r+ a, P& u
        long           save[32];
; U: ^: o3 Z- [) {* T        long           cnt;
2 U$ L. ?; K, M2 B        long           val;
4 p; S9 E7 Q3 b) h& u        long           size;
  p) {' k$ z) W/ T/ W! I& e' X: h        int            i = 0;
7 h5 l+ T, Z. U' C9 g$ _7 |0 f) |  p7 f, v
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ M0 K3 D( @) X1 V; s                addr = base + cnt;        /* pointer arith! */
* [& n8 Q& p! u/ P                sync ();+ g" G. e& [5 G$ p+ X
                save[i++] = *addr;3 {2 U* Z$ |5 t$ ]) {! ]
                sync ();
& g! m( ^% O% H                *addr = ~cnt;
# y- @0 D& u, |4 [- [        }1 _7 T8 a7 C4 y6 p" d( Z
. J: p2 \! O9 @3 Q* M1 i- O
        addr = base;
% O; x8 A& g% V& c- h        sync ();
  R% V% c$ h( h% M        save = *addr;8 }" C7 Q. k5 e! q
        sync ();
+ N* Z/ M. K' K3 X% _* v1 X0 w( X        *addr = 0;7 }( S6 j: A8 m9 L

/ @4 @$ s- h  l        sync ();+ a; V7 b, T3 w# y: G1 `/ U! z
        if ((val = *addr) != 0) {" _6 w& E; |. k  d5 n- M1 B: n
                /* Restore the original data before leaving the function.4 f# g: t$ _3 f% \
                 */
; L& I1 K- R" b1 G) K                sync ();( Z0 d1 Z0 r$ j- a; _% j
                *addr = save;# W& t9 U8 ^' t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" \) H0 p1 i2 C. L% H. `4 X
                        addr  = base + cnt;8 i3 i+ Z( q8 V
                        sync ();5 [0 y1 i. R; x4 S5 x0 j# D
                        *addr = save[--i];2 D1 w/ o6 t; p/ S; c( Z2 @
                }+ [0 |) }& H, J& ]1 {
                return (0);9 ?: _" t0 H3 v* t+ r& b0 M
        }+ u8 n3 p1 H5 n
  A5 O, n' r/ r/ w4 T( a" H: Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; X  P0 J3 j$ N) ?1 t) X+ W" @                addr = base + cnt;        /* pointer arith! */& w' {$ i: ]1 F4 D  h6 t# i8 T
                val = *addr;+ |. A  E" ~" L8 h0 [# U
                *addr = save[--i];4 o0 S% h4 V/ L- {# Z  p/ U* c
                if (val != ~cnt) {# K' |/ K$ n& }; ~
                        size = cnt * sizeof (long);. {) T: ]! Z) |7 y
                        /* Restore the original data before leaving the function.1 D+ ~8 [% S7 o& x% {1 b2 `" K% `
                         */
# _# q+ f2 [6 g+ Z9 y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 X$ ^+ T/ G( a6 I
                                addr  = base + cnt;
0 g: X0 v5 T  J6 E' F                                *addr = save[--i];( Q; I6 n  [6 v5 L9 S+ U: ?9 G
                        }, H# A! F+ j, b# s# ~5 w
                        return (size);
: K+ F# x/ i6 ^                }  G7 K, s) d' r" d
        }6 M: V- o4 g) {9 G2 C

  ~' C7 p- G; w0 R        return (maxsize);
* c9 W9 \# T7 J5 Q}
% X2 X# d8 N! H' l) }( u9 }int dram_init(void)
$ |4 h  N  G+ Z9 M0 d5 w  c{4 I: [: W' [2 N
        /* dram_init must store complete ramsize in gd->ram_size */3 n5 [* k" b* i0 n1 Q8 u  l
        gd->ram_size = get_ram_size(- o1 M1 x3 y' q6 q! w
                        (void *)CONFIG_SYS_SDRAM_BASE,% g1 R4 B  H# ~& q  v( \6 k9 q
                        CONFIG_MAX_RAM_BANK_SIZE);( T7 y4 T3 a1 S/ X7 Z
        return 0;
5 W2 m9 O0 r1 g# J}
  [; A. G0 V, J; I. U/ y
. o, {" y: ^% ?1 T& p$ L
0 k8 V9 O/ @; Q7 T. V- p* `; a! ~7 o) X9 i* v8 U4 F. b# Z9 d5 _8 Z8 K

: u, ?, P6 U, m& x1 x1 E/ ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 l# t- P  c* N$ j) x) {; `( R/ d
3 q# r- d7 `2 N: M

  d/ Q' I9 Z" ]( R5 a( L) X" i

, }  z" u7 H( n4 T




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