嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 Q5 y+ |7 J$ j+ R0 ]
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, O  G) I9 j# e9 A: G3 Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 N5 ]: o" ~+ g8 B1 i" B  g; H9 e4 \$ p" e" a5 j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 f* u; ?& G; V5 ?+ B
2 W* {9 T# ~' q3 I, Y/ T) t; U

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, m3 j. B% t7 p1 T5 f! u
/*. \; X0 M& ^# b$ b1 b4 D7 f
* Check memory range for valid RAM. A simple memory test determines
0 R) v! z2 ~/ A! r  G* the actually available RAM size between addresses `base' and
& `' m  b# S' ?4 e+ m( X* I* `base + maxsize'.1 W( ?* |6 s9 Q; ]: ^
*/* ^' u, r; T/ ~; h( t4 z) \
long get_ram_size(long *base, long maxsize)' |" i. u1 _" G  W" i# Y& ^
{
8 o: [) E1 j: f: ?- o2 Q3 x+ e        volatile long *addr;9 g2 N0 s$ p' v3 t8 m1 X
        long           save[32];& k, Z2 E5 G) q9 \& W
        long           cnt;
. O* k0 }1 z+ @. b        long           val;
: |) Q' {! k* C        long           size;
  N: U) V9 }' @" ]/ N% E        int            i = 0;4 e+ F8 u8 D' z; _

. h  T, C7 A! [# s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' X' S4 w+ @2 G% f8 x+ b; K                addr = base + cnt;        /* pointer arith! */
/ d" [1 C( ]- l1 m0 B" k1 F) p                sync ();
% B; H2 C6 l" k* e3 i5 T. Q                save[i++] = *addr;
5 Q# B- f( y% }6 d" {% i5 j                sync ();: e* s  t1 j. J: N
                *addr = ~cnt;
, x9 l$ Q5 ^5 s1 T! v* I& U+ l        }/ s0 i0 }+ C* H4 `! P- I* H

' O6 D  ]8 R( _+ T! S& W        addr = base;
3 z/ R1 M& \; z' y" E        sync ();
2 T# B. K/ E3 K, X8 X5 |" \        save = *addr;
! T7 w0 R( q8 Q+ X( a        sync ();
2 n/ N! y- [  r2 d% d; \        *addr = 0;
- F  K' _3 b- Z8 Y. C& c, c* s; s
8 ^# A$ l* Y4 E. p) Y3 ~7 [        sync ();
$ H1 M; D5 T+ P7 U- g9 a4 L        if ((val = *addr) != 0) {
) a- e& y4 {" i" [                /* Restore the original data before leaving the function.% ?) G4 ?3 k- [1 i- K& F
                 */+ ]6 d; `9 e! T3 n0 Z
                sync ();
! O6 c3 y* L: Z4 P- [1 C# H                *addr = save;
0 k5 J9 w% K: }$ Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& a. S+ E% B% h- I  i' F4 w
                        addr  = base + cnt;
4 _( X. e6 M( R" `' j0 W/ a5 i                        sync ();9 L/ y4 L  \+ }0 n# s/ o# B
                        *addr = save[--i];
; l; b3 g+ o3 j                }3 E: h* b# J! H+ @# O, u
                return (0);
! P5 p. y" ^& c        }; R5 R9 i: h! L2 L) A7 q

( |4 s" A; N" c/ P5 p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 Z  M7 g: d4 U3 R. d: |- ]5 P! @
                addr = base + cnt;        /* pointer arith! */
* a3 b. O' U! q* o* W' I) @" D                val = *addr;
2 M8 l# X* h# u# F5 A# m                *addr = save[--i];8 h3 A; L. I$ T5 M5 b0 \
                if (val != ~cnt) {
% J: N% ^0 Z) j% }4 c. B                        size = cnt * sizeof (long);! J: E' K% p- ^& R
                        /* Restore the original data before leaving the function.
4 @9 {4 F. K$ o& r& r                         */
9 I" |7 L" T% u                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 U; B! P: E! ^9 z7 s, v5 s* T                                addr  = base + cnt;
, w3 X0 N. k) u- \) ?                                *addr = save[--i];% I, }2 Y- D% u+ J" O) P( I
                        }
5 r/ D% U9 n/ d( Y1 c                        return (size);
# h; ~, S; ^- I$ Y  z                }
! p; p0 q, P  B& J! y6 i        }
! m, ^# H0 G4 J5 z  k- A+ ]* t4 e1 W8 c7 T
        return (maxsize);( j8 ^/ C- q/ f6 E9 ~  I$ u' h3 _
}& k9 X# q/ \5 C  Q1 \
int dram_init(void)
/ U8 m' W/ o( d7 r3 N. [6 t{
( e* U2 ^: ?) G! c8 Z7 ?9 p        /* dram_init must store complete ramsize in gd->ram_size */. T+ j8 ]# G0 y1 @" K0 ~% G
        gd->ram_size = get_ram_size(8 Y7 \7 c7 t$ z& }$ x; U4 l
                        (void *)CONFIG_SYS_SDRAM_BASE,
; _0 u4 N# R* O& [4 r                        CONFIG_MAX_RAM_BANK_SIZE);; G$ r6 U6 ?. _: t( h- G. u& ?
        return 0;
, L, G9 `0 y3 E& v6 V% b}* _9 n7 G/ I6 M& c1 {

8 l/ K1 T/ E& s" i0 V
% ~7 W& F; ^3 I) }7 V2 J) v
- L, j9 J% a+ u- C' N; v+ G
1 a- @3 O) M% J+ ]8 Q" u* g2 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 z9 h* |4 L- N6 a7 R% r* {
1 E2 m- O1 x5 v2 V, ]+ U0 _& H+ b) N6 S& @5 Q# w: i; W/ w3 K2 p( P
9 |7 g/ b; r6 T0 o; W  I





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