嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* F! W% S6 s7 @# p+ S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit# a5 T5 R! l' {- D. P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 s4 f5 K6 v4 j  h# O3 n8 c5 b: o" r( v- ~/ |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ n7 P: w8 i9 I2 S5 R+ Q
2 v1 E( M+ |  M

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& |% @0 C& M( L
/*
& O9 l- L' Q% L7 {* Check memory range for valid RAM. A simple memory test determines
# C: J+ r, O3 }* the actually available RAM size between addresses `base' and  p! n: c8 d* B
* `base + maxsize'.
+ k2 t/ z# N$ H. e. l* g*/5 m3 c6 H& G& K& a" v, i9 |/ |
long get_ram_size(long *base, long maxsize)2 ~) {6 `, j6 d- `5 S( b! |
{
2 l, m  ]& Q; G" G: P        volatile long *addr;
& f# z4 ]& `% r8 H) f7 ]        long           save[32];
8 K2 i! x! d( i  G: V" L9 `8 L2 w. n* d        long           cnt;
5 V  [: |' q5 h( Q1 {( I        long           val;$ D/ k/ b# N' ]- p1 c! a
        long           size;
! _; Y$ V4 T" y        int            i = 0;/ B9 S5 W1 e  s+ f4 ^5 I7 L6 L

4 [- F7 w: F% h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% r# ^( u' {  t  w( p- q& v! [
                addr = base + cnt;        /* pointer arith! */! \# n. m, k) x2 j! D
                sync ();* I: b5 [- L9 y
                save[i++] = *addr;+ I: |# D+ `( O9 o$ x1 D
                sync ();6 z+ y0 q4 |5 L9 i7 s! S
                *addr = ~cnt;
; Y( `  Y4 B& l# ~5 T        }0 [& W5 ~% i: Q/ m8 O) V1 U

- m# ]! K* M9 \$ Z" G        addr = base;& U5 w2 |  @: v, p
        sync ();
. y) q  Q5 v8 u! {  W1 |  Q9 `9 B        save = *addr;+ X. ~' d8 q: X6 k! `# V
        sync ();
" H% g; V; Y: s" c& C- r4 R8 f. j        *addr = 0;* s& g1 C! t/ D2 v$ V) h# F

0 F0 J0 e0 y. z        sync ();' E+ g$ n" \! m+ Y& M9 o
        if ((val = *addr) != 0) {
7 s8 @: A( E# Q3 i  s- Q                /* Restore the original data before leaving the function./ N% ?/ \* f1 F' q6 Z8 Z
                 */
8 w) B2 o5 X/ s                sync ();
) O; ]5 v, E+ `1 g: t                *addr = save;
, v' B5 A: w# [4 r4 Z4 _" [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  s1 o0 ]7 ^8 ]8 \  f1 e                        addr  = base + cnt;9 t5 ?# z* T* a; \, l& d: r
                        sync ();% l' l0 `- c! F- l3 l* ]
                        *addr = save[--i];
) x8 P0 ]  ^: M( m* P2 }; M. x* f                }5 f+ i$ @( u2 ]" g3 i. R
                return (0);* |+ K# e6 v. [! p9 `7 |% X9 w2 R7 ?
        }: W- Y; C5 K0 a% x) j2 @4 @

3 a% E, Z& f2 }3 P! t% ?/ s) {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 q) v0 ]5 R. C" t% W* q3 o+ C                addr = base + cnt;        /* pointer arith! */
+ x$ m% y$ z5 Z! |7 `                val = *addr;/ j2 M7 t' J  O4 L& m0 i
                *addr = save[--i];
3 V9 C1 {3 p2 Q                if (val != ~cnt) {
# B' K( F( o+ L& A$ k                        size = cnt * sizeof (long);: w3 D2 W0 [) r3 k& J; h
                        /* Restore the original data before leaving the function.
3 ^7 y! o: j: y                         */6 k8 {# J# G8 ~4 J# F9 [5 _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ q" l% B4 E' Y# g6 {, T9 C
                                addr  = base + cnt;+ Y6 N7 l/ k6 Z' G
                                *addr = save[--i];
6 v- k8 x$ k5 `0 A                        }2 s/ a, c% l3 R( l: K1 M$ a
                        return (size);* `* `( Y' K2 [1 m
                }
, X, i+ Z. O+ f* T4 h        }
6 Y4 n6 H8 J* T( s8 Q+ v& j4 V6 ~% ~' M( O$ ?: V
        return (maxsize);3 f- o4 ?. X* W2 ?- d
}
& ]* [" L( ^2 N$ r; K; nint dram_init(void)
$ s# s( {+ r( R0 g$ k{
7 Z/ X5 \; M. ]  I        /* dram_init must store complete ramsize in gd->ram_size */( [9 V5 f$ ^) Y: ]
        gd->ram_size = get_ram_size(9 R) o1 K' ?- y+ C$ P
                        (void *)CONFIG_SYS_SDRAM_BASE,
$ b" g* l' e# W4 m( ]6 M6 K- r4 K0 h                        CONFIG_MAX_RAM_BANK_SIZE);; ]" D+ |6 |% u( w0 d( n3 M* M
        return 0;
  C+ M0 ~4 q" h; S6 N}
+ i; \) P. x4 ]
3 ~0 j# W" K1 U2 Q- O, @2 R" B' _
" U) X% L) I+ X8 U! P! Z4 G
$ Z; I6 x( h* U% d
: O# T# r0 Y; v4 u  F7 zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# |7 Q$ U+ g/ ~" ]6 r

6 X7 m, [$ S& ~) [6 {5 D7 C0 U# ]* Z* j0 a" V+ R$ H& k# {& p9 I
6 A. @* S9 W1 U" j





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