嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% ~8 F' D. v. M6 x
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 z* o5 w$ ?  J6 N" d这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* }" t( R0 ?: z% A6 q: H
  d" }8 N& Z. y+ x7 d# ~; _  O" p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; b$ j  |2 K3 C, Q0 f
) F- x" q) Y- ~1 K" @; R6 f+ A% A
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  z' f5 K9 O5 q( x
/*
7 m: ^) y( J1 x  a( p* Check memory range for valid RAM. A simple memory test determines
' w* I% X9 s6 C% K7 u* the actually available RAM size between addresses `base' and
" F- R5 C6 ~; E, D( h* `base + maxsize'.5 \8 Y' G, P" P' n$ W* L5 q
*/
$ n8 }6 D3 J$ L! N; @( ?long get_ram_size(long *base, long maxsize)- F& J( J( H  @; h7 L; ?. P! \
{( _, `* e% u+ _$ F' y$ Z
        volatile long *addr;
1 x. f. H& Z* N: \: R        long           save[32];
. d* W# W3 ]: @5 N. Z- D        long           cnt;
) h" M& h/ G5 u( u4 A        long           val;% W7 R3 I+ w! I, W' v/ g
        long           size;
8 t  M4 X! K2 @+ X) _        int            i = 0;
: U1 Y" o: T' g$ r" D
; C5 s/ x+ O: c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) M3 V; k7 Y, ?
                addr = base + cnt;        /* pointer arith! */! r3 b& w7 I1 K' }0 g- @6 A6 A
                sync ();
: n( A  f+ j7 h1 {                save[i++] = *addr;1 C9 b0 U- s; ]8 ^3 {& r
                sync ();1 \, b: R6 d+ [
                *addr = ~cnt;
6 S- J1 ^5 s7 o* ?; B! l5 D        }$ {# j0 r$ s  M/ p, V

* h$ Q6 n' |$ ^. r2 ?5 i1 B        addr = base;4 q: R3 T" B) k5 M. J
        sync ();) M' [% [% _$ u$ e7 m
        save = *addr;
4 K8 d+ w  C8 {2 Z* I        sync ();  T+ f  K, k0 n6 \% t
        *addr = 0;
5 u, x6 A7 {2 _+ @5 p, w# k4 c$ t8 l; }8 L% Y
        sync ();8 I; j9 ~+ u/ j3 a- D0 s
        if ((val = *addr) != 0) {
" C9 s, c. T0 k+ X! m% e4 f- g) W4 ]                /* Restore the original data before leaving the function.
+ D' L4 [8 @5 y                 */& k+ _( C' o( b% E! g$ g$ t
                sync ();
+ g; F9 I. M: z9 d4 b4 [                *addr = save;# @# ]  ^0 l4 R- G9 Y+ s; \
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( H. m4 p# d* T                        addr  = base + cnt;& }, l6 a* c5 g/ ^6 ~- \7 r2 P/ H
                        sync ();
! F& c0 C2 Y. r/ o                        *addr = save[--i];
8 f  H% h" P( \/ W3 _                }3 H1 }: A2 ~  T  g& ]* p
                return (0);- _9 Z/ y8 G& c, v% ?, e0 A
        }
( W9 Z" m: J2 O* u8 I% }) n) Y* n7 h& N! U# X. W1 T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) Y8 m, f3 I/ K3 U                addr = base + cnt;        /* pointer arith! *// ?1 _' t9 r& L2 _3 d
                val = *addr;! x4 e4 b0 A, _* _0 h
                *addr = save[--i];
3 q/ l2 S# Z8 v: Y                if (val != ~cnt) {
! [  G' M7 t5 b; z6 ~) k                        size = cnt * sizeof (long);/ z# e1 X: J- _) U5 y: W' e  {
                        /* Restore the original data before leaving the function.
$ q6 I, b3 q9 N                         */) z& M' P7 i& {
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 }* Z" ]5 O1 ^5 u3 W0 S4 ]) M                                addr  = base + cnt;
, U$ c4 r2 H: }) v9 d, _0 H                                *addr = save[--i];, o8 P" @. q" ~+ Z
                        }
( i5 s; I6 R, n; F5 f6 C1 h& U                        return (size);" v5 n# u" G4 a' u1 I
                }1 z! V4 G- V, L9 ~4 S* Q, X
        }( }! G# r& K6 n2 u' l

% N6 {8 z4 O5 c4 q1 _& n        return (maxsize);% x0 i  e9 D' _* |+ `4 L
}
! Q. K! o: I* K( P4 cint dram_init(void)
2 w- h2 l4 j4 Y{
( ?  c, a& N3 E7 ?7 G5 O" g        /* dram_init must store complete ramsize in gd->ram_size */
8 c# D8 y, B' P  k        gd->ram_size = get_ram_size(
3 q8 h" Z5 y0 i0 ^" I                        (void *)CONFIG_SYS_SDRAM_BASE,# X5 a3 r+ u& [/ S+ w9 x
                        CONFIG_MAX_RAM_BANK_SIZE);
& Y, e0 ~8 A* H+ d- F- v        return 0;. m" d, p, ^# f2 }+ v0 E; v
}
) a- k. T. d3 ^
2 c% E' {' O$ Q
, l9 P: H* y' V' q: O" v/ D) A: [: }- F8 S+ B: S6 P

; f7 Q) ?4 h+ ]! I- s+ D- FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; S9 L3 v# ?: H7 {- Z' \

+ g- T, n0 _1 q& E7 B
  u$ }4 ?# I1 c
* |  T: }. P! D9 s+ f- S% ]; ~





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