嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! u1 g  l6 B' ]- ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: |. t$ N+ v. r9 V" o9 B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ r/ Z2 _0 {$ L

! `* F5 E( |8 M0 p8 _( C- c是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" T$ `' ~& a0 Z4 h6 i- |3 J/ h0 x3 U

. a/ Z  ?8 l. Y- f1 j5 v
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 J+ `1 g, b5 ~# Q1 X8 s
/*
0 F1 g) L* f$ c3 Z% \0 L* [& `* Check memory range for valid RAM. A simple memory test determines! X4 L, a; b' |
* the actually available RAM size between addresses `base' and
; Q# @* L. E: N; q  Q0 P* `base + maxsize'.
: M# E: L! p) |. q9 w4 f*/
( q2 w; ^8 z; z1 o' Z. N5 [long get_ram_size(long *base, long maxsize)
8 J2 H( ?+ C$ ]{
  x' T$ A; S7 a- K        volatile long *addr;" I) Y) p+ _2 @! ?5 V
        long           save[32];7 O5 Q- g. v& t1 Z) k& W9 z& e3 {) W% M
        long           cnt;; F: p- j0 l$ |
        long           val;
  _) h  d1 d7 v/ j        long           size;
+ }. \8 _0 m  l5 }9 F6 p( R        int            i = 0;
" Q- p, x+ A6 H  x8 x8 O/ {
. ]/ D) P4 S0 p( u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" L$ V* ?* M; h1 F6 g# \7 u
                addr = base + cnt;        /* pointer arith! */
/ |( h; A, P- R! c                sync ();' X- _. \4 P1 X. {& y3 \1 T0 Z, L& f
                save[i++] = *addr;6 H2 i% a7 N9 w3 D5 e. L6 g; ]/ ?
                sync ();
% b0 e) f- i# A0 ]0 D! ^% J                *addr = ~cnt;: A/ B4 Q3 x9 {8 c  P" o: }/ ^5 t. R
        }" R* y! @$ x) D( Y
" @1 ~6 v3 X3 Q% _5 X/ \
        addr = base;
* G7 X4 @6 G3 b4 z! h        sync ();- ]3 h5 |4 j: R; F) |
        save = *addr;8 W! \1 g) ^5 ~8 |- N
        sync ();' s/ K- f6 E1 `/ D* _+ W0 |
        *addr = 0;
7 ?2 a9 O# r7 u) y! B% d, |  j, O8 w
        sync ();( E, y9 M1 j, B5 k, H/ T
        if ((val = *addr) != 0) {
( P! N8 D: F4 S$ ?" A- ?) w7 v                /* Restore the original data before leaving the function.
% R- E6 \  K# ^! y) Y6 z' I2 c                 */( P6 F/ `8 [4 r& O! a7 f
                sync ();
! s  Z% {0 J0 ?                *addr = save;) \) `/ \+ c- H, D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 `) w2 r) q1 t6 D3 l: d( n; e4 ?
                        addr  = base + cnt;8 z2 i$ t6 f; d
                        sync ();
$ ]; y8 N  O, Q6 }* o; V5 X                        *addr = save[--i];5 O9 [: ~6 w  D# Q/ C5 l6 n
                }: u$ l3 X' f3 _1 {; C" R# n) |! E
                return (0);+ X$ l' O* k$ I4 o$ A
        }
( x9 S3 C* d4 g' E9 l+ k; N
0 r! r+ h* j& o0 }. `6 K3 `        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; a) o) ^, G- e! B" B0 i5 R8 f7 O4 E
                addr = base + cnt;        /* pointer arith! */& `* e% \! K/ s: {; U
                val = *addr;+ E5 I! Z. h, p
                *addr = save[--i];
5 q$ r1 T# R( l: p) A                if (val != ~cnt) {/ L8 Y0 j+ l" c7 S! \7 c0 }
                        size = cnt * sizeof (long);) Y1 G4 Y) r+ h! b% q
                        /* Restore the original data before leaving the function.; q8 k; V$ R# w; s
                         */6 `9 ^& q- W. T* p. k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" B. |' \6 \1 Y
                                addr  = base + cnt;
" a1 e& [$ s; [+ o8 K! `                                *addr = save[--i];  ~( p' Q' U$ {6 k& Y
                        }/ ]9 P8 p' o3 c- [7 p# d
                        return (size);
# ~3 ]. }9 q2 w4 I- l6 G                }
; y1 p9 O6 _) E        }
  O, b6 @1 F# k9 y6 d
$ Z6 [) h0 c# a4 Z        return (maxsize);) b; ]( a$ h, ~" S6 H
}
$ N4 y! O0 ?/ Yint dram_init(void)
- p( M- o4 G  s* v; k{2 E, e0 B4 }" Q. m% B/ @  Z9 b
        /* dram_init must store complete ramsize in gd->ram_size */
  Z0 Q3 L- w& |4 Z! t        gd->ram_size = get_ram_size(, Y( I  \, [7 u! f# F
                        (void *)CONFIG_SYS_SDRAM_BASE,+ _3 u. w; G, p" z0 l( X! ?
                        CONFIG_MAX_RAM_BANK_SIZE);
/ o8 K; d# z8 M4 [  q& J8 ]5 a; `        return 0;
) ~0 B) L1 I4 c0 q+ l8 m; K% K}5 j! U- e# _5 v7 \

9 L, N' Z5 |9 P; o7 }0 G: r4 `' U1 @+ M' m$ b) u
: x/ k; y" d7 i$ T6 c  i+ ~; ?

6 z: }# l7 B' f8 ^. C" bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& n3 P0 c  h  R3 ~/ C2 f- p8 |# J1 v. r- k1 v" d# G5 O! g, w1 x, Z5 B

/ S" k1 y" O( {6 n; O# N: u

% B3 }' `5 I+ a* S




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