嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' k+ j/ l; @% d- Y' q% J核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 T. s6 m. E. a  U- p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 K/ k& @+ R1 X& x& N

* G+ N( g3 g; m, F是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. K" e/ A7 r$ i
  S/ g3 p, W) Z. [/ f4 r
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 ^  D  v# [, i) N/*& I8 r( L5 Y3 i" [3 L, C
* Check memory range for valid RAM. A simple memory test determines  \8 R% ^  Q2 J+ g1 O" L
* the actually available RAM size between addresses `base' and
; p4 _) b" x, y) b& }* `base + maxsize'.
9 s# i. H' g; L- ^6 b3 W*/. |* m9 D. W; {
long get_ram_size(long *base, long maxsize)
" h9 D+ ^7 t2 J# V9 e{" W8 V( x7 r  E6 a
        volatile long *addr;- x  f* D; Z4 ]" p( E$ \& U
        long           save[32];
' R3 O. _( h0 a+ h1 d2 V        long           cnt;! B. G1 G6 T% W' t% B: A( P
        long           val;" G: |4 Z4 ^/ ^" W
        long           size;9 r7 A* f$ G, X+ ~' N1 N; R
        int            i = 0;
, x* M& p$ }: A1 N  ?  |% n, M0 ~1 n! {1 C
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  C* z+ G7 S" a: g                addr = base + cnt;        /* pointer arith! */" G% w4 S& k  r- ~/ g8 o; ^2 v+ Y' H$ u
                sync ();2 ?9 o) `# [+ S4 h7 z' V8 A
                save[i++] = *addr;, O8 }! b  ?/ A- }! o
                sync ();
" Y5 q" Z* N: A1 x! |  Y3 p                *addr = ~cnt;
; Z; |+ V, }: j- Q' U        }
$ S) e' R) v+ P: H9 p% O+ K2 {" t; F5 }
        addr = base;
$ x: [6 {; |& p7 C$ {( `- c        sync ();
1 Q. G5 [; Z1 |7 t        save = *addr;
. J6 E1 \$ P; \- |- z% l3 v        sync ();0 B/ a* n1 _7 }' I4 e8 D
        *addr = 0;& V  I2 g! f  i5 |; y; O
5 b+ N4 A  X$ x! {, m, k
        sync ();# Y" j4 C* a- ^. ~" k3 e) @
        if ((val = *addr) != 0) {8 |; @) l' w% e- L& I
                /* Restore the original data before leaving the function.
' w5 l# i9 u& X% c                 */3 w6 X# L/ Z$ Q8 q( A9 Z
                sync ();9 B) F7 n/ Q# R' Z4 \* W3 u- i
                *addr = save;
- t$ C3 x: d- H8 F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 t7 d3 g. z& e1 V/ s$ b- g8 s$ b3 n                        addr  = base + cnt;4 p( W- I  F/ R2 T. h0 K9 Y, u
                        sync ();
% k# d2 T2 d  }# z! B! ]$ E' Z9 z0 v% @                        *addr = save[--i];; |+ e5 N- C$ K4 o2 P% j- E7 J
                }8 H$ c. I  Z* C6 A
                return (0);7 u5 Z, r/ v& R/ I# @
        }
' T% A; v2 c, K1 K( \9 \6 C6 H7 L1 {$ L/ O8 m
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Q8 T. \6 s# l3 m, e                addr = base + cnt;        /* pointer arith! */
( v# W" k9 E4 {: C                val = *addr;
9 B  o& m* w7 ]  H                *addr = save[--i];7 S! R6 i, a! U1 l% n: B! f$ v
                if (val != ~cnt) {
$ p( T5 E: e0 r                        size = cnt * sizeof (long);
3 g7 T9 a9 L* m# C                        /* Restore the original data before leaving the function.
7 R2 ]; l3 I9 u. N, K2 H+ |% ^                         */
& C7 F# e. O5 f" p* ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) }3 D' \* k$ v: z3 ^9 m
                                addr  = base + cnt;) @6 k/ e8 l7 A* G# s& c. c, _5 h
                                *addr = save[--i];& V' d) c, F* D5 b- H
                        }4 i! @+ @. K1 l% I" `, j" r
                        return (size);
. l# t  b% A* [                }. ]3 U# @% V! ^0 y6 F8 n" q0 M
        }
1 H6 D. f# V4 y
5 }8 i4 I! k: E. D4 w5 Q9 o  R        return (maxsize);
( }6 f" _2 P: D' A}
% O: C. N0 x4 {* {" b. @7 O. Z& nint dram_init(void)- u* j. b7 b8 ?- s! B
{' ~/ m3 a) J9 p* [# L+ C4 P
        /* dram_init must store complete ramsize in gd->ram_size */
( _3 ]* @5 r) D+ |. c        gd->ram_size = get_ram_size(
; R- t: V+ L1 E8 N1 o9 u0 D' l+ X  {                        (void *)CONFIG_SYS_SDRAM_BASE,
2 T" S) r  c" j  Q# b                        CONFIG_MAX_RAM_BANK_SIZE);' o8 Z; ^) p7 k. h1 `8 H
        return 0;
+ u# t; C* f' a  Z, V}
. O' ^7 {, `$ I. V3 G. R
, E; i' ]! C2 ~4 k7 \# a- s% M$ U6 w. Y9 ]! t; T
/ s$ B* Y. |9 E  k! H7 k

  w: ^4 |3 i7 T& }9 ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 v! a  ?2 _$ L" L* c/ ~7 ^7 x$ |. r' d; [/ a: U, J
  M) R' k6 q& _# Z

- X. c. ?, u+ i. h




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