嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% o& j9 }% B$ }$ {: [+ B核心板2:DDR2 256M Byte   NAND FLASH 8G bit% [+ L) `, ?" N( h& `5 J2 z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% T) C8 l, Y3 |& q! _  Q* u" ^
1 R/ q7 h$ L7 g" N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: u/ R4 X+ w- t2 @' A9 l

' |$ R( `2 a& e% H
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 `3 {  J. i: `* l/** _+ f* Y, ]0 l/ ?3 S
* Check memory range for valid RAM. A simple memory test determines" s' G; R5 H) \- E$ J; M  g
* the actually available RAM size between addresses `base' and5 ^! g$ M9 P; y. X0 \5 j
* `base + maxsize'.  ]0 ^2 X0 q) |" L  Z# B' X( `
*/
# g7 H6 I& j2 C, m5 ]0 E& Zlong get_ram_size(long *base, long maxsize)7 ]/ [5 Y* |; ~( R2 q7 B% _
{& l- H/ N& `3 A  Z
        volatile long *addr;
" Y9 ~" `8 k1 X% [        long           save[32];
' Y# q* G" d4 b3 v        long           cnt;' A) l" v8 J/ `& A( O1 B
        long           val;" P1 n# t% ~. M" B; [' y9 D% ^" }2 u
        long           size;
( g- Y0 f6 Y# l) M. D; q# }        int            i = 0;
2 U" h' P0 X7 X+ [/ o
3 j8 C" o  P: y- ^+ L4 W        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 {$ \# ~0 v( [! I( i
                addr = base + cnt;        /* pointer arith! */) s' ^3 s  ?8 I8 e6 _7 ?( h, M
                sync ();
. V7 i5 o2 a% t% ~                save[i++] = *addr;5 n5 G) a8 O/ w+ x4 M4 w" A
                sync ();- M* N0 |7 D1 Z5 u6 J# k% X
                *addr = ~cnt;
2 f. g+ B) s5 ]) N1 O/ s        }. Q+ v* G$ z1 [7 L

; n( q2 d$ w0 K        addr = base;
6 j3 K5 O1 X  P1 Z7 S        sync ();
6 P# }, s" X9 j6 A* ]' f) n  \/ D7 v        save = *addr;
) j4 }) x1 _9 B9 h& R7 y        sync ();
& j" ]+ X7 S. w. g. y        *addr = 0;4 P5 `  @8 H' k! p1 r- p

! r  M  q1 e6 l) ?  q7 E        sync ();; R3 R( I5 i' [  ?
        if ((val = *addr) != 0) {0 y, d* E3 X4 d, J6 N) I
                /* Restore the original data before leaving the function.! V( L# n. b3 o3 e( ]6 c# d% b& f* b
                 */
4 ]% ^# M: V. _" m8 N' z; D; X  J                sync ();
- K) C( x" S# ^- g7 Q                *addr = save;
1 }& A4 N- E% n4 F; x# x                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ H9 k1 f# q2 F' T$ u
                        addr  = base + cnt;3 e) d) K6 Y: t( B" K
                        sync ();6 y5 v3 L3 R9 y0 k* R
                        *addr = save[--i];
, _7 K& A8 m1 O0 z                }
% t+ j, H( W% h. y  d6 ]                return (0);
7 e& Y& C0 v5 z        }1 ^: O& W! ~. F7 h, j  e" q, Z

/ T% h4 |& L2 t4 O0 H; H0 H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 H8 p7 S& h/ Y  B% V7 w0 u
                addr = base + cnt;        /* pointer arith! */* O  y, w! B# \, K0 R5 o, ~
                val = *addr;
3 S4 ?' y: Q  t! N                *addr = save[--i];
5 o. Y# c* |+ ~5 s                if (val != ~cnt) {
# [, u: q% C9 s% ~6 v                        size = cnt * sizeof (long);% J, Q$ `/ {" b9 w
                        /* Restore the original data before leaving the function.' a+ `1 M: k- a+ w; ^" _" W, M: T' Q
                         */
# l5 `" t( x6 _' U9 \0 ^2 O% Q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( d/ |, U9 W( J: Y# O9 I) r                                addr  = base + cnt;5 i6 w) J2 S6 T4 z. q
                                *addr = save[--i];
# j$ E* \( P3 s3 I                        }
  |# o9 [* v; o) R2 ~) l' W                        return (size);
6 b( y3 |& Z) X9 v' s                }
2 D' f9 W8 _5 L* b5 h% v3 |        }& @0 Y' }7 {5 |8 R0 _

8 ?3 ?& n2 Y! v* l+ E        return (maxsize);) ^, z9 S, h8 J. b6 q5 m3 R
}
; J$ a4 B+ @7 \4 _* Z- E& Rint dram_init(void)
% k7 u0 A/ a, S# i{
; S: _' o8 H8 w  \        /* dram_init must store complete ramsize in gd->ram_size */- A0 t% i1 R0 a) D
        gd->ram_size = get_ram_size(
( |1 f+ X& y: {1 e0 K                        (void *)CONFIG_SYS_SDRAM_BASE,& Y- b! |; R4 t: \. r
                        CONFIG_MAX_RAM_BANK_SIZE);
& I3 L$ @/ }# H        return 0;. n  Q9 F- ~4 d
}7 j& `. A, v1 N' f* D/ _! @# W# }
; W  H& W% U, ^. a; _

# _( D+ ~+ z8 h% X8 ?+ E" ^4 b0 y: b5 j6 d+ K2 R& H

& @& R) J- \; r* I3 tFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ [7 Y, X. y# F9 V' G
3 @1 `" P2 l' k* d/ x4 S) Z
) O: K: d1 ~6 I& R& J/ E) x

* B5 H4 t& G; c) K* ?$ {




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