嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 P0 y2 ]( w: f) Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit& `& Q) B* t' j* s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ h1 J# P8 q' y" p2 G6 K. ~: h; S/ L0 y9 C/ D5 I7 y: K( ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 `/ x& h1 A6 G3 L
0 q) v. Z( {$ e# Q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( f# {3 m( a7 `4 Z: Z: L
/*
+ i5 e/ X7 L" }* y, [* Check memory range for valid RAM. A simple memory test determines
  s7 N( ^! f. J0 ?9 O* the actually available RAM size between addresses `base' and
6 P' i% P: F  C/ P  k# W* `base + maxsize'.
$ o; y8 a+ j4 W9 x/ c*/
7 p1 ^* ]. g! m2 ^, Flong get_ram_size(long *base, long maxsize)
) j  Y0 G0 q; v! A" K{" {$ _2 S$ \4 [% a7 I
        volatile long *addr;
8 B  K- L8 y" U% S/ P        long           save[32];* o+ Z% f- N/ r1 R+ H% @  q
        long           cnt;! b& E% J- V; n7 e
        long           val;7 Y1 i" g0 ]: C0 o- k/ P7 S
        long           size;& c  |; B% W) v7 j: O- p
        int            i = 0;: J6 E! w2 b9 Q2 m2 R
  l/ m8 ^& a( K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 K* E$ r8 P% [7 N* C( f* Z' ?
                addr = base + cnt;        /* pointer arith! */) M3 }) Q% P- X$ X6 I
                sync ();
& P$ c% Z6 \* Q; }, l( x0 i# B                save[i++] = *addr;5 z* b% o6 S. `5 x/ z4 p( }9 F
                sync ();' Y% I$ J  q* k  U3 e% Y( Y7 ~6 H; x
                *addr = ~cnt;" b: W8 n1 R1 N
        }
; _+ r  r( h5 ^; r/ D1 W9 [
! ~3 n" b0 ?. X' o& C% q# Y' D        addr = base;
+ X  \2 m$ {6 ?* e' Y, u        sync ();
9 d: E5 i' o4 ^/ x# q        save = *addr;
( P' G/ Z8 V; k  b        sync ();
# `) F! p2 I5 A7 J5 l        *addr = 0;5 H2 C$ i) `' z4 G- P
% F% H# T4 X+ T8 ]' m
        sync ();4 W0 [" i' h- j/ N- o5 O% K" w
        if ((val = *addr) != 0) {% _9 v' K9 Z3 F1 \* t- f
                /* Restore the original data before leaving the function.
( Z# T4 T4 O' }- N- J9 W                 */
3 A8 w- a- r8 w7 f) e* L                sync ();/ i- O2 ?7 ?2 c# w0 R. H- t
                *addr = save;* M- L: f: N2 S
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 I, y* Q2 h. n$ v                        addr  = base + cnt;
- u" N( G5 S, t( K% t& _7 k                        sync ();
2 L5 j  u$ i, }* S$ I! x                        *addr = save[--i];
( E" a0 T6 H* o- Q                }. {- {) [: J. ~7 a3 a
                return (0);
  }: Q% i* H; I  F7 i( V0 O  w        }) t( P; ?' @8 {: W. z( w* R5 q

5 i! @9 m0 g2 }0 L7 k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& }8 p: ^& ]  c% q& _                addr = base + cnt;        /* pointer arith! */3 X/ q  f; Q  Y$ a, N
                val = *addr;( q' Y$ T6 |5 \7 O
                *addr = save[--i];
+ d2 s, H" _3 f' A! U                if (val != ~cnt) {
' g: H$ V' K& j  t( `5 @                        size = cnt * sizeof (long);9 U* r5 j: ~$ S% W: n1 r
                        /* Restore the original data before leaving the function.
2 p. g. F& t& E- w" K                         */
$ a5 T) g/ e( P) \/ K5 K) |                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 f6 b# Y8 \! k/ Q% W4 s1 d
                                addr  = base + cnt;
' Q  L# Z# ~6 t- X* ^+ F& j                                *addr = save[--i];; Y" t. A$ W& u! z/ Y$ b5 x0 p7 p$ \
                        }( j7 r- x' g) |% ?
                        return (size);, ^' O) n8 _( p6 g) e6 {0 D7 y
                }6 n6 O: f* E7 R& g
        }; G+ T- j% K6 ~- r4 G
# r4 D/ v/ `* @2 T$ P6 f
        return (maxsize);
9 l# o2 o. `# O3 E}  C6 @' V) v8 V" G, D8 G
int dram_init(void)
! Y  X& s! y! g3 j2 @! b{* U+ b. P5 [+ e( G6 i
        /* dram_init must store complete ramsize in gd->ram_size */( u6 X& w$ B9 U$ m7 a
        gd->ram_size = get_ram_size(
2 S4 Y# O% h6 j9 p  r6 W" O1 Q                        (void *)CONFIG_SYS_SDRAM_BASE,$ Q8 A7 `1 v; E# I
                        CONFIG_MAX_RAM_BANK_SIZE);
+ `6 I5 u! c: X+ f        return 0;5 \! S4 G+ \0 P6 W: B
}) W4 M5 p/ `7 h% L- k0 O5 u0 ?/ Q
' P& P: W1 T/ L7 H9 f

9 z7 K0 r2 |$ _( s! p* m( @; w7 P' K
: u, d+ I$ c4 j0 d) e; i" \$ m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( B7 [0 l/ l2 I0 w& g! b! g
7 \& E; G$ P1 ~+ Q7 f! _5 b. X/ K0 W5 D- {

' c$ H% \: v3 n- X# q4 }( d




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