嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& m( `2 ?; D0 K' l核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 _) M1 p- n0 u! K0 b5 T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% X; s; R4 n7 \3 y% S" b# m3 D
3 k: |0 G; O! t( v# \2 }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 J; [# t% b  f* E. H
8 {% E; s0 ~$ U( A  j
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ m. a& T1 V+ @, o. C% M7 P0 y
/*
6 ]* y/ w- @; e$ p* Check memory range for valid RAM. A simple memory test determines
' P6 ?2 P, Y" E7 n* p* the actually available RAM size between addresses `base' and
) Q, t. z3 K4 |* `base + maxsize'.# a1 L! e3 o5 Z% [6 D/ D/ M. F$ P
*/# h5 q9 `9 S7 m- z4 E% O
long get_ram_size(long *base, long maxsize)
8 J& F/ ]6 P/ d6 \1 M/ ^{9 o2 \# ~2 p! T/ _
        volatile long *addr;
! [# u. E( g9 I5 i, ^3 l9 S        long           save[32];/ |: Y+ ]) z6 G  h( P
        long           cnt;# N. [# e) m7 V% a0 H
        long           val;
2 |% B1 Y+ F- d5 {        long           size;/ q) P/ h# q( K& ?0 Y9 @/ }9 j  B" N
        int            i = 0;
, R1 k6 p6 ]2 x4 u, ~! R. W7 j+ D. Y# u" ]* S! v- V
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. {# r' y  V, n+ S  `  j                addr = base + cnt;        /* pointer arith! */' Y, ^' A% ~& L& M" }5 R0 l
                sync ();
9 x6 `- N0 t3 M. r' }0 i( m                save[i++] = *addr;" }% I; ^% `: l$ z$ d/ R6 \# \. G
                sync ();
' F  _; {/ }/ n* D8 j9 t                *addr = ~cnt;9 z' u' c  d# B! T8 I
        }
* d1 [. Y1 p( m
. U& F5 b3 I  X! w: H- G        addr = base;
4 n2 _: h& i, ~: {        sync ();" \6 K1 k6 _& @& [8 {% ?
        save = *addr;5 h: j! o% O" T! `: ~
        sync ();
2 l" j. D6 S* U8 y        *addr = 0;$ A2 ]2 p% i4 }
( a% z7 v& _6 |' L% e
        sync ();
1 A4 o& i0 V, N, M* e( c8 H9 j9 V        if ((val = *addr) != 0) {) b1 }5 }8 S- I+ X
                /* Restore the original data before leaving the function.. j" K- _; z" I/ D
                 */$ B$ X+ ~% V1 R7 u5 p  m
                sync ();
# z- Q$ e* M! j8 Z0 v                *addr = save;
5 o3 i1 D; p  `9 F& d2 j- I+ [! f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! w9 [( M' T; h                        addr  = base + cnt;
4 `2 F( r) s* t8 i2 D) c: @7 b: s                        sync ();4 L: i) r* W. F4 F6 p. ^
                        *addr = save[--i];
4 H* r* l1 z" m5 O- f. Q" }6 K                }
( t7 o6 s. Z2 i" t                return (0);
- G5 ~1 d! v3 b" I3 e        }
: ~* z8 }* x: a/ v" ^5 e* e& Q* [0 L2 N+ ^9 f2 ]( p, y# G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& v: M8 b' q' H1 J3 N" u, K  B                addr = base + cnt;        /* pointer arith! */
5 c- h) w" [- ]! m% l# J                val = *addr;
5 W/ @$ F* w9 B/ z                *addr = save[--i];
) r* Y% E6 o8 i' K                if (val != ~cnt) {
/ K, a" Y/ S  V7 l$ Z1 S; w# `                        size = cnt * sizeof (long);
# x& ?- x2 g: _5 S& \* V7 |                        /* Restore the original data before leaving the function.+ R. A* O- j2 \5 }
                         */4 ^- \7 s# b8 o% ~1 C
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: ^9 e7 c9 f; b$ q  s- r- o! V$ ^
                                addr  = base + cnt;
+ A, W5 E/ }+ D- m                                *addr = save[--i];
! a  s- P" _' G9 \7 |& G3 O  n                        }
7 ?: U- h5 h  I# u( W+ J* }' @2 @                        return (size);: {/ x( |9 @- X! C1 [
                }
1 A: w3 W8 h0 t' ~7 S        }
/ [0 @1 V. k0 B: \& N$ Q+ y5 X- p) l( ^! V
        return (maxsize);
, `3 G, O5 N- u- u2 J" L8 ^}
4 X& W& L' T5 X& y# @) Aint dram_init(void)1 Z/ U2 F/ Y' P' ]+ z' `9 K; q+ x
{
  C. ]1 V3 ~/ `' M# a        /* dram_init must store complete ramsize in gd->ram_size */3 R+ |  @2 m- Z9 I
        gd->ram_size = get_ram_size(% B+ h) J. N/ }1 x  N) B$ A
                        (void *)CONFIG_SYS_SDRAM_BASE,
9 Q" E+ h- X0 I                        CONFIG_MAX_RAM_BANK_SIZE);
$ P8 n: {  D# a        return 0;
6 P# N1 g: a$ L+ o# F}4 H' B( k. c0 }6 j3 L# v

* i* y# t$ a  `6 F# {
4 `5 f; p2 ?. e2 V
; h2 s7 i/ R0 R* z
& \/ L  t, P9 u, V) g5 U2 \FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 ]$ l7 g7 m0 i% o. s# ~4 n+ O9 V5 x7 P8 \+ r  a& F$ p1 e
  j/ q$ A( O: J
! m7 k0 a7 `7 S





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