嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. y0 O+ C9 g4 P! @% ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ w) P: V" D6 a' L, _+ Y" g这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" g$ j6 L, M! k9 u" {9 d2 t% E
( E/ l# I' Q- N, R是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 X' Q  T7 S4 E' F# B4 l
8 w! y& N  l6 ^: i. N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ l) u# T. Y6 P/ `5 f/*+ x" F0 v! F# Z9 A, {) c5 B
* Check memory range for valid RAM. A simple memory test determines0 d5 Z6 {1 m; D: c' s. n  h
* the actually available RAM size between addresses `base' and/ K" n& Y' U: a4 s- Y) ^
* `base + maxsize'.
, W. y+ Y; W. ^; j, r; G*/
4 G4 [( G6 n$ f! S4 Y1 ^$ B1 D- c: Qlong get_ram_size(long *base, long maxsize)
5 w4 h' Z+ D/ S# f2 S{
7 b9 I2 T2 ^' }& V+ Z1 V        volatile long *addr;, M$ W5 ]& j$ A( m: p2 }
        long           save[32];
( l8 C; ~8 W! p2 N: |4 t8 I        long           cnt;/ \3 F2 U. g7 I- y3 Y& X# n
        long           val;$ d+ S, n0 ^5 [+ f8 z  h  G
        long           size;* x; m) f: s1 z% u6 P
        int            i = 0;( E. z5 {/ ]" T7 E3 F  Y

8 V, k- }7 t# C& f% x2 ?+ E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ ?- P: ^- Q/ K6 R, c& |                addr = base + cnt;        /* pointer arith! */( t& d6 N4 a% O* x% e
                sync ();
; y5 F" ~6 O: q; |# b                save[i++] = *addr;  I+ z3 i  U8 A& j% A6 b
                sync ();
! p! e; O, z2 D1 t& N                *addr = ~cnt;: Y+ K- s4 s9 ^6 X( R9 I. a
        }3 i) j, l* h& E/ G& [$ b: X

$ z: k) o& C# k7 Q6 e        addr = base;4 q6 e/ Z9 H1 {; i5 {) P
        sync ();6 t! h& i4 d+ o
        save = *addr;
5 ?8 _# y& O: j! W+ k        sync ();
4 j# @4 `* u3 T5 Z% Y' Q        *addr = 0;
/ f: q' }3 f; v( |2 h$ _& Z7 R, q: T3 l
        sync ();( f& C: h- ~6 m1 y4 [4 i# A" E8 r
        if ((val = *addr) != 0) {% |0 a* O! \  {* t4 {( r( C% o  `
                /* Restore the original data before leaving the function.
! o5 ]0 V% m) y, Z- O$ {                 */2 d% w0 N& A! j6 j. a; P
                sync ();
, L- a" M7 \) P0 o5 |( V: G0 ~' r                *addr = save;! _! f' Y4 G$ f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 r2 N* Y6 s/ T
                        addr  = base + cnt;" |7 i9 b: P; q
                        sync ();1 a+ }; X6 @/ g
                        *addr = save[--i];
( A& G0 l* X9 j0 U( x7 Y                }# f* L$ L/ r6 a# Z7 l& o
                return (0);" E/ ]( d8 t: D' O) M
        }  q! z, F) G9 g' r8 R# N
9 \. n. q8 n& W  }" u! x/ ^2 X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- `# c6 C* W5 @: M( m. C                addr = base + cnt;        /* pointer arith! */8 b7 c# ~  F, K, N! g
                val = *addr;) b' S4 e: W* y0 `1 _4 n( s
                *addr = save[--i];
# x+ w* A: r, i, W7 u* h6 ~% y                if (val != ~cnt) {  V' v. L- Q3 D( N0 W4 r; g
                        size = cnt * sizeof (long);! ?1 b( P) Q1 {  E& b/ {
                        /* Restore the original data before leaving the function.  {  R1 ]7 s9 T5 t& H8 R) X9 i- @4 i
                         */
7 W( p/ T; O0 k% S4 V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* |) v4 x& v' J" }7 c                                addr  = base + cnt;
- O2 ~; x& r# ?4 K+ F3 R& t/ N                                *addr = save[--i];3 L6 U* `$ o. l1 N2 J% `& l
                        }$ x+ v! `7 {# L& o/ `" U& p
                        return (size);4 H+ i% F0 A' U" g- _9 m
                }
1 P/ q2 o) ?% A        }
: m- r6 ]7 V: w) I: P) V# p/ R1 v. ]
        return (maxsize);
4 C# n4 }, m9 d}+ z2 ~+ `- }% p* b& ~
int dram_init(void)0 y0 Y; c4 G+ z6 k! E
{* V; f+ E- F5 I
        /* dram_init must store complete ramsize in gd->ram_size */
5 }- r( W9 X8 P6 w6 a3 S        gd->ram_size = get_ram_size(
. Q2 V) k6 W, j                        (void *)CONFIG_SYS_SDRAM_BASE,
1 ]; U  O, g0 S                        CONFIG_MAX_RAM_BANK_SIZE);
0 {( Q/ m* S* @6 C& q- B9 Q        return 0;. J  d% d. L/ v9 U& Z
}
6 h# @5 }) E+ B8 o0 t# H& o$ w+ j1 Y) E; T$ Y9 z
7 v" ~0 k1 I8 A2 B) d8 P& y$ t

4 t2 L* Q' ]+ T$ x" r
# g. ]* \4 a  a) y2 R5 X' UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, R# c: W% N1 T" }) ^

( M8 U' d  ?0 _2 }5 J) e& r
5 Q5 ^8 U& ], }, }
# m! E8 u: E/ i; z( e2 M+ k* b* i) J





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