嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 W7 V. M2 B9 g. v% Z, s
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' H0 i: v& m* T. w6 k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ d- O" w# d1 i1 _0 u3 d- J, E9 \' J4 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 B$ X/ E' g4 j
- l) l2 ]9 G! n$ a* r( u
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:$ g% X! R( b; }) o+ M: N) B+ f
/*
/ R2 w' ?4 o/ W" t# v  t" p* Check memory range for valid RAM. A simple memory test determines, ~  }- ?4 q4 ~$ F+ D
* the actually available RAM size between addresses `base' and
( Q$ C4 D* H& c2 h5 k* `base + maxsize'.: ]( S$ k/ @9 R7 K6 G3 `) P3 J
*/4 a) S4 m; v; M; a) y
long get_ram_size(long *base, long maxsize)8 }. w9 G# V9 m" w% b! _
{
; V! x% r( s. M, j        volatile long *addr;: S7 h/ f9 d6 O; i# I
        long           save[32];6 ?' X9 |7 [: y& W8 f
        long           cnt;( V6 l9 ?& o8 i5 y  v. Y
        long           val;
. |) g5 `: t/ Y$ d& X        long           size;' m5 K+ E$ O8 D. i+ l7 a/ a
        int            i = 0;- u; {7 B) Y# E- X6 E+ Z9 B
" T# O. N+ x- ^0 q& L0 g" ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& z8 E' w( q6 W) {' q. f+ W                addr = base + cnt;        /* pointer arith! */
: v5 j% w( F/ m, F                sync ();
2 Y" W8 @. g1 R- c  O" S                save[i++] = *addr;4 j  }; j7 M, I8 P) L
                sync ();
: h5 D# E- Q2 Y# m% `9 H                *addr = ~cnt;) S# s% M* r# q+ G$ y+ ?
        }4 ]# v( {' S6 |

. k! a; T/ p$ e2 a) C        addr = base;) H& A3 {$ [$ @1 ?) }
        sync ();
5 S; g4 o: K( ]0 d% @, h        save = *addr;- }- f- U0 m7 w, t. Q0 w' W
        sync ();
" |$ x' Q' g0 S% u( t3 \6 A        *addr = 0;* D& P; U( \& h

/ c: W8 }) O2 S# X; l        sync ();
9 T9 i2 M: t: v) G        if ((val = *addr) != 0) {
6 _6 ]' `* A1 H, B1 Y) c% ]$ X$ o$ @0 h                /* Restore the original data before leaving the function.6 m1 `2 |' S  s2 ?8 W, ]
                 */
3 M! p0 ]+ W6 l' g                sync ();( W7 Q; L) _7 Q% Y3 R& G
                *addr = save;
' J; m* v+ O- P# I: D* z( l" I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 O9 Y) E) c* U) ~1 p/ O& P                        addr  = base + cnt;
5 ?& F6 l) _" ^! L+ w2 l% z1 O$ M* B$ l                        sync ();& S! \9 c0 m& M6 O
                        *addr = save[--i];- ]8 r3 l5 B, `% p/ i% L5 j( s
                }! G! C2 C. ]0 J( K7 A3 \, \( T
                return (0);
5 S! i& g* d" K        }- f6 g9 G8 X( `+ w# f+ r7 H

+ h9 |- Q$ W! |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; v- ?  A0 W* z9 p7 i2 C
                addr = base + cnt;        /* pointer arith! */
* y' b, x5 l4 }                val = *addr;
9 _# w! \3 |$ H1 w0 C2 Q  q9 O# o! {                *addr = save[--i];
% \1 B, O. W- O$ }( ?                if (val != ~cnt) {" n4 [6 D- i5 ?; u
                        size = cnt * sizeof (long);
& Q4 j* G5 u$ Y6 Y+ [                        /* Restore the original data before leaving the function.
  m) k+ `+ J- _                         */- B. L  @+ J, n- r% E! j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 t/ A( Y# E  ?% y9 K, I. _& R                                addr  = base + cnt;
- N4 V# L: A3 Q) g$ [                                *addr = save[--i];
- h+ p( r# ~; r7 v                        }
1 W6 Q+ q3 F  x8 ?9 _                        return (size);
/ J: C; G5 M( B8 Z# P* @/ ^                }
) s+ V7 H. Q: S  w& _. p9 R        }; w2 z( n; b* n# U, e) V# I

$ E: ^5 e- j8 y  c6 y5 R        return (maxsize);/ _+ S+ G! q9 n& Y
}$ \3 R; @: a- ?3 E/ ]3 Q, H& [
int dram_init(void)
+ J3 R! @4 E! t% A" S{
( W; A, B) M7 v! A        /* dram_init must store complete ramsize in gd->ram_size */
/ ^: s% M$ w7 y% ?1 x        gd->ram_size = get_ram_size(
  y/ V( d; p: A7 D, ^' o                        (void *)CONFIG_SYS_SDRAM_BASE,' R  t$ e# y" ~3 t. `
                        CONFIG_MAX_RAM_BANK_SIZE);% x" q8 Y; m8 x, F1 C: |6 o6 g
        return 0;' s0 h# F( C' n( J1 D$ Y
}/ i  h. Q6 P4 A" l5 o4 }7 Z# G4 q
- ]0 B# k; o: o4 d) b

* C1 u) A7 J) H1 J, W5 J* t) J/ ~
8 j5 d  Q. B; r3 r* J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ k6 x, z7 i- L: b9 J, ^  V. v1 Y

0 U$ c* `+ D8 ^1 g; ~* t; o! i8 L; n! a9 O& \" g
2 k  p9 u) m5 {





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