嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! r( L- l8 \3 d- r( T* ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit- t1 n+ H9 N; Z- J8 e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' B) i: O7 e: O& X

' `3 U' h' s/ F) u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- V0 P. ?. V1 S: ?+ L; ]# e

) k# N3 X2 K  u5 f' t! V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 P/ x. {0 r) H! F/ ]/*
4 [# Q+ [; y( C/ F8 y* Check memory range for valid RAM. A simple memory test determines
0 M2 S; M* l! m1 n* the actually available RAM size between addresses `base' and
" m! u1 j: l8 Q3 F* `base + maxsize'.
- ]3 u! {6 g4 C" l$ \*/( F+ l# x% b) h% c0 O% v) ~
long get_ram_size(long *base, long maxsize)0 x2 g$ ^; T* O* B1 {1 N9 |
{- O/ Y: V  ^1 K6 U7 ^) S; e, T# \
        volatile long *addr;
: E$ g# u2 Q; B  i        long           save[32];. S- l2 O; ^$ N) |( M
        long           cnt;
7 u5 K4 o8 T  Q; h1 a        long           val;: ?: ]( ~" N8 ~+ L" _6 x% ~
        long           size;0 A) e, h5 ?5 v  }$ h! g, X
        int            i = 0;
+ R4 T. z; K: s8 y7 [3 o, U* }/ X
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 B# s( y3 o' D( P! S
                addr = base + cnt;        /* pointer arith! */
4 j& s$ E2 u( m8 ]$ m                sync ();8 A% s; P6 G- O6 t1 G5 r* H0 J* z
                save[i++] = *addr;
' [& G; b: n# ]! x                sync ();3 }$ h( q# L5 |
                *addr = ~cnt;% E. q% Z: s0 Q( B
        }
: q/ J; }  J  \4 ]
5 ^# J1 m4 ]& O        addr = base;
! t1 I! {# L0 ^        sync ();- n+ X4 H- n4 g1 A% B
        save = *addr;- @. ?" W* ]! n
        sync ();
1 X5 Z2 V  S0 z1 K) }0 s        *addr = 0;
+ P' ?5 M" {; p9 v( _8 I. M
( u, _# j, ?: R        sync ();8 o1 x( Y' p; z" X1 Q1 X( t8 T
        if ((val = *addr) != 0) {
- s2 z3 `/ A- o  ~                /* Restore the original data before leaving the function.  m3 B# m: q! A3 N3 G
                 */& v0 a, l, k* D  _: Y' o
                sync ();
6 l9 V+ h" i, @: d% n  a                *addr = save;) ~0 ?" V# N/ z7 o& z& \
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& s* y8 i) l" B; c/ y: X; ^4 h
                        addr  = base + cnt;3 g; K' d" b5 f1 m6 d, {3 N
                        sync ();
* p# R4 i9 [. L( I% J2 k! B8 W                        *addr = save[--i];9 {" L+ ]- g( z5 T1 V# d, v3 A: {* k
                }
. Q+ j, ?8 O: {                return (0);
$ R% O8 J) P6 }' C  l5 @        }; u+ |3 ^9 V# J' \9 p  r

$ O1 c4 t2 O1 i; l# J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ~8 H! A# {2 f7 T
                addr = base + cnt;        /* pointer arith! */2 Z5 f% y& C* s2 ?' g' _
                val = *addr;
% B3 n- P( X  ]9 ^& y                *addr = save[--i];: v- [, ], L9 P8 I
                if (val != ~cnt) {
* e* D2 S4 z1 ]4 Y" p                        size = cnt * sizeof (long);) Y* M8 V" ^6 R! z8 ^: m$ D- t5 r# Q8 _
                        /* Restore the original data before leaving the function.
# Q6 Y2 F) ~+ _" |8 k! l                         */
( l% O  a6 u! L" \) a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 ^7 x' |8 M+ Z
                                addr  = base + cnt;
4 b" r/ x& i4 v6 A$ A1 o* Z* V* m- y  D                                *addr = save[--i];
& q# m. x4 f* @/ j  C. w6 ]7 ?. m+ F                        }
& w$ @8 n. V  g2 X$ c                        return (size);/ l# X+ B! S% v& f' ?% ~
                }
2 F. ^4 Y) v* r+ j' h& [        }/ B/ c) @. u% X: A% w
- }- C! K) j) V+ ^, g+ c7 @
        return (maxsize);6 T9 b4 h$ g! Z: o+ J1 ]
}7 k3 U9 ~& V3 @+ H: P# u: M/ e
int dram_init(void)
2 K8 |. u/ f$ x0 Z/ z* q{, i4 c( L, C0 h7 f
        /* dram_init must store complete ramsize in gd->ram_size */
1 n3 q: n3 E5 b! i9 i6 |        gd->ram_size = get_ram_size(
; a8 U0 J% x% V6 X5 A, L                        (void *)CONFIG_SYS_SDRAM_BASE,
5 }; p1 K( G( J5 c8 w, w4 S                        CONFIG_MAX_RAM_BANK_SIZE);
  V% ^7 N) P+ O2 N% b* f. b        return 0;* r/ N3 t1 v, J6 f( @. T; a7 H
}$ P+ T9 w3 @1 @0 l+ `

  U4 G; |0 \3 C6 G) {7 s' r  n' s$ Z2 L

) J9 h# h3 S4 w$ |& S8 b3 P1 |4 _
- P. J+ i, S7 a- M3 \# F% VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; l4 Z) \* H3 P! C4 _+ u: l' N1 M2 o% {! c1 r. T8 }  M7 x  z+ ]/ O0 `

# B) H+ p' Q4 a: Y! k4 T

- d! g4 B) S, P, q( _& M




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