嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" a" m) Z8 ]$ A" M( j- v1 r7 i核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ G7 p( o' w0 z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! O* b- E# Y6 A6 h3 e. F( b; B+ J4 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 m9 D# d" T  D9 d+ Y5 X1 h. c( P

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& W' v6 D& j. ?' J7 J2 p/*
% H: r* G4 [8 ]9 E) A& b/ t* Check memory range for valid RAM. A simple memory test determines
3 F  J/ l( M1 g2 l6 \7 h* the actually available RAM size between addresses `base' and: U1 t4 M/ n( N5 I; v8 B
* `base + maxsize'.
% d9 @3 R# a# `+ U0 T+ m: X+ P/ K# C*/+ L: A  f8 }) j) v/ c% W: V" b( I
long get_ram_size(long *base, long maxsize)
+ ]4 D# O& J; L: Y8 Z8 o7 G{% b$ m! W( U; e
        volatile long *addr;
9 Q  s3 C9 ?2 M1 |& x- Z4 w0 x        long           save[32];
- v. s" T! l8 W        long           cnt;
. L0 k& c! T8 u( T, w3 u        long           val;
% \. k) \8 }4 m# K- M2 O        long           size;
8 a4 |+ o7 A7 t5 A# w        int            i = 0;% M8 W6 r& S/ L" b' H5 V4 C

% A, q7 x( R0 r% Z3 f# }& I, x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% n" T& \# H0 e, p                addr = base + cnt;        /* pointer arith! */
# i( |3 O5 G) Z- }  e7 {                sync ();. o" Q) g, s+ Z8 K* h' ]* w
                save[i++] = *addr;6 M8 L' W/ Y) B& o6 P$ U0 r
                sync ();
  ^6 O( @* y6 _                *addr = ~cnt;9 @+ H% |7 O; \, I4 ~; M
        }  x! G! I1 R7 {1 W4 G
, ^* L1 v" l1 h3 p# h# N/ d& L- E
        addr = base;& D# r6 ^1 o- x6 b( A; F
        sync ();0 V2 J0 c$ Y8 H7 `/ y0 A
        save = *addr;
. r+ D& C3 ]! p2 d        sync ();$ z) o7 c1 H& A, H- \
        *addr = 0;$ W" o7 l: y) Y- f  \( r
4 I1 b5 A, F- s2 Q( K) n$ f
        sync ();
7 A' g+ p6 [% f1 W$ _/ e' T9 X# W        if ((val = *addr) != 0) {
) h: Z8 T2 e" S4 V% X                /* Restore the original data before leaving the function.
  m6 Q, S, b5 j7 s9 t$ h6 E7 c                 */0 \2 u( j* g6 X. v' ?& q" ?
                sync ();
( k) S* R5 ?9 U; y/ v* O                *addr = save;& }$ Z" o- E+ S( e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# u' ]3 p/ E; j/ d9 R                        addr  = base + cnt;
) |: ]3 T5 F! n                        sync ();
/ f+ x4 J" W* G  ~; Q% V  s6 H                        *addr = save[--i];
* C  R7 e# O) |% |6 m( O                }: g! \  d6 }$ q. Q5 x- N; M
                return (0);
. E7 b9 p9 s& |+ d4 w        }. p: t% `0 Y* `* B' e' @( E0 l* V
) j) o2 L" i) y# E/ k" q2 Q: w9 q# X" o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 K0 A" ?3 E! L
                addr = base + cnt;        /* pointer arith! */
5 T- i2 C, K2 K6 m8 a  ~                val = *addr;2 g7 }4 u1 `; r+ D1 m
                *addr = save[--i];, G  P6 I/ {0 `
                if (val != ~cnt) {: e. F- Q$ ]+ f7 T" v" _, I
                        size = cnt * sizeof (long);- S& G/ z9 x+ @
                        /* Restore the original data before leaving the function.) T0 t. O" V  |
                         */
4 T. _$ D  [. p$ F                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& h# z% d5 o2 W  E0 ~
                                addr  = base + cnt;# @4 D& W( j: z7 p
                                *addr = save[--i];0 U+ b! m* X1 Z: ~- u- t( n
                        }
$ H' X/ B% I! ?0 |& N  Y4 y8 F& ?2 _) y                        return (size);8 A& L1 y( j6 `: f, r
                }
6 C5 t0 D- H9 X; i        }
! o. {2 o2 K4 M3 D6 ]
6 N; A' z0 ^' w* [        return (maxsize);
6 \4 D/ r8 ?6 [; a3 k: r}
7 M& N& C. n( o2 u' H* Dint dram_init(void)% r1 B* w- {0 t2 G* A0 ?
{; S1 D/ S) x6 [: c# }0 N
        /* dram_init must store complete ramsize in gd->ram_size */
# B! X0 _: w7 m) s* Y9 E        gd->ram_size = get_ram_size(
6 a; W& A: {  g; ?% s8 B7 x% Z                        (void *)CONFIG_SYS_SDRAM_BASE,( a+ N' F1 ~1 y
                        CONFIG_MAX_RAM_BANK_SIZE);
' J$ r8 B$ E* q, k4 J        return 0;* J4 h( y' O: F
}& m4 z& ~; }0 E8 s
  e5 `6 z4 l" O+ a6 P2 r, X

, ~( o6 E' ^- y# B( }5 y$ ~* [* d0 D/ q, }5 X: w4 k

  V, A, w1 h: z4 u: Q1 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% ?% k' J- Z( p0 \0 l2 S

6 F) {( c- ?* }+ v
3 E8 O3 e8 I1 q5 v7 e

  Z" F3 X2 e+ p+ o8 W- h+ q  t




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