嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 C# a4 W$ H1 v2 H( @6 T核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' @! u4 V9 W% l这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 I& l4 E( m  ~. I0 S

/ c3 A7 L. J2 [1 x2 S是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  M' X7 a. u5 e4 g0 h; W$ v7 s$ `" c9 {! a2 E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# I- |) U  M% D$ G  }% e
/*& \2 g  B1 i5 ?: }7 c8 b  {7 E$ Q
* Check memory range for valid RAM. A simple memory test determines
; L" g$ Q/ j6 L$ @+ ~* Z* the actually available RAM size between addresses `base' and
4 g; a' v7 W  c0 L( P* `base + maxsize'.; \. Q, s$ _) L* s3 g+ ], D+ |
*/
0 W: X* Y& Z5 E5 t' P! \) qlong get_ram_size(long *base, long maxsize)
' s% f2 {, w% C  I8 @2 x{
4 e, F0 B- d8 B: [; I$ n( k) z        volatile long *addr;
" P/ r( h( n" ~% S* p% m        long           save[32];8 V* e( ~. Q, j: c  L. v% b# v
        long           cnt;9 t* z1 n* {3 @) [2 A) s
        long           val;
' ?; @* ?1 ^- o        long           size;6 b( F: K/ e8 k5 {4 q: C6 M
        int            i = 0;' K1 x5 s& c9 A

$ t; V4 v, U9 H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% T! I9 t9 k) S: P1 g8 W8 m4 o                addr = base + cnt;        /* pointer arith! */+ w2 r. J; P+ Z7 Q* G: ?
                sync ();! K( q( s% o, e+ r: _+ i! _
                save[i++] = *addr;& Z8 W9 J, E9 L0 Y. B8 [
                sync ();. q; J1 h7 J& I; \, A0 H
                *addr = ~cnt;
9 b( z9 B* m+ m' V0 ^  i        }' {* r) N) {9 ]+ w) Y8 b# x

1 S3 b7 O+ F  l9 ^$ k0 v        addr = base;9 Y' l$ l: ^/ z
        sync ();
& P% G$ `  G7 r  D# ?2 `        save = *addr;% q  r* \4 s  Z; e# W# M
        sync ();  A1 `" }  O) T) A8 ^( m7 v5 _, K! t
        *addr = 0;1 }6 ^# g- U6 [4 R7 |' ^

! O! \/ f) f- s' l/ q        sync ();9 G1 k& j* o. Z9 @( z
        if ((val = *addr) != 0) {: L$ S& @! x" P3 f0 m* O' ~0 \
                /* Restore the original data before leaving the function." T  l4 M1 ~* N- _
                 */! {7 I+ I0 D, A* ~' x
                sync ();+ N( ~' y% }4 M: i* p6 K0 p
                *addr = save;
. Z2 [; X( k- M+ Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 w( l6 w, q  h  a" R
                        addr  = base + cnt;
1 }4 K8 u, w2 L8 [' `' H6 t% Q' m0 X: ?                        sync ();
& I/ `! {3 P& G, ?                        *addr = save[--i];
- g7 }+ Y( t4 W5 h$ J! d: @                }
; T; B! m" O. W* }. X                return (0);# K0 v2 }% F8 S! v5 x
        }
! y2 O+ l) a1 W0 E/ e/ j; |& n. L1 S1 Y, X8 M, n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 i+ x2 [9 P5 F( W$ |3 h                addr = base + cnt;        /* pointer arith! */: E+ j" _/ u$ A. `$ u
                val = *addr;
- u, V. E2 C4 O4 T: L$ T                *addr = save[--i];
  f+ H2 w; [) Y8 D8 C4 ?9 G% y& N8 n                if (val != ~cnt) {; S/ ?5 B0 \! [; v/ t
                        size = cnt * sizeof (long);
" ?! X/ J+ r  r0 v                        /* Restore the original data before leaving the function.
! X# n6 y+ |  V/ C* ^. Y                         */7 p; H( {/ }, t' ?6 E# R! w) U# b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 F% ]4 J- }! S) E                                addr  = base + cnt;
+ c4 y" Q# P: {! x( o0 n                                *addr = save[--i];
3 \, [% i/ ]2 b# K4 @, \( M                        }
! O7 c0 Z: I, S) m! c: w                        return (size);7 v3 e8 E: z6 |6 n% [
                }. P! Z) j- c5 X/ P! F! ^' y
        }9 h! D/ o' ^: [  B4 S7 u$ u+ _
, b1 m1 }7 J9 L6 z3 I6 U
        return (maxsize);
- y0 r0 a' q  e4 @" I& n7 I}
& B* h- T$ K7 Z: R. m5 [int dram_init(void)
, \8 I1 Y& X1 F{
1 V( H9 J; n" h9 ]7 y! V        /* dram_init must store complete ramsize in gd->ram_size */4 s& v/ I. N5 F2 L+ S6 J' A- S
        gd->ram_size = get_ram_size(
+ g/ l+ l& X) v% o* v) S4 h                        (void *)CONFIG_SYS_SDRAM_BASE,5 a$ p5 G+ a* e: V1 N! W
                        CONFIG_MAX_RAM_BANK_SIZE);
; l- g. v- g8 d% b1 A, c' ]2 L: E        return 0;0 |1 D% ~8 q# J7 f
}
3 u8 ]. t! v/ ?" |- j
: |: V+ a, A! S. F4 r
' d- o; {4 P! X( O. T# k. Y' ~
* ~0 P2 N( p' w  k2 m' K1 i2 D
' [& \' `  \; |) A0 P8 ^9 Z" xFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  E  l( c* y! `2 {9 N$ c* v

3 q# q* J' ]5 h/ ?& ^. ?7 |6 o# l8 Y! [' h$ s* K& z1 d, z
; M8 X8 v! b: ~6 U: L3 {0 t) D





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