嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 j: h: Y0 u1 C# F9 r, ?1 m核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 s/ }1 n# t  q6 o" z5 \7 N4 ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) N1 F8 }# ~9 T+ @5 Y: T8 Z9 K, x+ z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 J4 J5 L* H; S% k6 R
2 |: L+ U; v, ?4 O, n* E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 j# U; E8 n+ t
/*
# x2 ^/ x" Z1 J# o9 P2 P" l; x9 [* Check memory range for valid RAM. A simple memory test determines
& f4 v' H7 h8 {- O6 p, b8 S* the actually available RAM size between addresses `base' and' N# V+ g9 ]# P  V- J( Y+ O
* `base + maxsize'.
( W* j7 l4 i; Z  F8 [1 d$ V*/
8 n7 Z2 r9 A: Q1 |long get_ram_size(long *base, long maxsize)
' `, f; ?% k( e2 H{" J' x7 z, s/ k& ]+ T, W1 Z
        volatile long *addr;
* }% r4 F& `7 ]0 f- z        long           save[32];: k2 P5 r( q( x% J+ _
        long           cnt;0 ^2 {9 c$ c) {1 P( R  h
        long           val;
0 R8 F2 h/ u( X& O6 a: u        long           size;
* j3 K, o" P! j7 M) D$ x        int            i = 0;
) n0 v6 P% }* _; s" _0 ]; X, e; N/ r; ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 \$ K3 k" C5 @% Q                addr = base + cnt;        /* pointer arith! */4 n$ I7 a) G1 U  g5 s
                sync ();5 c5 @) g3 m. A6 `2 J
                save[i++] = *addr;
1 x+ u; }" y# h                sync ();
( U( v+ L  `; }9 D                *addr = ~cnt;
. U' q6 C2 z+ U; q& H* N; h6 A9 [        }
. V- X- N( y9 A/ h$ u
) N9 I+ l; ]& q- {9 O1 N        addr = base;9 _$ N2 p5 U0 J& `+ |
        sync ();8 @& P- g; g/ C2 j/ i' V" |
        save = *addr;2 B  G/ Q5 v( }
        sync ();
; X) ]/ s# K1 t' y        *addr = 0;7 V, t& f9 i( `
6 N" W  N+ J2 [! g
        sync ();2 h1 R1 H! b* ]
        if ((val = *addr) != 0) {
2 K' u1 `, p0 q0 ^3 F% @: e                /* Restore the original data before leaving the function.7 m+ }. N0 H0 B& ?0 D) s
                 */9 k. ]# @3 r* \2 K% ?0 O0 F$ I
                sync ();
& f$ n$ L% b9 y/ N                *addr = save;
* r/ d2 l/ C1 G. r4 Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' ?9 j# _6 X& b* v% p; G                        addr  = base + cnt;; @/ n) e$ k* N' R3 v
                        sync ();
$ ~/ V. i+ X, Y8 K                        *addr = save[--i];" g8 u1 j! l8 ?# }$ c$ J, k# k* }2 O
                }
' O3 b7 M( }; S& `. D                return (0);
3 t) L: B; A1 [( n# G        }3 M6 a+ M3 H' L; W9 T
0 {' f" W% T4 Y, X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" d9 o8 \) o. J3 Y! I0 \/ ~$ G
                addr = base + cnt;        /* pointer arith! */
+ X4 f; l& ~+ j. `) p4 G% `                val = *addr;% f0 P4 E: p1 f- T. V
                *addr = save[--i];4 l  `: W1 n* `/ N. J; O1 c
                if (val != ~cnt) {7 o/ R, x  e" h9 z% H' p
                        size = cnt * sizeof (long);
4 A: ]0 ~/ j7 ]# c" q                        /* Restore the original data before leaving the function.! A0 Z4 w2 B# i1 X$ |+ \( q- ^
                         */
4 B+ a' u" t6 a9 v5 x                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" |0 f1 t6 r# H+ S; S$ F* Y                                addr  = base + cnt;! n' Z; a! h  o& |8 x5 w; J
                                *addr = save[--i];
! i" Y0 D; u6 [' _% D/ K1 ?; f                        }- L! h% W$ Z4 I  w0 Q# w% ?& t
                        return (size);
( s" @# e7 r  X0 @                }. W$ x0 u2 T$ ?2 R5 Q! G+ _
        }8 Q3 Y) N/ }1 b* x: d+ a' r

0 ~, ]: W& E* @4 a6 N$ N2 c2 a0 q        return (maxsize);
" V. U6 a6 y0 Z: ?}8 D1 A- j! ]6 }: d" k
int dram_init(void)
0 `+ I0 [3 g, R6 v# Y7 V{- {+ {! S# _! P  V
        /* dram_init must store complete ramsize in gd->ram_size */
* E" `; _4 y8 c: q6 _4 M1 w: n1 m        gd->ram_size = get_ram_size(- d- E# |6 [" [# X# S
                        (void *)CONFIG_SYS_SDRAM_BASE,
" W- ^: \. I+ H* H4 G$ e. |: s5 C% U4 n                        CONFIG_MAX_RAM_BANK_SIZE);
, y( D4 A* y. g' i! m/ L        return 0;' }  }& [, [7 _
}: y* R; B* }' ~8 [* t( G

, [! ?, W) I6 I: q4 Q: ]
- }& V+ g' N0 T( H# L% P6 [1 l& H: X' w* _

* f' K; \' e( E8 U% @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- g7 i8 D& j% x% }- ?3 a! y- v8 H
, E1 ?8 ]! f1 Q" }3 W, J
1 t2 d! |4 ]) J# R

2 _; k7 q- b9 u1 G/ Q




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