嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 o$ q: R$ [- n; \& C# x核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 R0 ]: ~% Z; h0 D) D: x2 X' Q0 V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 V6 V( C, I; E% p6 Y

0 d5 q& M3 a! }$ m. a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: v5 I+ s0 Y; d( f  N
* v4 e  q0 K1 V' X

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% f( ]5 R0 R1 P8 j' K% j/*
) N8 V# G3 q( H, F, n/ i* Check memory range for valid RAM. A simple memory test determines
" @+ p$ W! v# }2 ]* the actually available RAM size between addresses `base' and
. Q: J4 B: d, v+ E2 E9 U# e# e* `base + maxsize'.
# X) s7 x# o: t7 Q*/
9 Q' w3 ?* A9 zlong get_ram_size(long *base, long maxsize)
# s% R" c5 i2 s- H- A{
; O$ D7 g9 ?. U        volatile long *addr;
: Y( R! C- k0 A0 s" x$ v        long           save[32];  M* H6 }$ e  I6 X
        long           cnt;
: I; s% t& P/ q+ x        long           val;7 n4 e6 V- f& F3 `- N( S! n
        long           size;
7 l, h$ V! [9 v        int            i = 0;3 A+ n, [8 w; C* F# h8 ^0 L

+ t- J# T0 e* x( w& ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' Z1 ^. y2 X5 `* z& S4 p, {; s' m
                addr = base + cnt;        /* pointer arith! */' S/ h" `: a2 o! t& P
                sync ();" B3 ?$ [& ^* @3 }( F
                save[i++] = *addr;
; m$ J; F6 |, [+ M) I1 \                sync ();
( c/ X! \  Q0 J- C) {3 w$ i                *addr = ~cnt;: C9 m; V3 T0 A' [* h* |$ R  |, R
        }
8 S4 x9 p! \$ X% n; n2 W) o0 E( m3 P+ R' i9 [# @
        addr = base;( L- z: ]3 Y1 j: u
        sync ();0 p0 I, F6 I2 s3 E  s
        save = *addr;7 u, L% d8 f! Y5 W
        sync ();
; h8 c) ]( P" o        *addr = 0;
/ V+ j$ ^* A2 |( N1 [1 Z) ?  t! ~9 J' u; A# V4 L, c1 T: T
        sync ();
, \; |0 \2 I& L        if ((val = *addr) != 0) {8 h  w. ~6 B* Q4 }
                /* Restore the original data before leaving the function.+ r; C. ^. q9 W3 L
                 */1 U8 j: ?  d( o% y3 T2 V" i
                sync ();
* ^; q4 B( p4 F8 b, r' ]                *addr = save;* X  H7 C6 w6 R" d
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' o0 c0 t8 G) ]5 o
                        addr  = base + cnt;) L: x& |2 b* y, ~0 |5 H
                        sync ();' T( u7 M; ~' `3 g! P  d. u
                        *addr = save[--i];- W" @- U$ S2 q& d0 m+ S* G3 U6 j* T
                }
" ^% j2 J3 y- N% o" }8 ?5 g                return (0);
# A5 m& V6 Y# I( r        }
/ N8 k% W, ], a. ]6 X: e* e9 [1 {. j0 W* \; G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 I4 _# Z$ U' a% v                addr = base + cnt;        /* pointer arith! */1 `9 ^, A  X, n# l# l) Y9 Y
                val = *addr;
% T  \1 U9 Q, w7 B# _$ ?, V5 k                *addr = save[--i];
- l% g" Z1 q( H                if (val != ~cnt) {
+ E0 r2 w+ ]! u/ Z( z; O                        size = cnt * sizeof (long);( s6 I# f9 y0 M
                        /* Restore the original data before leaving the function.; u( D, z( F$ R; C9 Q' l9 M
                         */
6 w4 [1 U, ~! Q/ A                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 _: C4 X/ v& ?( H; r
                                addr  = base + cnt;
, T9 i: A+ Z4 |. u/ H, ^) l                                *addr = save[--i];3 d7 Y  C/ Z& x& g
                        }
% U  ^3 K2 y! @0 r( e                        return (size);
9 U! J; l% z7 G4 O0 H( Y- p. D                }
6 \8 k& S! {( |. K4 y        }
! T/ ~" [; n; @6 t, c7 a8 q/ L! V! K0 f  X+ f1 f, P
        return (maxsize);
* E- }9 E3 `. B$ t& ?/ y' |4 u}( G/ v% O  }+ N& A0 n4 s
int dram_init(void)
7 U# L5 V9 Y6 X! C4 ?{
4 Y3 z$ Q* i5 g- v1 q5 H, l1 s        /* dram_init must store complete ramsize in gd->ram_size */3 i8 |1 i# H6 f, a6 r! n, M
        gd->ram_size = get_ram_size(, S' a& Q3 o* h4 _! N& Y' n
                        (void *)CONFIG_SYS_SDRAM_BASE,
" Z! M6 n8 _% O5 w, g                        CONFIG_MAX_RAM_BANK_SIZE);
& o# r$ y0 N; V# a' I! Z. N9 A        return 0;& h- o. j/ J. c' t: [
}8 A6 g/ z' k8 ~" Y% T/ R

9 k1 t( M$ M- S6 N
8 n  x/ j' R9 W! \  J$ A; ^: |- b' r. e
( W# J/ G( o2 ?( t% E* x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) c4 X% q4 {+ S5 U

8 D; r) P9 ?# `* A% t: Z
% E* M( C& W, N5 q: T

8 U* w/ i6 r$ Q; a, w: O




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