嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 J/ \% ~% C1 L核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; ]5 g1 ]( @% S/ E7 w. \% B这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* K( x3 g+ b. ~* l" H

; s+ z7 d% h$ ^; l1 Y& F4 E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' L! V, c2 _$ a: @

% Z/ n  [8 X: f  a" j4 A( J, C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 |. n( W0 B5 ?4 Y; g
/*7 R2 I( d( G# V$ z9 }/ y" Z
* Check memory range for valid RAM. A simple memory test determines
. S4 @. t$ z; c6 L% ^* the actually available RAM size between addresses `base' and2 E+ O& t+ D6 H- e6 K' R2 E
* `base + maxsize'.8 X: b* D5 U7 P' D
*/
' a7 b  @( L0 D/ J" Ilong get_ram_size(long *base, long maxsize)
7 `7 l) y9 X3 K: k{
7 H" ^' T) [4 F1 b        volatile long *addr;
" N$ w+ z5 Z# q  f7 X        long           save[32];
& i( e. t& l( [! @+ @        long           cnt;5 H) U2 K* h* c( |8 y
        long           val;# f( q3 g9 l+ ~7 \; i  G" C
        long           size;8 g1 T# b1 t6 I; n+ r& @/ }5 z
        int            i = 0;% ]3 J7 y7 k7 Q+ w
' r, _! u$ v; k
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 _: p# [9 O; V5 f5 \+ q% c6 W                addr = base + cnt;        /* pointer arith! */+ R' M: A% S2 r0 K, `" |( W
                sync ();
0 v* Q; E, o& r: Q                save[i++] = *addr;
2 Z3 S- @5 P) M) |                sync ();
" ^" i$ U4 k3 z* o                *addr = ~cnt;
4 |( l+ v6 ~* V% C& T, i$ h# ?        }
% K$ ]1 M$ z0 M" |( Z$ q: @" w- c4 T8 \* w; |
        addr = base;" C; A) k3 C7 m7 f  N) }
        sync ();* `) Q& V* X2 V. u4 J  G. ~) s0 R/ Q
        save = *addr;
) [$ k: l- p2 q1 [% F# Z        sync ();  X' _4 j' B# q7 M8 e& K  G
        *addr = 0;
5 L5 l  y4 B+ [$ l
6 M8 N7 ]& i' G2 Z+ _/ \8 C* R        sync ();0 X7 v1 y# q9 A# N  w# Q
        if ((val = *addr) != 0) {
+ F: B# R. j) o$ ^$ h/ r/ l; n                /* Restore the original data before leaving the function.4 l$ V4 `6 J% P/ ^
                 */
- M" i2 Y: b" @$ N% z                sync ();6 |7 G  q2 e; ?! O3 f- K
                *addr = save;
4 j! x, z2 N7 W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( E# m* C& m% y8 o  I
                        addr  = base + cnt;
9 A3 R0 \# {, D* B( N                        sync ();
) V  x$ ]3 `  l# z7 ^; T  ]$ b% O& U6 Y                        *addr = save[--i];
' _: V% u1 z2 e: V                }1 E+ R4 |3 b: A, j. z, i' o
                return (0);
" E/ G- E# Q/ X) l. T        }
7 @) Y( f- t: a: X( o0 z% S# }- Q7 Y" O% O# ]2 F* h7 c
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" {8 s2 p. C7 N+ ]% l3 X
                addr = base + cnt;        /* pointer arith! */
$ d" a5 D0 A0 Q, `  [                val = *addr;
1 n" O- ~. z! A% B5 l& c3 V: l                *addr = save[--i];  g7 H: {2 d0 c( b
                if (val != ~cnt) {4 j3 q5 D% P) x! R, c
                        size = cnt * sizeof (long);& ]; o' h" Y; I/ }
                        /* Restore the original data before leaving the function.# o5 W8 j- Z! ~
                         */
. n* A% w: w8 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& S/ K2 q9 J$ i                                addr  = base + cnt;
7 s( m. ^+ {2 k  {2 S( n                                *addr = save[--i];
/ Y2 O) ~# ~* Q( P, ~                        }' Q* X& n, A# g% U
                        return (size);2 l+ r" x3 e2 d% y. R
                }, s( n; o* s2 w
        }
5 d7 w7 F! m" |
: A5 K; r! W& ?( m5 \) X        return (maxsize);0 t2 G$ t- Z2 {" q
}
* ~% a9 q/ E8 \! Q5 k& [- `int dram_init(void)7 s' l% W. v& p3 `% |& g
{- N5 I! h1 T/ _  a# E9 @% ?  X+ n
        /* dram_init must store complete ramsize in gd->ram_size */
' y& B- o' P5 t  q, w        gd->ram_size = get_ram_size(
: J6 E. t. g% N8 C0 ~                        (void *)CONFIG_SYS_SDRAM_BASE,
" E# |$ Y4 L. h; d4 Y; X                        CONFIG_MAX_RAM_BANK_SIZE);
$ A" Z) ^" Q7 M! s" z        return 0;
6 f  w9 u6 H% c. Q" }}
3 U6 m$ q: _" K6 j& K7 n, D: P
3 ?* t4 g" L( K" a. e! D: Q
* d* D5 R  T8 L! k
* C7 h- T( _: d5 y/ f+ M, }1 k# Q% D5 I1 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- r1 B3 [1 h+ x6 `$ r! s, ~7 B
* ~# j  h4 O  Y! L" Z" `
6 `9 C7 F3 z! r8 b1 |6 C* T

' W: T4 Z- |) W6 o! ^




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