嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  l. D( `/ ]7 `- ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit; m" w6 l, c7 R8 w. ]$ f, c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' c0 ?8 r( e6 s" H  F

8 s# [& _  H& q: A  b! [; y9 u5 C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. R; M4 ^& o( x  v$ \* W, @9 k, a" e

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! A2 g  ?2 s9 }+ ~6 }4 G
/*7 H/ H( o! Z6 [. K3 F% w
* Check memory range for valid RAM. A simple memory test determines
) z" |( C$ s4 C: Q+ @( @2 C, \* the actually available RAM size between addresses `base' and7 v7 K" Z5 \$ G  s8 O
* `base + maxsize'.7 o' @8 B/ r' b" E8 m+ s/ f
*/
  u0 `# p; b# X& M: ^" d  B: Ylong get_ram_size(long *base, long maxsize)
) {8 ?2 e: p0 }$ w$ }{; l5 H2 r: o( c. I# t
        volatile long *addr;( m, W! ~& x0 {: p$ j2 t
        long           save[32];
2 A/ J! `; v7 b! K" c5 v" V        long           cnt;
4 @5 q' x+ g1 w, L9 Y% U( Q7 i! L5 b        long           val;
+ O8 Z& h$ r( h        long           size;" Z% I1 R6 h8 s- U
        int            i = 0;
+ {9 {' i( v/ T! y( `/ S  G, O8 j: z& k6 ^9 z0 ]  c
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. P0 q; \; u3 x, }* k. h
                addr = base + cnt;        /* pointer arith! */
8 a. Z: Y  j5 q( Y7 C6 e5 X4 k/ H; w9 Y                sync ();' ~, y. I, _$ y4 F+ r# e
                save[i++] = *addr;/ b1 Y9 {" M, `- Q1 v
                sync ();
7 Y, S' ~' \. I# e                *addr = ~cnt;
; _0 w- N4 a7 E        }
% S$ F; |/ G8 N$ \0 B& x' x, m; @$ R; {8 k% Q
        addr = base;
1 P6 i7 U- U  E' v! C) I* p7 b# n        sync ();
! g' \8 T6 D5 w; J        save = *addr;
. K/ z6 \5 }- W3 p6 P        sync ();( ?" }+ e+ l& l! M
        *addr = 0;
4 F2 f0 @- i* _) F, Q, p" i5 R/ l7 E- ~" R* }& A
        sync ();9 R+ o* u  G& y! P; A# ^
        if ((val = *addr) != 0) {8 M, A4 j: g- y; C) K+ Y
                /* Restore the original data before leaving the function." X$ e& ?: z4 W& m- ?& S4 V# f6 F
                 */
( G6 j' D, ^- M                sync ();% I" ~" j. T4 F. J
                *addr = save;# T0 J2 l# Q; N1 }! ?  A* ]. K" a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% ^8 f. u- y+ S7 q( _# m5 A                        addr  = base + cnt;3 @; j) f/ G1 m( X5 f$ b* B
                        sync ();
# z" m+ f* e* G' k1 @$ V  p1 w* M6 k  B                        *addr = save[--i];8 u, R, \( u3 W$ J: T4 v' l
                }# t4 }6 x7 b) P1 \6 k0 `
                return (0);
. x7 h$ X; t" o# H        }
! i7 \9 X' n% U
* h/ W7 ^' g$ v. b3 N# p) k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ R9 [# c& u2 a* R! M4 x. |
                addr = base + cnt;        /* pointer arith! */
* E# H4 S5 _" n' @! O" D- s) m& d                val = *addr;4 |( J" D9 E9 W; c9 f; W
                *addr = save[--i];
9 c5 K6 _6 U) _7 x. S                if (val != ~cnt) {
4 o6 j  E* ]1 f% p                        size = cnt * sizeof (long);7 _- L% D; n1 c: ~
                        /* Restore the original data before leaving the function.
1 N& W4 e0 _. t; `9 V                         */  W2 P2 n1 h4 o9 c9 \3 w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 _2 S7 G5 A. v; l5 F# f
                                addr  = base + cnt;7 x" B# Y" \! }* c( N4 L0 V/ e' _
                                *addr = save[--i];
. o! u7 Q$ x3 F& A                        }
& }7 N2 v  }6 L8 [, Y1 M6 w                        return (size);1 H* z. h# g$ P" A! f' v/ E
                }3 H# w" o4 `! F2 H
        }6 A7 i7 r  l  h- P% q& y$ J# w0 ^

2 I8 m* D  u6 D( V        return (maxsize);9 m' j) s) I, h: P
}
# [* r: O' _- a) a3 c: \int dram_init(void)
% `8 p& \* k: e9 o5 e2 C{
, n& l% M  Y- g& t3 ?        /* dram_init must store complete ramsize in gd->ram_size */8 t# g4 A* A% c6 r, z
        gd->ram_size = get_ram_size(4 a  _3 n$ b: v" b+ ?  _
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 L  X8 O5 l4 R1 ~                        CONFIG_MAX_RAM_BANK_SIZE);
+ p' v! z' q9 ?% B8 W7 W  ^# \        return 0;) K) U9 D. i9 k1 I
}
, D$ g% c1 ]0 r0 T4 f( T; b$ G+ ~& g# z
9 Q, U4 q6 H: Y0 A$ J5 F
# [6 r0 k5 H. h: H
3 D3 I  n3 J& ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. k; D$ ~; a$ i. ^
% ^  l/ f' Y; T8 a
% x6 C$ x1 ~' t) _+ G

4 R( `% ]* E0 B8 \( s




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