嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, [! F  ]3 A) _核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- s! q" D& V2 u3 l这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: b3 I" R1 S# u, }
3 H! V  ]" y0 _; u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 @( [8 j9 x! g0 Q# D( c6 r8 Q
2 s" E. ^9 _$ @# O# k. ?

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, t( P% E8 y. _) V6 k( c+ b- A
/** y, e. b' A. ^1 G! _4 u: H/ |
* Check memory range for valid RAM. A simple memory test determines7 A1 p7 X% i, ^8 D: Q1 }5 `
* the actually available RAM size between addresses `base' and
4 f) z1 S" \8 \" _: S* `base + maxsize'.
5 r- ?6 u8 v4 w8 b5 S*/* j& z( S- e6 H# r
long get_ram_size(long *base, long maxsize)
8 j7 S% y# P7 \{2 `2 ]$ h6 t. m
        volatile long *addr;" g$ s/ U" G' K
        long           save[32];
7 W$ w3 X% `( a! o$ H        long           cnt;
/ n* r) t* N; o+ K) i7 L9 ?* S        long           val;4 g, p$ |2 ?% F- v) y( ~
        long           size;8 m4 M8 {# r! {. X
        int            i = 0;) u. E5 D' ^9 x$ P  y, ^

7 w* T$ l7 I% z/ q9 K+ d        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! O" w/ {- Q. s2 M* E! ]. E3 _& [                addr = base + cnt;        /* pointer arith! */
& \. A- a0 W' R. O                sync ();/ ~% t0 e, k" P. ^
                save[i++] = *addr;5 ?7 P0 h, S" `4 }
                sync ();
2 r0 P6 @& m' X1 P* R                *addr = ~cnt;- i# \* m) ]8 G. F3 L: N
        }
4 P, v$ s( W2 k! Q5 N2 [& G9 T( H, j; n
4 E. Y  d( s* [% g, `        addr = base;7 c  K# _" ?8 ?; z" {9 c( L
        sync ();
* O, e5 P4 c) X: F$ p$ `        save = *addr;
( i, X# m/ q3 |  H7 x* i# H        sync ();4 d5 t5 g/ L( E  f9 y1 i: F
        *addr = 0;+ l( u1 N7 G+ _2 F

. t" F. z: B+ w4 E$ m        sync ();) _: h9 m' q( @: K( `8 Z
        if ((val = *addr) != 0) {. ~8 Y/ j  i5 v' m) C" V
                /* Restore the original data before leaving the function.  D7 l+ s( B1 t: {; ]7 ^1 \8 c
                 */
) ]. d. a2 h7 r; A                sync ();0 s! r' p2 M6 ~- U. @) T3 u
                *addr = save;
- z3 g" \- L  U+ K# B- a" [0 ~3 b                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* k8 n+ _4 @8 ?4 [( k! J% A' G
                        addr  = base + cnt;6 O' s0 \* r6 S' M- g
                        sync ();
; [. u# n; [" k2 J" q                        *addr = save[--i];1 [$ s- A' g+ i8 P" G  E
                }! `) ^9 d, |. x& b- K. T
                return (0);3 t8 @5 i. Y& ^. g3 Q: T# i
        }
. _9 [- n3 g* w6 B$ c3 O. S  \$ x& x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 |7 k# u( G" h
                addr = base + cnt;        /* pointer arith! */
4 C0 i- O4 P( Q% S' Y  @                val = *addr;3 z0 X7 l: ^6 O# {" D, v
                *addr = save[--i];
9 P: ~* N8 n: s7 t& x                if (val != ~cnt) {6 Q) |' V; n1 Q
                        size = cnt * sizeof (long);
7 o" o0 s0 n" X) O0 F3 b3 r                        /* Restore the original data before leaving the function.
4 ^( B1 c% ?+ u2 E- i  N) ]                         */
- t* x0 d( b- z; P  C# O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! B9 C7 T: p. y+ M' Q% A6 H5 z! ?* i  A                                addr  = base + cnt;
" {0 }) K0 M$ C1 |  `9 N                                *addr = save[--i];- N$ W9 V) }0 S- f6 s# Z
                        }
* I: G! C! L0 w  p( |$ G/ t4 K                        return (size);
% [7 P. A" }% [9 l7 Z( a* z                }4 }- V3 F7 `5 y3 R
        }: j& k2 D  _1 f. j6 y$ d

& \& k, G0 e+ W1 R1 H        return (maxsize);
7 m7 S. K% \( I5 N' i}, V# i$ z$ k8 l( v& y9 p; L7 J
int dram_init(void)
+ F8 |9 }' Y3 q: u" H{
& g' x, `) s+ d% }: ^        /* dram_init must store complete ramsize in gd->ram_size */
0 c0 W. S6 H4 H% n$ N        gd->ram_size = get_ram_size(! e* a/ O; G; J- Z( j
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 O, ?2 Z% F3 a7 C$ R                        CONFIG_MAX_RAM_BANK_SIZE);, ]( O3 w6 C' ?: q, F7 w" k" v6 y
        return 0;% p4 I4 [- r. E
}
/ ~. l+ B8 R% q6 A& ?: }' b% H7 D7 [- H

: g" Z6 ]+ C+ D/ X6 ]
# |" V; Z* f8 L3 H, ^; v+ a9 k9 e( n' I$ T) i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* y( y& C. b- z4 W, e3 I7 S" M3 J. p" [' F
2 L6 M, w& }: Y4 m( b. k
6 c  L4 n! ]5 T4 @9 ^4 r0 F4 U





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