嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 y$ x4 b7 v% L+ N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 i% c  U# @+ n& \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 o" K( w- n2 g

- b! V* W/ S* ]  i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 h6 y7 D; d, C' A6 L. p: o
/ t& U" K/ }5 w9 ^6 K

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& T) O3 C2 |; }/*& T/ x9 z$ ], l* e. B* C0 c5 C
* Check memory range for valid RAM. A simple memory test determines1 L$ j) Q, r; j
* the actually available RAM size between addresses `base' and% l! H! W7 q7 U3 {7 u+ Y% ^% q& U8 H
* `base + maxsize'.5 T$ W6 g# r6 |
*/8 \4 H/ s% q4 X/ x7 g4 D0 M
long get_ram_size(long *base, long maxsize)
1 `' h2 B9 [8 ]{
' D- D/ y7 `3 k6 l2 ^' Q# B        volatile long *addr;
4 k2 P; w& y9 i        long           save[32];5 ^4 d1 }% ]0 O' }" G
        long           cnt;* o. u) S* |/ Q$ c& \
        long           val;" Z6 P' N8 b: E2 w4 V8 E
        long           size;
. k- A6 s$ I9 X  y        int            i = 0;
! B5 }8 n1 Z0 N- w
) l- p( `# ^$ P: Y+ {        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! T% e1 H) Q6 }8 b1 w                addr = base + cnt;        /* pointer arith! */
5 F1 q8 N3 B7 p7 Q4 a; G0 c" U; B                sync ();
7 b; B* r% A- @6 l                save[i++] = *addr;
2 F6 u+ F5 {) ^0 N                sync ();, s7 _/ c! F/ q
                *addr = ~cnt;/ |' c; ^0 Z9 N% {
        }& `6 ^- R: ^% L! H' f
2 u2 b( E2 e0 W. _9 b& h# _
        addr = base;8 Y! C* N8 @$ y
        sync ();
$ X+ ?; h6 p$ \2 ?% I        save = *addr;
, n0 C, t5 h" u" H0 M/ ]2 X        sync ();( a* S! Q5 b' ~+ c  D# E  X
        *addr = 0;
- U0 W/ O2 \5 [& z2 T! ?& `
7 d. D5 f) ^# ?- F* I        sync ();
$ n8 J. ~! w+ ~0 x2 K8 |9 H7 W        if ((val = *addr) != 0) {
  e+ G6 A# t7 ]                /* Restore the original data before leaving the function./ [. o9 e, P. W% p( `2 f
                 */8 M. b+ D4 c6 O; u. W
                sync ();
0 P  N. p/ O/ R& ~+ J                *addr = save;
3 `: j3 T. C5 i+ K' @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, b- P4 @+ p$ j9 E4 O8 J, c) w
                        addr  = base + cnt;/ Z5 K" T) i1 e8 y
                        sync ();
$ c9 u# V& U# W, k: z4 W                        *addr = save[--i];
* c! ]" l. p7 X( t! Z6 n, e( U                }0 ]6 ?4 R" V- h& |* z% V, c( X
                return (0);
/ v0 E# M0 d. E$ C$ i0 ]' q' _        }
# L, E% m- \5 I* h4 R) a. D7 a$ p; a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( W6 c2 l3 o* R% s; a; v
                addr = base + cnt;        /* pointer arith! */2 h9 P0 \9 @. N" }
                val = *addr;
, ^7 N5 o) G( m( s& [- G  x                *addr = save[--i];/ T% b4 r' v. d' E
                if (val != ~cnt) {: a& h  _9 X( u
                        size = cnt * sizeof (long);% S3 a6 ~$ y3 a# A. J; u% B! ]
                        /* Restore the original data before leaving the function.
- C6 T' w5 |% p$ f$ \% P" j, g6 ~1 i                         */
1 \( @- x, P; }. i- q' t5 {8 Q  n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ {0 Q6 t. [4 E( g1 s' E. L6 n3 P
                                addr  = base + cnt;
- R9 {% o! k5 ^0 [4 E                                *addr = save[--i];5 z' M( [. _: Y1 i& ]) y4 q' P
                        }
% I: ]% e  B) ]" g                        return (size);- ]( b7 J, B" `# g! \$ I
                }+ o* i# @1 ]! y& W9 B, U. f2 e  P
        }) ^; _* F3 k6 f! [! b( g" N( {  o8 [4 y
1 U0 B. e3 H5 b2 O' p& c7 H' N
        return (maxsize);" u* P2 f6 h2 B' b: ~
}
5 m. u, X6 J/ }int dram_init(void)
* w# q, f8 W- B2 ~: `6 S7 e{
' F7 j- m2 e7 k0 S- k; A2 d        /* dram_init must store complete ramsize in gd->ram_size */
5 H" f! P1 M/ R        gd->ram_size = get_ram_size(& Z$ X1 r+ f+ O6 a# E! i& n. w
                        (void *)CONFIG_SYS_SDRAM_BASE,
* z3 K4 y0 t7 N  j% g. L                        CONFIG_MAX_RAM_BANK_SIZE);9 K* K1 N5 u! U2 ?3 [
        return 0;
. ~/ \; ^; w6 @% b: h5 k3 }* A8 ?}( F( N7 M. `" y7 `

' Y. r1 k& L; j2 j* m% I
  \0 O1 Z) s* K1 J; y' V; X
8 ~1 K/ J# ^, S1 t4 J4 I
" \' l2 l) c, eFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 I4 ^! E, x1 p4 b4 h* J+ }4 Z) n2 c- q# Y

4 ?5 ~! ?7 @' [8 ?6 `

" E+ _( T" {9 d9 X# j% D) l




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