嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* H; `8 n% a5 c7 w3 g) w核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 ^$ N! d7 k8 I+ t7 q8 M4 C这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, A& l- t( K. D$ R
# c6 R$ ], c! s1 M  O% w5 G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' w( K7 M0 d  h( b/ }( Z+ T8 ^7 q0 W/ N

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% e1 S  Q) |% R$ [3 X
/*# w  t) C9 v. T( ~6 T7 L
* Check memory range for valid RAM. A simple memory test determines
; S7 o& d5 I* P) V1 B- S* the actually available RAM size between addresses `base' and
5 l2 |7 ^6 ?' B- H( N! l0 T  Y* `base + maxsize'.7 T4 u2 \2 [6 F
*/  C: K; p! u8 g2 W- e
long get_ram_size(long *base, long maxsize)+ X7 Q+ M4 _" \  `! U- V9 {0 R
{
1 f7 ]6 |- d5 p5 l: Z9 [        volatile long *addr;9 U/ K& g3 y* N$ S
        long           save[32];2 I+ v) M+ Z/ e
        long           cnt;
3 k) d0 h; a. P  X: i        long           val;/ P5 R2 _! Z; s- `
        long           size;
7 Q4 |' J5 U% x/ E# O. ]: {- ~        int            i = 0;* [5 X* ~  l( _! g$ n

; j5 p* i. m! @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' T4 J1 f" E3 u& h' l& {$ U                addr = base + cnt;        /* pointer arith! */: j/ S: X2 F9 T1 |# S
                sync ();
$ H4 g1 m' r+ e# U0 N& K. M! b# n) _                save[i++] = *addr;+ a# d; a9 p' J& y+ n& G$ D+ ^9 M
                sync ();; y- \7 K6 m9 Z$ I$ m2 U
                *addr = ~cnt;7 b' z7 h8 Q: S& n! V7 _3 ?- ~9 b
        }
& n2 u( O# I, T. f2 L" }- f* I
% X5 a. F- f9 s0 @" y' ]% G        addr = base;
4 b: s$ M/ B7 A7 ]! J5 P+ V        sync ();" Z9 b$ ?9 `6 R4 o; K6 C
        save = *addr;
/ p' W4 `- K5 e        sync ();3 z$ I2 {3 L# `' K, B9 y
        *addr = 0;
6 ?8 [8 K# ^5 ?: _4 D4 ^! G" c6 K' c0 G1 m
        sync ();
3 @' p' a! A# g+ v( W5 P; x        if ((val = *addr) != 0) {$ K5 w  L6 S; f% I' b, K
                /* Restore the original data before leaving the function.$ o5 v- G# v" ?# D- E
                 */
1 b3 D+ V& `2 W  C, o+ C                sync ();4 y) J+ ?* `* `* L% t& Z
                *addr = save;
* u- C, h' V3 G4 j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- d  \3 [3 S* h  K- Q; K                        addr  = base + cnt;
" N1 o0 |3 M1 w" |4 R                        sync ();
$ G8 y2 U) a) `$ g6 x                        *addr = save[--i];
) e6 k8 M2 h( z, g8 \, T                }5 ]7 ~- e2 N, u9 T' h. L  E
                return (0);: `7 E5 J3 G) z5 C- V% R
        }, `4 ^6 g- @) ^: W: |
& h0 T' \: _3 o# y  I+ c9 E' R
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- \8 g6 s. p9 |
                addr = base + cnt;        /* pointer arith! */
0 P$ L" U# }5 z7 }5 s" u1 O3 t" ^                val = *addr;2 u9 X- S9 x& a3 f
                *addr = save[--i];% ~* C8 W5 H4 a: W) j$ y
                if (val != ~cnt) {
. }" @& K% T3 y" Z                        size = cnt * sizeof (long);: f6 S/ a  @. x
                        /* Restore the original data before leaving the function." Q8 G: l" o* s9 ?: @) P
                         */
2 s6 A* M- n. U# \, N: q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& E$ H2 d$ l0 i$ V
                                addr  = base + cnt;
/ W9 M  A5 d5 Z0 w) n                                *addr = save[--i];/ s- N  D0 f1 k
                        }
! f: }( ?* N0 \2 h/ e- ~4 e                        return (size);/ S" h! H3 E) V$ _
                }4 U6 s  G* B1 v( K# G9 }4 f
        }+ _; ]1 l3 u5 l' G
/ [" N5 ^; Z1 W6 E) o9 |
        return (maxsize);
& D3 R6 I4 c6 h: P6 Q}1 Y- M! K9 n0 t  _8 U! n8 ^
int dram_init(void): O. D% {" u4 Q8 o4 A/ Z, v) f/ M2 Q
{
0 u" j: D( v) z! H1 @/ Q4 u1 k        /* dram_init must store complete ramsize in gd->ram_size */% m! u  Y7 `4 x
        gd->ram_size = get_ram_size(* ^6 p9 @0 h$ ^8 z8 }: j
                        (void *)CONFIG_SYS_SDRAM_BASE,
) A% S% Y7 }& R- T                        CONFIG_MAX_RAM_BANK_SIZE);
. L. O, `6 `# m+ a; [' E7 T        return 0;$ W% F' M1 R! f' o, f3 U
}6 f) H3 E; @4 J( X

6 b$ k4 r3 }1 B- H3 D
4 I. T6 {# l' a' |; b) j) S7 }
/ ?3 D0 ?8 G2 R& i$ E  m" V/ [. y, U2 P' H+ D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 a7 H9 u1 k( H
  k2 ~- m, f) U% R5 g/ A! [

& B$ D3 M; j! i+ E& J

! H) G& q- d8 R, _& G




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