嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" @8 H3 y. E* b4 S; q4 J# k核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 X6 h* s# |. \3 A* U) h4 }# N7 R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 u; z9 E, t4 ]
* l& E/ I6 |3 n8 u  N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; U" u# J: R! x. I* z

3 c% l4 @, o" S. Y) f
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  ^9 P4 h- G5 z; H. G/*' Z5 |4 H7 U2 |
* Check memory range for valid RAM. A simple memory test determines
" s( v% X8 c2 y! v( R7 S* the actually available RAM size between addresses `base' and- G* R! s' {  n- F6 X7 V' s0 K
* `base + maxsize'.
0 D" O# f& \+ N0 I*// I% t: H9 t! }0 z% E; M3 b$ Q
long get_ram_size(long *base, long maxsize), m1 A4 }2 x8 H* I9 t' M$ I) w. B: B
{
2 E2 U  J4 c7 r) g( s        volatile long *addr;7 q/ z! h! H/ t7 h5 Z
        long           save[32];
$ M% F0 j3 K2 Y; x: [) G0 o        long           cnt;: L% s0 H$ Y& Y- {
        long           val;
0 S  Z. w( P5 Z        long           size;
. L8 K: |$ n+ x: o        int            i = 0;
8 `: |+ o+ ]( H) i
, ~- {( B. a) q0 V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; o" j) d$ s3 T: a% m* S# q                addr = base + cnt;        /* pointer arith! */2 j; [% [/ @  q
                sync ();
$ N1 u( J* ]: M; [                save[i++] = *addr;9 t6 n1 i, b; p( r
                sync ();
6 i6 g1 d! o8 L: e                *addr = ~cnt;
% K. k  }* `9 W        }& e2 ~' s1 b& m" w

  k5 S# e* V6 V! Q- J6 u: A        addr = base;
( c% a- \% _( c5 c0 o2 Z        sync ();
9 Z& T4 X, r  b- ?        save = *addr;( V( f: F7 Q' S/ V
        sync ();) n: q1 Y" h# V  W5 \
        *addr = 0;% B% b- B, i* H# q- h
  B2 |* `% g5 h( Y5 K$ R2 X
        sync ();# Z: J: B. s9 [+ i. D
        if ((val = *addr) != 0) {+ p' x/ O0 O  l4 x* q6 _1 i$ _0 }
                /* Restore the original data before leaving the function.& V/ s* }9 ^, `* M3 u
                 */1 s/ I8 U7 e* M0 c8 I9 e  W
                sync ();
8 t* s3 a' e$ {5 B                *addr = save;
6 p% Q- c5 A  w4 E& e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# q0 @2 C. U; Y- A% k
                        addr  = base + cnt;
- Z+ X  N# d! J: N                        sync ();
2 O) A- r: P* Z; z! ]0 G                        *addr = save[--i];
8 |  _& l5 f- f  @2 E/ o& O( H                }
+ l  {% {: J" H                return (0);
2 s- ]' }; ^/ U4 k) c: w0 p2 b- f! @        }0 T; N' d9 z) x; }2 N

. E+ [# u1 K+ H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 `  i8 |" X6 p" A
                addr = base + cnt;        /* pointer arith! */* p- v, I4 i( t9 O" G" H) X5 f
                val = *addr;
9 j4 g7 [8 ?, P9 h+ W. R) w+ A/ ~                *addr = save[--i];. {) J0 R# ^, u" ~6 H+ E/ c# o
                if (val != ~cnt) {$ b5 @) j" V. W4 ~: ~
                        size = cnt * sizeof (long);
& O$ _/ z9 y/ b0 T4 w+ G) t( R                        /* Restore the original data before leaving the function.
( Q- J' i* T# e) o4 J                         */% U; B5 v% c7 O! u4 F
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, u1 F$ d1 O& ]2 S
                                addr  = base + cnt;
9 g" h5 J& r- Q2 r5 c                                *addr = save[--i];
1 w5 ~. W1 m$ l, V                        }
( h+ d0 b5 s& M8 p8 U                        return (size);# ~4 l. O. S' C, S
                }! R4 m6 a9 Z5 f0 B! ~  Y" K/ D
        }
3 J2 o9 |& q% d
6 S8 u! [4 \4 }$ v. j        return (maxsize);$ g$ v# v- M6 r( m$ [$ ~
}
) B8 S8 l! I1 Z3 a! ?' z! ]7 mint dram_init(void), i+ y6 }! o  X  q3 G
{
/ d  i" A0 }/ E; l* U        /* dram_init must store complete ramsize in gd->ram_size */- X3 W( M4 _! I, ]& H; H7 r* E: [
        gd->ram_size = get_ram_size() ]" N7 U+ T3 Y8 @& W2 |
                        (void *)CONFIG_SYS_SDRAM_BASE,$ S% L  M! ?  Z
                        CONFIG_MAX_RAM_BANK_SIZE);# S+ T% c) y$ F) |9 M" l: f
        return 0;
, ]3 Y7 j% @' }9 v}
: {" S( u! G# R; Z- U9 G9 y# d$ ?) o+ J4 f: V# F; V- s

# D1 `2 h4 u; V! p0 t# c# X+ d; P$ ~/ H; l7 C, X& `: `7 S5 h: A

  l4 \; M6 r. b1 Z/ iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 \& M+ m, y0 t
2 ?! D! }( f# j" i2 q" r; v7 b

1 w& C* h' |+ G' v, A

) U4 K: z6 ], V' L+ N( E& k6 S/ p




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