嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 z! a% i  k; ?+ a
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! q% a' j- u  a" b( N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ Z) e' b0 B% m

4 O8 \1 w" G" w* k5 i8 H7 R& A3 M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: j0 k  w! J- \5 J/ \" {/ S3 G* d+ E$ o6 N2 g* V4 h

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ [; u. F2 c2 h+ {% _/*
2 y1 D. s" O7 h! Z0 ?' t% \* Check memory range for valid RAM. A simple memory test determines4 @7 e9 L6 F  B9 k
* the actually available RAM size between addresses `base' and/ r, w4 l7 i( y" C5 C/ C& H$ |+ {
* `base + maxsize'.
6 z) C) p0 i8 v1 }9 J* g*/% [6 z! F- f' q3 J
long get_ram_size(long *base, long maxsize)& [8 A; u2 V0 q
{
( m! b9 h2 g1 z' W        volatile long *addr;; V/ e" U( v5 l" r8 P0 V0 X9 v
        long           save[32];0 {/ }+ ]5 Y2 D& p. x# j, s& S& M
        long           cnt;# ^% n- {% p* O+ ?( r$ H
        long           val;( e  i- y2 z$ P" W9 R8 R+ B
        long           size;
1 g8 F7 O7 p. |# Q1 j7 T        int            i = 0;. `" H4 s  T- M9 v

! T; a9 ?# A6 W+ d$ t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# _: H+ g+ m& h% N. G                addr = base + cnt;        /* pointer arith! */
% n5 ], a( N  N# K9 ~8 x! u                sync ();. g8 i% p/ X' J  A; p
                save[i++] = *addr;
; y7 m( u. Q0 K( k/ X5 n8 P: `                sync ();7 I: J  y. K8 M/ O: ?
                *addr = ~cnt;
9 F# |* [( j, _. P% O. [4 `        }- R7 `& T, T( R  b& r: F% S
; \+ @0 i: S( J% l7 k0 I; [
        addr = base;! L: Z/ d" Q* B6 {( [
        sync ();5 P4 D: O7 I( w1 P6 m2 A8 v$ X+ A
        save = *addr;
% j  ?* D0 N/ X/ U7 m        sync ();
9 X' U6 r* ^6 }0 n# P0 A" H6 n" f        *addr = 0;. W3 x5 T' ?, x  J/ Z# s% L5 y

& X" `  m: z3 o! }- x        sync ();
8 u, ~. N. x) W  a; |/ v        if ((val = *addr) != 0) {: m( W# l( e$ d% N
                /* Restore the original data before leaving the function.) o% o( V1 d) Y: `. m
                 */; C# e( f4 b& [9 T
                sync ();
) Q9 K. e1 ?' U                *addr = save;: U. M. ?5 B- G; [  B
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( N( U* [% L; ]- o* o0 }
                        addr  = base + cnt;- x: s. B+ ^+ A) [1 t# H
                        sync ();" q! C7 L* T0 e. }
                        *addr = save[--i];4 s2 ^* Q- ^' Q' h8 C7 g5 p5 J
                }
+ c8 t; b% y) t/ R, o4 V0 `                return (0);
: P5 o0 g& @4 `* G" u5 c, w; }+ a        }
9 b8 M  i4 d2 O' f; a" z$ v! A0 r: {& ~) l- E/ j# A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- A: A' `5 V) z3 s' i                addr = base + cnt;        /* pointer arith! */7 _- y1 x, T/ g& W% [4 V
                val = *addr;' g* Z0 P* F3 j* |
                *addr = save[--i];  n+ R- j* b- W1 t* R  m, @
                if (val != ~cnt) {4 z/ S. n8 [0 r
                        size = cnt * sizeof (long);) A  H. ?: L, k  ~- L* D0 {! D
                        /* Restore the original data before leaving the function." b; @1 Q) M8 T) D9 [, r2 j
                         */; y3 A5 G1 W+ n
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 i! H9 K7 @3 B: ^5 s/ u7 y: b: J
                                addr  = base + cnt;; H' p( q4 U3 O# E8 v9 c5 f
                                *addr = save[--i];8 h& K( W8 m/ d# @
                        }- g: [' G) p5 ^8 N) r
                        return (size);
% J" l9 j4 B! p                }% l' x; [0 Z/ C' G( x$ @
        }! b9 n& v( o" H* N9 Y7 R/ V2 C& w2 F
6 E2 _! N8 D/ g6 w  w" g# O' @  n1 }* S3 ^
        return (maxsize);
) W- H7 ~1 [# z; o}( X/ V" @3 h, y( y# \
int dram_init(void)+ E5 A/ V% d9 n& P
{' p8 {# i) U  G) }, L
        /* dram_init must store complete ramsize in gd->ram_size */
$ ^- F) Q: P$ Q$ o! M, s1 U' h        gd->ram_size = get_ram_size(
6 m! U( s+ V6 e! ~! E1 |( B/ P                        (void *)CONFIG_SYS_SDRAM_BASE,) r( S; ]! a3 Q  y
                        CONFIG_MAX_RAM_BANK_SIZE);
; R( k. Z/ [- E% n7 N6 c        return 0;# L# p  n; i; a6 U4 T( F
}
# W) `3 Z' F* f, O2 g7 _4 ~  S7 \! M- W$ C. E

  D; {9 e+ N2 T" n; w5 f6 Q& c2 P. F- G$ B
1 T  m/ _( x/ V0 G
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, h5 J3 y4 @( Z5 F" v, F; I

" {3 l& }" c% L( X" e" P5 _, f, K5 [& f) O( S

% X, P3 q; Q2 l, L% R. T; g




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