嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( \6 B+ L9 {3 l# l
核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ x% u1 ~& ?/ M6 f3 ^2 p0 [3 d# C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 N0 ?$ F0 G. z. @* f

+ j! Q5 o, n2 D: B是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: h- h6 R* }9 H0 Z
5 P; e  U2 a/ B* j/ i" l& G5 e" m
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 D2 ~& r: v1 \9 ~0 X
/*1 j' O' j1 t3 G) p6 O2 g0 l% p
* Check memory range for valid RAM. A simple memory test determines
6 J6 y8 A2 T: [- T. S* t# I9 _* the actually available RAM size between addresses `base' and
% U3 u( t4 _2 I5 p" L* `base + maxsize'.. Z* @7 j! Q; u, j# n8 \: E
*/
) G! q6 [" V0 t) H  Llong get_ram_size(long *base, long maxsize)  f0 A4 _4 v% @0 L& i, G( p
{! ?/ Y; K' L$ b
        volatile long *addr;' ^( j5 H* R: D0 y" ?0 v/ O
        long           save[32];
: n8 O& r2 _( k( s" U        long           cnt;' R: u4 R; M- a! Y% ^
        long           val;+ p. \) d" S6 r% w7 {$ r! X* g  T
        long           size;% V0 @* \2 g4 w  g6 ?
        int            i = 0;
9 q4 s2 p9 c* ~4 j1 P9 }
2 k" e5 u3 @0 Y+ n: q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 ~6 \3 M, W/ D" O
                addr = base + cnt;        /* pointer arith! */5 Y# w6 ?+ S! w; \) q
                sync ();
3 N7 Y7 ]+ l, q' [: \! U                save[i++] = *addr;
$ G% |7 K0 {* B" ?" H' w0 v                sync ();; j; l" O# e' F: M
                *addr = ~cnt;
) P* `6 k& j' o% u        }, `8 Y( @1 c) i+ q+ Q$ }4 E4 l
! s1 ^1 {8 S' {4 P" d$ M
        addr = base;
! v' n6 L  M3 v% s- e  @+ g        sync ();2 J+ l+ z; a- Q5 D! f1 d% l
        save = *addr;$ F8 D+ Y" c: M; p
        sync ();! G3 ^$ e' G. j
        *addr = 0;2 S' A2 I. y: {5 Q$ W4 }+ C: {) ]
5 Z1 ^/ }) v: e7 r- i' j
        sync ();1 `( G7 \* r) ^; F  N
        if ((val = *addr) != 0) {
  z8 ]8 k. s, k4 J% V. p                /* Restore the original data before leaving the function.& i  z7 n8 c  \0 M2 J
                 */
! T, Y# h! _4 {2 y, Q/ ]                sync ();
* e7 a1 U& |! t8 g5 ?                *addr = save;0 |) s" p9 b; R
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 \" q# J" [1 y7 v2 k  {3 M' h                        addr  = base + cnt;
/ E# ?- T& O: Q8 U* r, K& A( r9 V                        sync ();" f1 p7 k/ K4 u
                        *addr = save[--i];
1 T7 J6 ~8 U: n& J                }
( j5 ]# r% N: Z5 U; w( n' L                return (0);
  K0 O/ `% x5 l7 _! b" ?2 @        }4 u2 {: T# W. R, ~7 W4 z/ R) I1 f
. o1 h( F# @; w5 e" }. L
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' ~9 D. |" i* m( _
                addr = base + cnt;        /* pointer arith! */
- M# f9 `: F/ ?4 I                val = *addr;/ W. W% H  }1 M. ^: S" g# W
                *addr = save[--i];" n/ V! u: `, n9 a. b0 @
                if (val != ~cnt) {8 ?  q- P" p" k. o' @2 n
                        size = cnt * sizeof (long);
$ O0 g- a* W# o7 y                        /* Restore the original data before leaving the function.
6 Q* n1 M, {7 \( G+ Z                         */
, Z' t# g. e" ]" `+ T2 C" I                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 x0 M" y( ~7 P4 X; ]& D4 h+ P: ]                                addr  = base + cnt;( X% e8 I1 _5 h0 C6 h
                                *addr = save[--i];
. ~" Y% C2 o5 [1 ?. Z' E  M1 J: B                        }/ N2 w6 a( [$ I
                        return (size);" p+ M7 ^" z2 q$ w$ x+ E" g8 l
                }. V0 h( W; L6 ~9 B5 d( ]; H
        }/ _/ j' C' }7 J3 a4 _% n! w; }0 D; @
4 d8 `0 F8 `$ R6 j
        return (maxsize);# S' i0 i3 w, Q# c( L1 F
}
% p) P& r" K$ j1 v& Pint dram_init(void)' j: ^! m: w4 m2 b( y
{& {; N$ W# a5 I% p- h* i
        /* dram_init must store complete ramsize in gd->ram_size */
5 B5 |1 u) f  k& w        gd->ram_size = get_ram_size(1 ?* r) D) N: |( J
                        (void *)CONFIG_SYS_SDRAM_BASE,8 Z/ X1 M3 E8 c: h, s6 d
                        CONFIG_MAX_RAM_BANK_SIZE);7 Z; P0 l1 t) I7 n7 p. G
        return 0;, U$ G# _! ]+ y$ y1 }0 c
}
) W2 o2 x$ L6 y. x! m
- f" n9 Q4 G0 j8 Q  Y5 z4 v5 I

2 I7 G, R: m9 P' g. @7 T# E- x$ r1 F) ~7 {2 M- F1 Y' Z' s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; i9 \" ?4 d# C) G7 N

9 N, w& r% `( W6 L2 t" |8 D
* V7 e  V! ~6 w) X3 m, P+ @) N1 ~# L

. i. T5 h$ C! ?6 ~) I




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