嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 `2 n9 W' B% `* R+ H. R) f# B核心板2:DDR2 256M Byte   NAND FLASH 8G bit. O, y' }' z9 S1 X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; V' R7 X* R: i% Z8 a( y4 o. m5 G8 T3 C7 u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ C1 r) @# ?, X9 F0 \, D, p5 m

8 ~$ {) Y, C% j# W
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% X; [, `% k# k/ P/*7 Y  q% ^) [; U4 x
* Check memory range for valid RAM. A simple memory test determines
  s4 i1 P# Z( i. j3 m# k* the actually available RAM size between addresses `base' and
2 S9 T- w, Z; D$ R  |* `base + maxsize'.! f4 G! i& z, }; N$ H  \" M
*/# `7 s( C& c  d( H. @8 ]( g  b
long get_ram_size(long *base, long maxsize)1 v, c, C: a9 @
{
& B6 s$ X3 [! F        volatile long *addr;# S+ d3 Y: {8 Y6 j+ |
        long           save[32];
) \7 b& _* X' C        long           cnt;
( Q4 U% N1 |/ J: E! F" N        long           val;
8 P3 y# d: k( g9 i. s# Y( o" J3 x1 ~        long           size;
& R8 T- @. y/ ?        int            i = 0;
( }" [: s2 B9 L. B$ {' x' y, Y/ d9 O. ~* }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 P7 n/ B" `1 y5 W4 @2 l: z* Z
                addr = base + cnt;        /* pointer arith! */1 @3 r6 Q. X- P  r) d- w$ Z
                sync ();
) D* L, F/ e  J. n0 o9 s$ E                save[i++] = *addr;5 p+ y; I! Q& c
                sync ();
% W5 K" l: Y& g9 d+ p6 ?" R4 ]                *addr = ~cnt;
( V" x% A; k5 V8 w7 d        }# s" K) K! U5 K( c

, a6 N# k5 E+ `$ W  B4 r4 k) S        addr = base;
# ^$ e5 E2 `1 a        sync ();( w3 ^5 c2 D" y3 H/ Z
        save = *addr;0 A, R  }4 u" j  b+ `: I, K" I
        sync ();6 T2 Q' c  h8 `9 P6 I
        *addr = 0;
; f2 f1 P$ H$ W$ K, y0 D6 `( `/ W# F  T$ N  e' \
        sync ();
3 k4 r6 \$ B& i  J+ f# c7 X! g        if ((val = *addr) != 0) {
5 w, o7 |$ L  d- r, _! g                /* Restore the original data before leaving the function.
8 |" P: U. r* o$ E                 */
9 C, N6 P  h/ f" r- @' K' p( D                sync ();
" r, p8 C, J' L- d6 F                *addr = save;
5 a0 K* r* f. d4 B  q$ ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 I+ h$ k: |+ i( i- r) V
                        addr  = base + cnt;, t# c1 D5 E* [, H7 [8 D4 D
                        sync ();
9 \$ x) P  @9 F# e                        *addr = save[--i];$ {# s) N# Q9 h3 {% B9 [. `
                }
. }3 f2 i8 Z( c6 @' B                return (0);
) v: r; \9 k# \! T        }- t% c* T* X& F/ h
3 K4 @  Y8 Z* o; b" i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) ^2 b" L  h3 p2 W- W' Y0 y/ X                addr = base + cnt;        /* pointer arith! */2 Z& T1 u! K1 E8 k
                val = *addr;
. a! g8 J- p8 f) S; L                *addr = save[--i];
: a2 ^% u$ f. @  h' L                if (val != ~cnt) {
$ h7 x2 }, F6 Q$ w- k                        size = cnt * sizeof (long);
6 F7 Y6 O4 O' y! N7 k5 [- |                        /* Restore the original data before leaving the function.
7 [$ n; K' n7 Y& {$ n- h9 Z0 F                         */( E- V/ u' `- Y, ?( m, I
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ Z3 a8 y: d' B, E+ n4 i0 |                                addr  = base + cnt;
6 u4 Q3 A* @/ \& \: d! M8 ]" E                                *addr = save[--i];! }/ x$ [0 D7 ~  `) ?0 J7 H& w3 {: S5 K% ?
                        }
( `  G& w5 [' o: i% X& w                        return (size);7 ~' A& x9 \4 X& |4 z3 S) F, U1 W; a' ~
                }
$ `; y/ C6 n. J4 B- b3 e        }
( R9 F* Q  I+ z: c9 U$ Z8 g6 \" S+ `9 B; T/ n
        return (maxsize);) C6 `1 F) q/ q, z$ i4 p
}
; {& N( G2 I; L6 Xint dram_init(void)( f# B) `( d0 s+ Y# G
{! @' m% {+ R+ `% x% b$ T9 s: X3 Y% g
        /* dram_init must store complete ramsize in gd->ram_size *// S' o& P1 _! R8 \/ O1 x
        gd->ram_size = get_ram_size(3 i" b/ X+ s2 G4 E
                        (void *)CONFIG_SYS_SDRAM_BASE,
: ?3 B. m! _3 ^" m% x                        CONFIG_MAX_RAM_BANK_SIZE);; E/ p3 E" e, t; |1 g; x# f
        return 0;8 Q5 O1 ]9 g' ?- n# F
}
0 Q8 E6 y9 m) V- M! @, t
' w/ v% _! ^0 Y+ V! [. L; x: }5 t7 z" v9 X% @

0 \4 X! `' y- O" U& c
+ u2 |$ Q% a5 x# ?/ b1 ?0 m1 oFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) d- o# O. x) F( h$ l& ?$ C

& M/ x/ B$ X" \% q, j9 K1 T' ^3 [$ @/ |* F* h) R6 `

$ d; `: {4 A" P6 [5 S, [7 D$ s




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