嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# {& i! I) `/ n. o: x: t) k核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 b% a: a; u* L8 D2 F, Q  I2 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 d9 N6 g, q! b5 D) G

3 L" w9 G  r# e, X: J/ B是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ J/ B, p6 g. P
, K: n2 M- i: m: z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" H! n' T& G5 d1 v- q6 A/*
+ r4 ~; z8 Q2 \- d* Check memory range for valid RAM. A simple memory test determines$ ^/ c* `% x" o( O. Z, y; S) f
* the actually available RAM size between addresses `base' and$ i2 }1 b6 S# L5 Z4 \/ T1 K
* `base + maxsize'.
0 [, [. h. l$ X1 `' p9 l*// S- X; m  b4 n6 c% M
long get_ram_size(long *base, long maxsize)
5 T( e0 ^' W6 U{
& w( }* h3 T0 s% o        volatile long *addr;
+ S6 w3 A4 d$ |: Z2 O        long           save[32];
$ Z7 K: I4 M) a& l        long           cnt;
; D/ v/ e. A1 R8 a+ F8 y/ N        long           val;
5 }- k8 {3 ^. i* `        long           size;
! X, w. j" [/ R9 H; p1 f        int            i = 0;9 N+ H' \" m6 l: I

" j) B* n0 ~7 L. |8 H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 N. u. {/ [$ W2 w8 x, D                addr = base + cnt;        /* pointer arith! */
8 o6 y; p, M/ j3 j; I  y                sync ();3 f7 d. z/ l' ]1 j; t; [& p& l
                save[i++] = *addr;
7 R0 D( e  b) X                sync ();; v6 N) m6 _% m9 [. y* c3 q: r; e
                *addr = ~cnt;
1 T# H$ J( Y8 _3 n5 \2 ^        }
8 q# X: t/ ?2 `, j; A
' [, W9 N2 r! p% M5 o( z# g: ]0 B. W        addr = base;" R; J6 E3 g( a3 q  R! M9 m
        sync ();
2 H$ Z# a8 I% U        save = *addr;
* z; E, W5 ?3 N4 I        sync ();
+ t/ F& F6 C  A; u7 I3 K        *addr = 0;2 _! j/ a: Z9 V# D
; E  n6 B9 a8 I' I
        sync ();
9 w' m: R, u. r& R7 v        if ((val = *addr) != 0) {' c  R. P, G2 y6 B
                /* Restore the original data before leaving the function.) s/ T9 d) A" h7 M( ]' [
                 */
. z3 |. c5 ]+ R* {% Y0 W) t                sync ();/ B2 s! ^% p; Y; X6 p1 |& b' d5 T3 z
                *addr = save;
$ B& C+ O2 Q; B4 ^5 X                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% G# _- r, o& s9 G
                        addr  = base + cnt;
  m; c6 S8 z! q5 r  B                        sync ();  f+ Y" Z4 O$ R2 ]6 H' j5 J
                        *addr = save[--i];! p, }% k% U' _) `1 }1 u
                }
( ?: J3 S+ Q% |, e) m                return (0);8 l0 _7 [) z" b- L0 N2 r
        }/ R+ s' {0 \; z
* q" c  n* d. h" h7 e% z( N5 k5 e7 H# h+ B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 t; V  c' I6 k' I0 e$ W                addr = base + cnt;        /* pointer arith! */2 @* E) l8 o; ~# ]
                val = *addr;
) ~/ `8 y$ {* q, E' s; T# z# j( `                *addr = save[--i];, p0 z+ f8 S2 }* P' F
                if (val != ~cnt) {
1 }/ f, F- x' f! i5 S8 e0 G% K                        size = cnt * sizeof (long);8 y1 T1 M2 J' u# d4 s, f, ]
                        /* Restore the original data before leaving the function.
$ o/ S% E. _/ ]                         */
" ~- @- u, Z+ `& D: C( e                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ I6 c' M) _/ n4 h: L% ]                                addr  = base + cnt;
4 |7 Y, c  w- w) b/ d& g- A+ C                                *addr = save[--i];! y( Z% S. N8 p* ]) |
                        }
6 J- P- e, K5 h# @8 Y' R2 V                        return (size);, F- O  B& F' E# ~% t; i3 b, |
                }& F4 P2 r% ~5 L/ T
        }  G( o! O! H7 R

" o2 }$ ^0 d( U$ j5 N) Y* R0 t        return (maxsize);& Z! B4 M' R: R* P8 D
}
) h6 O1 r  B+ E2 l; ^7 \6 Yint dram_init(void)3 y; g' d9 _& A% k- G
{( [) E" Q; h& J! ?
        /* dram_init must store complete ramsize in gd->ram_size */
( F  ^& J4 G9 Z, ^3 D5 l4 `7 d        gd->ram_size = get_ram_size(
) d$ s9 H9 k# ]) V1 j                        (void *)CONFIG_SYS_SDRAM_BASE,+ }4 ]$ e0 x# O( Y% Q! O2 M
                        CONFIG_MAX_RAM_BANK_SIZE);
( R5 n7 `. ?) n: r  ?" |  U# W$ E        return 0;
. o; N. I- I; z- A. L& D" C' k}
( M. X7 ~9 E! i# M# o
: {0 O9 R% E3 j4 n8 x5 M, f# ~1 v. T! Q# H4 m) x( e6 T

- u0 K* N/ X7 p2 T! R: H
8 x/ ^( c2 h# e4 W) C) CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) |: U8 \6 ]: M& Q: R
, |6 Y* O0 m8 L4 y+ _
1 S5 Y& z; q, G% G7 ^* I3 E
, m& p+ E6 y2 u+ d3 Z- l





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