嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( O+ b7 K  r% \& k  l
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 l, }1 Y1 W- F: ]! `3 B- y2 i这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 {/ a- e1 ~8 Y( b

% G/ _; z$ |/ g, b$ S' H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* m+ k' @: t- r
) d6 H) _+ b5 S! g6 R: I
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* @" x7 @+ b# }9 l
/*7 j; G; ^$ H# n8 ]7 J: O* W
* Check memory range for valid RAM. A simple memory test determines
2 Q2 Z9 G* S2 f  C( H" D+ i* }2 E8 l4 `* the actually available RAM size between addresses `base' and
: |; V2 t: \8 V% T. n7 P* `base + maxsize'.. m9 k. M7 F2 I$ E
*/7 K; n  c7 L+ h3 [' b* S0 O9 D
long get_ram_size(long *base, long maxsize)
' u" |% q( a$ Z$ B7 J{0 O: u( v& B( @* N
        volatile long *addr;
2 u: `8 ~- K1 o: x$ q2 F, m        long           save[32];
% o- o3 [  _* Y1 g: e        long           cnt;3 p  r% R* n; |  `; r! U  P/ K
        long           val;
4 N0 H0 H: b( L" ]( u        long           size;
! i, s. D- _1 u  N        int            i = 0;
2 |* y+ `; E: h4 b5 B
% F7 }; G4 e- h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. Q( K% S2 U0 p( K, F" T5 a* E# {
                addr = base + cnt;        /* pointer arith! */1 N4 o9 |8 p1 D' Q2 E
                sync ();
! o9 h3 {% k; {/ u& }0 Y6 M4 I4 h                save[i++] = *addr;
& r$ y6 s! @  U* z+ }  J                sync ();
- W/ l. t7 z8 ^% s- f0 i, D  V                *addr = ~cnt;+ h" H  q7 `6 {2 d* S- `
        }
" j# U7 {( H  ]2 _/ b$ c. \. G4 Q+ R; D+ @/ @6 X0 A
        addr = base;* j( c: S, e) r' ?9 Q- W  a; H
        sync ();7 o: T6 t4 r; P9 E! I
        save = *addr;
9 C- L, [% n; f8 G        sync ();
- D. l+ k* k  ^% c' E        *addr = 0;
1 u( P; [9 n- G8 v% e) r! D; K4 b! c4 ^6 {
        sync ();
! Z# H1 q+ `$ \) h        if ((val = *addr) != 0) {/ j+ x# y; I) o( i5 p; i  @
                /* Restore the original data before leaving the function.
* l8 e2 A' M9 l2 q" z0 E  T                 */, ^% H; B: }6 K" o1 `! U0 S+ D' G: V1 ^
                sync ();
6 Q4 H4 _' [* t                *addr = save;
% B! O( z- m) @& x. G                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 t; G  P2 d" w1 Q- c
                        addr  = base + cnt;
  N& X1 b: c* T9 U0 s. L9 v                        sync ();
- v0 ?7 Z4 M1 g' _) r2 l- Z                        *addr = save[--i];- U4 V% v3 ?( ^( O' [% l: ~0 ]
                }
1 m1 ^) ]: H8 H                return (0);
/ k6 J% d' s$ e2 O        }
' t# _6 e3 t$ N  ]5 h  C9 I% ?2 [* U5 k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' W& y; d8 T5 o; X                addr = base + cnt;        /* pointer arith! */- i2 M2 E) H+ x! v& k: w, v3 ^; R! K
                val = *addr;
8 Q8 G7 }' P. q6 {                *addr = save[--i];: l8 M6 q5 D# B# L0 j: m6 l
                if (val != ~cnt) {% v4 D9 n6 I8 c
                        size = cnt * sizeof (long);0 y( A# \3 N3 k$ ^
                        /* Restore the original data before leaving the function.
: W# R/ {$ S# G' D0 y                         *// s/ M! T8 k) O$ R- a6 O
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: Q4 F) E2 b! @# {                                addr  = base + cnt;4 H) `" U, C+ s. G7 O% e
                                *addr = save[--i];# @4 A  x. Y- Z9 v  N1 _
                        }
, D; z! L( o& B( I2 j6 G# g                        return (size);# J$ b* L) ?3 e( ^# x! Q) F0 o
                }6 v" {4 r9 X& t2 c- |8 g
        }" A" V7 {9 X" h' ~
1 a$ K/ p+ P: d" [' x8 p- o: F+ j
        return (maxsize);/ h" ?; ~0 Y3 `3 J' @3 [9 Z6 F. r
}8 }9 n$ V! w# l" @( C8 O$ o
int dram_init(void)
+ @  _/ E$ S- l; w{
# I# L" O5 ^! `/ k6 z        /* dram_init must store complete ramsize in gd->ram_size */' ]9 E* W3 k/ l. g; A* h
        gd->ram_size = get_ram_size(- j7 a) r, O! z+ D9 S/ K
                        (void *)CONFIG_SYS_SDRAM_BASE,9 D" J; d  A' m. t- Z- Y2 E8 |. ^
                        CONFIG_MAX_RAM_BANK_SIZE);
4 V0 e9 d& S% t9 u        return 0;
; p, w, r' S: w}
- V9 Z) l( Y6 d; s9 v6 J$ C: t1 k7 P2 o8 R- h
3 B, S5 Q, w1 G3 d3 Z) D

( @/ X+ x' B5 n9 `; @. c; W8 U9 o6 a( C3 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 i. N6 G+ {- q! F% Q3 o) h7 E) @$ C3 g
: i/ G. C( a- [9 e' q

& `% N! V% c1 c




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