嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) L' Q4 V8 S% K& Y; k0 f* R核心板2:DDR2 256M Byte   NAND FLASH 8G bit* ]8 C- S+ h# E+ n5 E; @: R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) _* V! l" h3 Z
7 F  o) g" Q1 P$ H) W: ]& U, p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 [6 F  a, D7 A1 n
4 S7 I' x9 r, C- Q; K+ z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 b9 w9 V( a# W1 O2 p/*/ Z$ C) r' U, e6 G- o7 W
* Check memory range for valid RAM. A simple memory test determines
5 Y7 q( ]  g. J- k* the actually available RAM size between addresses `base' and
1 ?  I! w9 T1 ^- o1 j* `base + maxsize'.; J, o" H& M* H$ E2 F3 X
*/
. C2 d" m; K7 Jlong get_ram_size(long *base, long maxsize)
. Z1 q2 D4 Z1 P- @{
4 e" D7 L6 ?- w3 K3 }        volatile long *addr;. b* \1 l* @# L
        long           save[32];7 r: _) |5 N9 r5 l7 [
        long           cnt;* j2 f! `( f& O+ _" q
        long           val;$ ~9 I+ E" }% ]$ O$ H8 {, \
        long           size;
5 h$ s3 a0 a: r  Q3 Q4 K- [/ g0 A        int            i = 0;
# ^3 B$ j  x% F. n9 e
5 `# t7 T. m  J7 y& o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* _$ b* T6 o$ Y                addr = base + cnt;        /* pointer arith! */
; U  |- F4 u2 q, G                sync ();/ \( i( V, U8 D/ t3 [
                save[i++] = *addr;
+ G+ i% n1 X' E! P4 R) O/ j                sync ();
& ?1 b1 X+ A% y8 y6 f% o7 D                *addr = ~cnt;0 D0 D+ \: ^6 J2 U5 w" T
        }
* E, V8 A& j  \3 O
( p1 O) m2 i) F# w        addr = base;
% ~- k0 C4 X+ o$ P2 Q6 l4 [        sync ();3 @/ X* o2 Z/ R# s& ~; _3 b" M+ [
        save = *addr;$ G4 `8 ~8 o+ _7 T$ _: D( C6 ~
        sync ();
) H, D5 w. F6 s- v! ]        *addr = 0;
- L3 D4 W4 [, N' o
6 M4 D8 q! ]9 o" o' Z6 s3 v        sync ();: ]# d6 U7 K  u/ @  |
        if ((val = *addr) != 0) {
6 ~. _% n4 F2 n5 c2 E! V, F# s                /* Restore the original data before leaving the function.* \# I' \5 r4 Y: |  [
                 */
( O2 j- b9 p1 Y& B4 d0 `                sync ();' A2 c, P9 E% W% }- s7 }3 A
                *addr = save;/ R4 [& e  U8 ^# C6 e; \, A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 E5 f; C2 i) |" \& n
                        addr  = base + cnt;
" ~4 L5 W$ ~; P+ h7 B! Z( o                        sync ();
; |. i- O" F' \0 |) |# X& E                        *addr = save[--i];% ]/ r( R: @3 Y6 G( F2 Y3 Z$ I& P
                }# h, ]/ I# Z, N6 e1 r
                return (0);
2 ~; Q2 W9 U7 @8 x* q        }: b3 v" t9 P' F" e5 A: S! J( [7 m

% r4 Q" J1 @" ^3 x5 G5 k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 n5 V; f  g! v' J  g                addr = base + cnt;        /* pointer arith! */
6 f; \* i- R8 \. I/ S2 M, V                val = *addr;
5 H9 _; v2 Z3 u# Z$ L                *addr = save[--i];1 R! u$ g% J3 E
                if (val != ~cnt) {
" _7 c. C* f" @. X" M! g) Z- H                        size = cnt * sizeof (long);. {$ |+ o2 d5 o, L0 F1 o$ N1 W
                        /* Restore the original data before leaving the function.3 w6 b/ f+ R6 X. |, P
                         */  _9 V5 M) R8 |* x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# Y( u& p* Z4 k                                addr  = base + cnt;
( A& ^+ \( F: p' A                                *addr = save[--i];' ?7 d! {3 i& a( e
                        }7 K- {! ]7 e) C
                        return (size);
8 J5 Y2 y+ X* W  i2 j% L! M5 ^                }3 ~, k0 H% ?6 C
        }
3 C2 V% Y! M0 j( |$ X1 E! b/ D7 D
        return (maxsize);
. m" ^3 g' M& H& X8 `, o! q}
( B6 G  T1 K( T; Lint dram_init(void)( K( I8 j7 z: [, Z" \
{
. E* m8 n  @% V$ ]! z+ v8 I1 [  T: j2 n        /* dram_init must store complete ramsize in gd->ram_size */
0 T& b9 n9 m' P) V& E: W        gd->ram_size = get_ram_size(& @; S  W5 ~$ P. S
                        (void *)CONFIG_SYS_SDRAM_BASE,( K$ D9 U3 {: k7 P% t
                        CONFIG_MAX_RAM_BANK_SIZE);# X( N, e$ D9 m3 `2 X9 m
        return 0;) `) T$ H# e% Z: q
}
$ \; A9 Z* [9 G! X/ Z0 E) O0 O
+ Q8 ^$ A  K, g# Z2 A' e% p
5 J( g/ N* _2 Y  \/ I7 n
! T0 I) P, ]0 s6 U# E
0 f( y. n4 S& Q) SFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) L0 ?( q2 f* X1 g0 e( z9 ~, e# p" L6 M* k. t% Z
7 R2 X- h+ T( E1 _7 `3 T
1 P8 x+ i" C9 H/ L





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