嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 B0 K8 _4 ^8 @1 K2 i4 C7 _核心板2:DDR2 256M Byte   NAND FLASH 8G bit, B. d/ z( _5 F! _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; m# W! T8 `% ~% K$ J: I% w; X& Y7 L& {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 j' g- P( O* n* w

$ o' x* F9 Q# q* A( R0 i3 d
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 i) [3 ]# Z3 I% q7 w$ {
/*1 P! x; r6 F5 @! U/ ~! p4 M4 D
* Check memory range for valid RAM. A simple memory test determines8 u. Y* d$ ?9 V% m: V
* the actually available RAM size between addresses `base' and
5 F; u2 A( ~0 \: ]4 e( `) x) @4 |2 f- V* `base + maxsize'.
8 _7 p2 Q$ ?  m: Z4 r! Y7 ]*/
# S! B" Y/ W" O% Q) d4 \/ Q3 along get_ram_size(long *base, long maxsize)' r! O- e; \' o- k! ?
{1 R. _' s) t3 _: R
        volatile long *addr;
/ v* M& u  z' y" t/ \  X8 D/ K* W        long           save[32];
$ }* y! v( W' J3 v        long           cnt;
3 a+ O4 f& s( \; O) e% R1 O# ?( m- N+ u        long           val;
/ a+ X( [( h% A+ V1 J, ]$ F5 [* \& W        long           size;
! ^$ }. z7 j$ F        int            i = 0;$ b9 L1 n+ e9 {" z% l. H
5 H; p8 W( u' Z( i" d: |: M
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 @, n. d# H; L6 r0 m; Z
                addr = base + cnt;        /* pointer arith! */
0 f+ f$ }+ M- c9 z                sync ();
( M/ Q+ T4 m7 `: z                save[i++] = *addr;5 ]* X  d. N. v# t& ]9 H4 T- }# D
                sync ();
4 |9 t+ j; y% S5 W' r: L0 S                *addr = ~cnt;
. ?9 f- U+ p2 B( e% Y; R( Q2 \        }
8 E6 Q+ U, j) g
+ C+ b3 b* s' w& t1 M8 p$ N5 o        addr = base;6 {: j/ H: O7 ]; B$ x
        sync ();0 O+ b3 b9 m& {6 w
        save = *addr;
- J% ?# p' E! |$ L. T/ m6 \0 W        sync ();& @/ B, q1 j. z  u
        *addr = 0;
) a* V; z$ L/ M' @: y
$ t9 q' Z* f4 |3 m3 |7 ~8 W, m$ w        sync ();/ S7 t, ?- n: k7 h3 U% L! J
        if ((val = *addr) != 0) {
0 d6 L+ B/ D' J2 S% v* |                /* Restore the original data before leaving the function.. c! G* w7 e! H3 T3 g
                 */
4 N- p: L6 l8 @& m2 ^                sync ();: L/ D, ]! e& t3 {3 V4 S
                *addr = save;0 d' W0 d5 i2 U+ s! j
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ n8 J8 @& E2 J" g* m2 R! ]5 |# |
                        addr  = base + cnt;
$ v6 b; Y( ]$ f1 Z1 E                        sync ();$ F, W! V7 _  l$ t& a0 r8 c  ~6 k; b
                        *addr = save[--i];
0 N: @6 d. _. P- C; I                }$ a$ g$ }7 s2 }: p! U4 j0 b
                return (0);
! n% ~: p9 ]$ O* \) X3 b4 O2 y        }
- {4 ]- h0 `$ I7 b  t" H. d+ `/ g/ J: w) z8 w4 U' S+ t
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: L/ A  Q0 |8 ?0 W/ N) i( [5 O
                addr = base + cnt;        /* pointer arith! */( T8 e, q9 F7 T3 r; |
                val = *addr;
, d5 a+ u! Z  W) r                *addr = save[--i];
4 _+ o! P1 [7 I1 o                if (val != ~cnt) {
, E' R! }$ ^% \1 ^                        size = cnt * sizeof (long);$ r) _/ B( _1 x% i& [' Y
                        /* Restore the original data before leaving the function.+ d0 d+ I: Y( O+ |
                         */* ?- ~; b+ ]0 W, d( s! W, {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 Q! j3 z7 k0 q! G                                addr  = base + cnt;  r7 r& p) Z$ \3 q& C* ~
                                *addr = save[--i];
2 B  G2 C; j, f5 i! Y                        }
- {8 x) @% X& m! H( A; B! p* X                        return (size);
" h6 m  L& N9 t3 b9 [5 b                }
& n& ]3 z" x6 p0 i0 k        }
: `" T; T, }& U4 F
  x1 d8 D4 T2 a, H' C6 f        return (maxsize);
# d; X1 Z! D1 d}
' T) B/ T" }+ ?  _# L  Fint dram_init(void)
0 s- v. |( M8 |7 `. u) }{
8 b( w/ V" i6 o* N- s% J4 E        /* dram_init must store complete ramsize in gd->ram_size */% D; S4 o5 b2 \7 B" C
        gd->ram_size = get_ram_size(, K) o) Y8 Z5 P( I+ E- n
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ z& P8 p$ t+ z6 E4 P' o                        CONFIG_MAX_RAM_BANK_SIZE);
" }; Z1 i" A  Y        return 0;  [4 X$ L2 R3 X3 @
}' f) J, H3 _: S
+ |' J; ~4 c. E6 `. {

6 N; R& S0 Q0 k- r
9 Z+ {/ O) h. s. V2 X7 G0 P
- P7 E2 Q, t0 S0 E) A  G0 A7 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; H/ D# I: e. s' s4 L) E1 ^% v: G9 m7 O5 S7 m. x
% @* m; }, x1 l% [" @4 G, T. V3 \' Q
6 Q' m; _/ s! }8 w





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