嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 T' S& s+ f9 `2 g( f8 h/ @3 I
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) w0 K. S1 t% O; V* k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: M1 R  ^0 X0 ~2 _9 ^- j

! P' B; [: x  b, h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( L+ x7 X, E; S

. |1 {4 z* T8 b5 i5 P( ]- S' F
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 E' H  f/ V! l9 X! u& k! ~
/*: g; _: h* e. @7 A- W" l$ Y- V
* Check memory range for valid RAM. A simple memory test determines% M0 f: F9 g5 V$ S- P" E* @
* the actually available RAM size between addresses `base' and
# }5 x7 @' r4 ?$ X* `base + maxsize'.
2 f: u  t4 z) Y8 _. u9 l1 O. P*/1 a0 D, c0 r8 q$ |) D2 v/ R
long get_ram_size(long *base, long maxsize)
& n& U; B8 p2 n3 x; g6 ^{+ Z0 j  a7 k& p
        volatile long *addr;2 @! S# f( V* m7 I" r
        long           save[32];
. t$ L# ]$ N/ V  ?$ ~4 @9 J        long           cnt;
# W% c+ {2 l  x4 T. G# b1 `! w        long           val;
0 p& M: d5 j3 w3 W! f3 p: E7 u        long           size;4 w# d; n/ X$ o- z
        int            i = 0;
$ A  M9 y4 }$ M9 v" q9 i
8 X* M$ _4 x! i% @$ I! S        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; D) f% H9 o* N  D, E                addr = base + cnt;        /* pointer arith! */
! A4 i$ f  V( }                sync ();" T  x4 R4 I; [
                save[i++] = *addr;
0 g! ?; A4 ~$ k) s# X7 [' L% D                sync ();
3 V$ y* k+ X3 k/ L1 a                *addr = ~cnt;
3 {6 t$ I& j5 l1 h; ?7 a+ x1 \        }
' s" r: \. w4 r. B5 U; T1 H) `; X- M; j( T0 g# ]* d4 n
        addr = base;5 N$ ~6 j+ w! \9 Y2 D
        sync ();
2 Z- v" @7 V+ _  R$ [        save = *addr;; y  V( C9 h! F
        sync ();
4 l9 O/ @& k* S        *addr = 0;* l% U0 w. W8 F: B* e+ w( W. H

+ t% q6 W( F5 U5 G        sync ();6 U, e/ c. w0 R! T. H) n
        if ((val = *addr) != 0) {* f1 z* q$ k% V, e3 L3 n9 W
                /* Restore the original data before leaving the function.
, y9 o# V2 M* C9 w                 */* Q$ }) @- d7 k. v
                sync ();
# @; B1 s: g; q( J( e7 Z( Y/ G: G                *addr = save;
: o; y5 l" b6 n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 b, m0 D- I8 ]3 {1 T/ `$ ~9 N$ g
                        addr  = base + cnt;
/ n" t# O! t1 u0 {6 w                        sync ();, }2 @- j: m0 o, |  U* W* }; p
                        *addr = save[--i];
9 y% W8 _* x' @) f( M                }
9 ~0 F6 B4 S1 A; g0 `; B                return (0);, v: O6 M7 B3 E6 b% q
        }
8 [. P* ]1 b1 _3 s
) ]& d3 F, P; c9 u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 m. O& Y0 h% N* J& @                addr = base + cnt;        /* pointer arith! */
5 K: }5 L% }5 [# u+ u                val = *addr;6 R/ J% m6 I$ _: L1 a% l. q9 R3 O% ^
                *addr = save[--i];
9 {7 }6 Y! p2 ~1 r) z' r                if (val != ~cnt) {+ S1 F. t7 O/ S0 A0 G/ a
                        size = cnt * sizeof (long);  T0 l; D9 V* o" l$ V) Z
                        /* Restore the original data before leaving the function.4 T0 C) g5 Y$ q1 J3 _& }" A
                         */% k+ e/ S( n) O+ }8 X" o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( k" F. ^7 M# C! E, I3 R# E                                addr  = base + cnt;) T$ T9 H( M# \9 Z7 ~
                                *addr = save[--i];
3 g+ N7 B( V# v# @$ K                        }
# r0 E* }- G; h' [& ~& G. M                        return (size);, B; F# x+ o) h& X& j' S
                }- f5 @  z0 x  ?* B
        }
/ h. e( T9 Z+ n0 y) ?2 F4 ~: H7 s1 h
        return (maxsize);$ u, l- D: C2 y( H
}1 S" R6 j3 h4 o! D( Q1 J8 z
int dram_init(void)
8 r: }! R( g6 q  J- V{
. Z+ }: ~* g. M        /* dram_init must store complete ramsize in gd->ram_size */
! R# `2 [! }4 u" S5 l0 k8 g% o+ b) v" p        gd->ram_size = get_ram_size(* g. x- [5 J# h% y+ G
                        (void *)CONFIG_SYS_SDRAM_BASE,
( G- E7 m/ D, W+ S                        CONFIG_MAX_RAM_BANK_SIZE);
1 C. y- A: ?4 u. B! W" H- D        return 0;
$ P) E7 n7 S0 u}. e0 B$ S( a, j* }% D: Z
7 f, A8 D$ }( y- F

' v9 E8 L) E$ D/ L, y' W1 Q& C
9 w7 _4 I5 D' Z6 E3 Q# F( O& i6 k
4 @' q, U% U7 D' c# A/ ^8 RFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ ~& L2 n& o) c* }& N( f0 o# |4 {

% ~. f) G" }, s# F2 D7 y4 s, E4 F9 C$ s& I7 F
  }$ ~  a, e# I6 x& z





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