嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 h: t& n. e6 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 C" ^" L5 M+ t* {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ j) i. y1 ?' v4 Q
. k( C# w7 z" c. v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* j/ {' e8 Z! W. B: F9 J
$ ^  M2 J  [" d4 Y' f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ j( t, n: j) D8 D9 q& S& J
/*+ I3 x- F9 M/ T# ?; q  t  z
* Check memory range for valid RAM. A simple memory test determines
, U: A3 \6 I" e: G$ }& X7 v3 J* the actually available RAM size between addresses `base' and
6 D4 h1 a# n. k" B1 f  \* `base + maxsize'.
0 V# v/ C& Z% ^6 \% I*/8 g0 n& a1 Z5 M6 k/ }7 |
long get_ram_size(long *base, long maxsize)
( R6 t( P* E! B/ j1 @* K" N{) y& S! n7 j3 _' I/ q' a6 E& ~+ B3 u
        volatile long *addr;
5 K: ]- ?! p$ U        long           save[32];
  V& Z; B1 L5 Z0 i- J; N0 k6 H% ~        long           cnt;
2 l0 G3 |7 p5 l1 q1 [. r( U        long           val;
) h# u; J! q8 u' U" V5 F! ]        long           size;$ A) S# `  q" V' A' _1 G. R
        int            i = 0;
: I- t. V; \, j, F" |1 b% a8 A- w9 W" @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 f+ z4 Y  q, u9 S4 N+ \
                addr = base + cnt;        /* pointer arith! */) h% F) t/ {( i$ `
                sync ();- O5 h% o+ q! Q' ?# A3 P
                save[i++] = *addr;2 F' B: B' h! J! v$ w& }
                sync ();
& s$ G6 A7 L; H1 ^# J2 }- b                *addr = ~cnt;' `. D+ p* p+ N. f
        }  P4 M* @2 m& j& W+ P

' @* ]2 E/ \9 _# N9 c  ~6 E        addr = base;
1 o; A, @, R* F$ j" B; Q        sync ();+ b5 m( A+ K  N" b/ O
        save = *addr;) G$ u3 @' N- q
        sync ();
4 O/ s, ?* K* x+ x" N        *addr = 0;2 \# S1 G) n& b. `' g: y6 e9 a
! |2 m3 g% ~& Z, F1 _/ Z
        sync ();. g$ O- b4 R% V" n- ^3 k
        if ((val = *addr) != 0) {
) C4 K& j6 M, l: f$ m8 L                /* Restore the original data before leaving the function.
' f+ S- R  Z8 r- l8 P$ }# M+ O2 g                 */
+ }7 A: r5 M5 d                sync ();
1 e( q% V! Q0 I7 t, v' r  e# e                *addr = save;" x+ v' f( l" J; r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ m' t* J- A( O, Q8 |; o  b                        addr  = base + cnt;
0 w9 r, }/ _7 l8 C                        sync ();( T* E# R& F7 [$ a, a
                        *addr = save[--i];
( E- S5 e2 K% k! S9 ^  @0 w                }1 y2 Z9 v1 b9 u# {9 ]; ?; \
                return (0);! P8 m& d/ e* M, l! O- W
        }) E0 w/ [+ M2 }1 o+ _7 l

1 s& q) ]/ D. B3 u9 z8 i' L        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ C: L# v# f) p5 ~4 {! x9 |
                addr = base + cnt;        /* pointer arith! */
$ X1 U$ S" W" `; d9 d                val = *addr;. ^- C# c# C+ }# `
                *addr = save[--i];
- A3 B0 ~, a! A: S9 ^( J' `2 S& |. j                if (val != ~cnt) {
5 Z- g  g$ v2 r" m! a$ }) A                        size = cnt * sizeof (long);
5 j7 X2 p( W2 I! |4 h' j8 M: D                        /* Restore the original data before leaving the function.
/ M4 x0 l' c& n) q2 L- t+ ~8 u                         */
% M1 b2 `) x" h$ q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 E& @: M! t9 N, a1 k9 q                                addr  = base + cnt;
1 V6 t5 X* r/ m9 W3 B                                *addr = save[--i];/ l) m) K' Q6 M6 k
                        }
! ^; I! d* o+ M! ~& w1 n  y                        return (size);
4 Q  E- A4 r' N7 c2 i                }, a- N! I. E9 e4 F' {% W) x
        }/ k( y" m7 X$ F* @0 i6 d

+ S0 G0 K6 U8 o: g4 t' b        return (maxsize);. M4 l5 ^5 K8 f& [5 u" N
}
: |) e/ p  W+ X0 z' e% e  l- R: Yint dram_init(void)! ]8 _! g  }1 ]" {! }# n% M
{
( Z# Z% K4 `' b: Z, ~% J        /* dram_init must store complete ramsize in gd->ram_size */
! C1 U6 e1 p7 I        gd->ram_size = get_ram_size(
4 T; ^' g; G! x# W0 n+ s* H, t6 F                        (void *)CONFIG_SYS_SDRAM_BASE,: W  H- e- _7 u0 R
                        CONFIG_MAX_RAM_BANK_SIZE);$ g, {3 n' Z! C% |/ j1 R
        return 0;% @* k$ m" O+ R8 x/ @- K; @+ N
}0 `: ]7 M7 ]; N# N2 a9 A# S
/ h5 [$ X0 x) a+ ~

& d( A4 w. Z; d8 I& Z! c+ U" X; u( q4 `0 z. F6 \$ e
5 ^4 U+ C' ]+ i% A' f- \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  y0 n) K4 C+ e  y: M

% ]0 S7 x" {3 M& W' G8 J
' b! ~, ?+ u9 M) {* W. B) t" f" R6 W

( O* @+ ?6 G  Z* J& G




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