嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" z* t  r, a; K7 I) }$ i2 H( ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 o. P& x! a5 \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: F' c$ t- s# T0 ~) l7 L

- Y( z1 Z! q% B3 U是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 y$ t( j( F. U0 q- A4 w
$ V3 s6 T; j4 q) W" K1 e% L& }

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 G& d1 y9 ^% u# j0 n* v5 t8 N
/*& p, K* ?* |- f9 A# F7 y3 v
* Check memory range for valid RAM. A simple memory test determines8 Q- J' e0 j: c* p9 [
* the actually available RAM size between addresses `base' and
! A$ ~  B/ u3 e8 W: y, H5 e/ ~& O* `base + maxsize'.
5 `/ C2 ]4 m2 \( g*/
- a- }2 _" i+ g& K! F; c$ R7 Klong get_ram_size(long *base, long maxsize)7 \+ @) c% o( h; N$ @6 g
{' f& V" k6 |7 Q$ G7 ?
        volatile long *addr;' v7 d1 \" i. U
        long           save[32];
) |4 A. Q: T" D" l        long           cnt;
, T- i, g& P& ~* |& P4 ~+ E        long           val;
) H. r* Y! V) Y3 a* o. w, j. Z        long           size;; O! \' K+ P1 I+ A
        int            i = 0;
! i8 _  {$ p; H& Z. P6 W, _1 t
$ I7 f' G$ P& ]  @4 p; r* J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: Q& P0 I, x0 U7 ]7 E7 V9 f& y; ?6 ?
                addr = base + cnt;        /* pointer arith! */
# L6 ?1 ?  d# R3 \7 V4 A  M7 m                sync ();, t! I( W$ `' Q/ d1 S
                save[i++] = *addr;0 R- i( ]' Y; }
                sync ();0 c6 A8 R% Y1 r6 n
                *addr = ~cnt;
: y" B( Q- a2 w/ x        }
. c1 s4 H! \$ R  U" |* ^3 l- Q; ?  A4 C: W1 c9 \* e( L6 i( o* E
        addr = base;' F1 c8 @0 W  G" g& n
        sync ();4 l- H$ ~  d7 M+ @
        save = *addr;3 W7 C2 M# I7 v" ~5 Z
        sync ();7 _4 }3 @  t8 S2 s: E, f; }1 d
        *addr = 0;8 e; X5 o" g/ w
8 U; @' K- p) [' s, k! v& U
        sync ();
1 v8 Z$ e$ T+ `) ]% z        if ((val = *addr) != 0) {
& D) f* _$ V( E# j5 U5 Q                /* Restore the original data before leaving the function.# [' N6 o# v4 H/ d2 v' o
                 */
3 T6 d/ k( i$ N( Y                sync ();
: _7 O+ {+ u7 B- g( {0 p( |, j0 a- ]                *addr = save;) b! V6 z( d9 j
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 j' H1 @9 f; b/ s; a* V$ F                        addr  = base + cnt;
( Q; L# \9 p1 e' |9 O/ u5 C                        sync ();5 N( N- s; h: K3 g1 h
                        *addr = save[--i];8 N) d2 p+ a) ^0 t
                }8 s6 `* {6 h1 W( m2 `  H+ w
                return (0);: ?$ w$ {+ b8 ?3 J; T: O
        }6 ~' E, m- O$ i7 F$ ?

% Z) I$ H+ @" ^$ J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 x9 ]( }1 s; L! p
                addr = base + cnt;        /* pointer arith! */
* [+ ~) s9 y: }% }" _                val = *addr;* K0 T, l6 I, F6 g6 V% N  o
                *addr = save[--i];
: ]0 K+ ]3 \/ {3 \) i                if (val != ~cnt) {) I- E$ `7 p$ O/ ^, @6 j
                        size = cnt * sizeof (long);( Y' m. S' E' @  g1 L7 |( U; S* v6 t% R6 m
                        /* Restore the original data before leaving the function.
( C; C7 h; r3 U! z/ P: d, Z2 r+ [                         */3 m8 ?0 R% Y8 p, B
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 [) P; g9 I; @, r                                addr  = base + cnt;/ w* W: A0 H% {- z& D  G% z  }0 A
                                *addr = save[--i];
) @+ }9 s6 Z  d+ C0 `1 w. B/ V" a                        }+ Q" \" T& N* Y3 x) \& d5 D
                        return (size);
* S5 Y8 ]+ H+ P2 g; }; Q                }1 r7 ^9 O3 ?5 K. Q5 S
        }. ]- m" T/ {' E$ l5 s
, r8 R6 A! X2 w* q: B
        return (maxsize);# |. L6 f3 b/ H  D' {! E) G
}" H" j: \  n. w9 g" r6 B" E
int dram_init(void)  M  h6 v4 P3 g
{
2 Y) y) }' @4 Y! c2 b        /* dram_init must store complete ramsize in gd->ram_size */3 v; @& b9 o- z8 G! f* H
        gd->ram_size = get_ram_size(  Q5 A! E  h! o, c
                        (void *)CONFIG_SYS_SDRAM_BASE,. w9 M- S7 I; _+ _* [
                        CONFIG_MAX_RAM_BANK_SIZE);( N" X7 x! Y5 a6 [: C6 E0 i! ]8 S
        return 0;3 ]. c) R+ b1 U5 x' _! P2 {
}% F1 Q4 c: t' H# K  q

2 x3 o, d1 P1 g6 \1 p5 A' |
& ?# y' m# S1 i: C) I+ d4 ?* z8 Y0 J. H1 B0 u
8 i2 w% v5 ^# D+ }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! w% r) G8 X% w9 i) x4 Q
6 A- O3 T1 a% U
" N  H7 f# ^' f# }( D6 a* D( X
4 g. q- Y( e; E





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