嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 r5 Z8 ~0 y1 N* H* Q* y4 J! s核心板2:DDR2 256M Byte   NAND FLASH 8G bit, R" X  C8 F) \8 A% Q$ q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- Y) _1 [/ Z# w# T" O2 P
( @9 d2 d  H, E' d1 B+ M4 Y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! L- l! A, @1 j3 U
6 A0 t4 H, X. G

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: r/ I9 q; H" F. b$ V  P/*
6 K. a' P- o& _' S9 X* Check memory range for valid RAM. A simple memory test determines
  C5 \- k' y+ F; ~* the actually available RAM size between addresses `base' and* p: I% M9 R4 E. `8 c+ p4 f
* `base + maxsize'.$ _; ^" d5 a# |3 g3 S3 o
*// F1 K; `* k/ I4 w
long get_ram_size(long *base, long maxsize)
3 j% a6 R- R. ]) \5 A6 L{
  A2 f3 x  v+ K! t3 q        volatile long *addr;
$ Q% |1 D5 a- h( P- Y6 Q2 H        long           save[32];& W/ P0 h7 {  G; r1 P7 v
        long           cnt;
) m  d1 G6 W* r) ^        long           val;
" Q! Y* e' V+ R; W$ N        long           size;
. K* {7 c( ~/ D0 C. S9 U        int            i = 0;
( Y. t9 k2 C* ]5 k7 }) M1 J8 _, t4 e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% V6 J( ?% {- a' x- @) Y                addr = base + cnt;        /* pointer arith! */$ E2 j5 H* h' D+ f/ Y3 ^4 F
                sync ();  H1 B5 I% ?# D5 \  |
                save[i++] = *addr;5 N& P( i5 s* s0 t
                sync ();
# c0 y0 o) k7 \4 B                *addr = ~cnt;; z  K4 V/ o4 y9 N
        }8 T" L% _& A* [* X, V# F  R( i1 s
; T7 R% H/ [3 p' a, v8 f, C9 N
        addr = base;
+ P/ C  ^0 y3 w        sync ();
  o% ]! X4 s2 {" o5 V5 G9 V        save = *addr;
0 g: m2 Y5 {) c2 {4 o        sync ();
/ ?4 i! B; i8 K" e        *addr = 0;
: C  n7 \, g+ K2 X  t% X- b# n5 `# @( [: g0 D
        sync ();
: [8 X, A" Q% w# v        if ((val = *addr) != 0) {; j8 I0 E# I1 @6 m7 K  L6 @
                /* Restore the original data before leaving the function.
1 g- a' B- u! N$ ]                 */
' D& z% X0 G0 _6 H, D. b6 M' e                sync ();7 i. v6 d& H" e& D
                *addr = save;
/ A1 K7 v* D% v9 j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 ]5 c8 e# w6 I1 s2 }- F                        addr  = base + cnt;
6 O9 ]; e+ S2 j( C+ V4 l                        sync ();
" _, |7 I4 \- ~                        *addr = save[--i];
. {& u5 f1 @1 Q6 ~8 G. Y                }, ]% e# ], r; D1 @' W. O  e( M- V
                return (0);" r8 T1 Z/ ^8 N; W+ N
        }( ~# b( ?6 x3 e2 z# i6 e9 F1 X
; h+ Y8 @5 x. H9 g# _: o$ Z) h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 Q: h# [/ c1 K0 W; z: Z
                addr = base + cnt;        /* pointer arith! */6 U4 Y- X, |* x! m
                val = *addr;+ _3 H: s) d; W
                *addr = save[--i];
8 Z5 _$ G- ^& n. z1 `8 W9 X3 r                if (val != ~cnt) {
5 h" F3 C9 U- o) P; X  Q; V+ ~( x                        size = cnt * sizeof (long);
/ u' t6 \2 R& G8 k. v6 O9 x( j                        /* Restore the original data before leaving the function.! }2 h4 R, B: K. U7 q7 a5 i5 y
                         */
+ O) |6 ?1 W9 v2 Z3 P' v9 Z$ k                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) t: M- c: q; H) A                                addr  = base + cnt;1 @* w# y7 ?, k+ n( a8 d6 b
                                *addr = save[--i];1 C, r% O- b0 f  \
                        }
1 s: [$ G. e! x* E/ g) P+ G                        return (size);
9 @: \; `( J1 t  j" R$ e                }
! u9 m; `* Y* j  Q8 P+ \: X        }
% v5 Z" {. ?/ m' U4 Y2 ?7 l+ `0 P: P6 B! m  r, L
        return (maxsize);
9 I( a6 t* y9 [}
. y4 o  P9 P  |3 uint dram_init(void)3 }8 P* L% B4 j4 a' S) i( w
{
$ Y7 b$ V3 x( D3 G+ \        /* dram_init must store complete ramsize in gd->ram_size */
/ }/ v* e; P2 b7 k: Z6 |, L' S        gd->ram_size = get_ram_size(
, P& D- x  |( c                        (void *)CONFIG_SYS_SDRAM_BASE,* N( j9 ^3 N- F1 U/ @
                        CONFIG_MAX_RAM_BANK_SIZE);
9 G$ |/ n4 U! q; ?3 Q        return 0;+ Z( J# d0 ]( i4 E, A/ G
}( U7 @3 ], C) I0 U4 }1 _
2 O" o1 i6 C& W) [$ G$ Q) j

1 _: S( s4 d% W8 k# K2 K, Z2 W
5 ^3 _$ n* w  s1 U; a
  {* h, u* ^. kFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; i% k& P+ N, i3 z
: w( t! e9 S3 q1 D2 |
: P( v- S0 H" C; s. V
8 C# H& b/ Y& h( b! I5 z1 K7 r7 B, j





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