嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  I# _* @% F$ G- R' b7 {0 u, H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  E7 I0 [* f3 V' ?9 B! x1 x
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" L8 Z; l" W, i1 q( r; l% P5 N4 }% Q) m: F8 m/ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* I; [; m# C! }7 X+ k. i) t$ S* ?# [& I; m% T

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& [. k  g  B4 Q: D6 H* a- @/*& S" z0 c0 f  c. O$ j) q# O
* Check memory range for valid RAM. A simple memory test determines
. M5 M, Z/ u: C* the actually available RAM size between addresses `base' and
( i2 [/ p; D$ h: q* `base + maxsize'.' O: n& {" O5 g7 b# Y
*/
6 z: n- x4 T" U9 C9 Flong get_ram_size(long *base, long maxsize)
( l; N$ ^1 y4 F9 t$ {2 e; K. I' R' p0 U{. u; b  Y7 F3 v8 X9 B
        volatile long *addr;
" {& F1 ?; R  g8 B% ?* Q        long           save[32];
9 U5 y$ O1 e' ]: E, U/ }        long           cnt;. j: d' A6 M& @' P* }6 G
        long           val;, @6 y3 u& A- V% w
        long           size;
- d5 ?: v) M; x* A& J3 }3 E5 }# }        int            i = 0;
- @8 k2 s- O. W. _& b
7 x7 }& ~/ y! T1 w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 U& D! r/ S3 T* |- V/ U                addr = base + cnt;        /* pointer arith! */
1 z  d- e$ }3 J+ C+ p% Y# Y                sync ();, J4 S7 Y/ t: ~; }& ]
                save[i++] = *addr;+ c/ B$ t& l/ [5 A+ x  Z
                sync ();
3 m2 l9 g  L4 I+ ]3 S8 {$ @3 m" m$ a                *addr = ~cnt;
2 X1 F; C' V' M% G3 C, U        }
, N/ }( I/ N+ v: H
! p! I7 Q2 D9 k        addr = base;
/ ?# W# A7 Q' p" {/ G) ?* J        sync ();; i- }  L- T) {" ]- [6 e, G
        save = *addr;" J3 I* P7 V9 @% D. T8 \/ E
        sync ();! k& M- T3 X& N$ G7 s* k. R
        *addr = 0;
1 w  h! C' P# G' K$ \# ^: e- O8 e" B; z. t$ ?6 ?5 J$ l# X% H& b
        sync ();
/ j- s1 ]. H8 A7 V5 q; X% D        if ((val = *addr) != 0) {( U2 Q- J6 l4 r& q
                /* Restore the original data before leaving the function.4 o8 y6 ?6 b/ K! C* f
                 */
5 B4 x; z6 t9 [/ O! q                sync ();
# M& ]3 V+ y+ F# p/ y9 l. Q                *addr = save;2 A" W1 k* U5 \- i  U: {5 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ B/ H& t/ u$ m/ f4 Q. g6 B
                        addr  = base + cnt;
% M) K7 ^" n  b0 Q+ Y                        sync ();
& i& W9 l3 y) @; p$ Y. ?$ J9 }* T* u                        *addr = save[--i];
) w! n, g5 ]1 Y6 [+ h: h  Z                }
, e# C) \/ X5 L5 ~                return (0);* r; j! d0 {8 `4 d, \& W
        }( ~! `5 U) B; A! Q

4 Y  t9 I+ i. E) R        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 X5 C1 Y  q) @- G+ _
                addr = base + cnt;        /* pointer arith! */6 x" D' A2 k$ k" Q; P* f8 M' X9 I
                val = *addr;
+ ~& A6 }# e# u% M! h& k! u9 M& t                *addr = save[--i];' o  {, T  J; W- f7 n$ z
                if (val != ~cnt) {
) [* Z- k+ N3 s* s# X& h$ f) W. v                        size = cnt * sizeof (long);
# F: V' W+ `" |5 q- d- Y' v                        /* Restore the original data before leaving the function.
; d" e' m! W5 Y+ \+ U& ~/ p                         */) F1 t6 b8 }7 e* t
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 t8 Y2 w3 z! I, c. r( ^9 \
                                addr  = base + cnt;9 x1 @' i% l& Z) e
                                *addr = save[--i];. _. E) y* q; t. I2 H& v
                        }. }6 @2 a. L9 m2 `- U7 p9 K5 m2 J/ u( g
                        return (size);
  a& N) R; M/ q$ x8 f$ r5 N# P2 c                }
& p9 b3 P7 a4 E$ A. ?# F; o        }! A; G9 O) t& K- M. i
- Q2 s& @* m0 w  j' R" U
        return (maxsize);
8 ?8 f' B5 N5 u4 T( Y( Y}
: E# o0 F, u& a8 iint dram_init(void)$ m( i2 A% f2 K6 u/ Z/ I
{
' `9 ]) O2 h7 M& d: ]" O- B        /* dram_init must store complete ramsize in gd->ram_size */
- m; c+ h" s  w! e! w        gd->ram_size = get_ram_size(
: y/ Y9 z( M+ {, q" ]                        (void *)CONFIG_SYS_SDRAM_BASE,+ B- t/ a0 f3 v& v6 @( m
                        CONFIG_MAX_RAM_BANK_SIZE);
" H/ _# ~0 U; E" R        return 0;( m, x' Z: W+ Q9 q
}" ]; d. d- Z( Z1 h7 l

% e3 {7 {0 t+ h
3 O* S$ o8 @2 e4 ~( D* E: S
3 l& |9 F( R2 E; \8 m
! b# E! ^' `! H( U5 dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 c# f) I% k& L. D

) U9 u7 \1 D6 C3 H
, y& f' E2 a. X# J' [

! P! _  ~$ z. [




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