嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 x) V+ W+ X- q# L  T! G* z核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ D) Y$ [$ _; Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 }7 X  ], i5 m# T4 |

3 _* S$ a! z+ h1 n6 Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 n( D, \2 c- [
& X, o: |4 a. m* h3 [1 H! c

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 P8 y* G) V5 ^: `% k" b& ]  p( H
/*
3 O. x, Z4 n' N/ N* Check memory range for valid RAM. A simple memory test determines
( s4 ?; n' P4 f3 c* the actually available RAM size between addresses `base' and) k8 v% w6 K  a0 ]
* `base + maxsize'.
4 \4 c& Y( g: E) f. C*/3 v9 t0 R3 D8 x& O
long get_ram_size(long *base, long maxsize)
. S5 [$ y2 N: w) \1 M" u{) C$ @% x+ L! ^; h, ^; p
        volatile long *addr;0 M) H* }' t- h# i3 u- b; a
        long           save[32];; E6 d$ Y1 T+ f' e, E' ?
        long           cnt;* u) V0 ^4 l6 N
        long           val;
7 j3 T' E9 s6 m0 m# L1 k/ T8 t        long           size;2 w, [9 O9 _0 ]8 `6 U; r7 B
        int            i = 0;% G$ k! ~+ B! f# a& h5 _

( d# S+ w4 U* ?6 Y; b) Z* {! I7 Q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ I( u6 ~0 N2 Z2 A+ s3 \( P                addr = base + cnt;        /* pointer arith! */8 F5 l' h7 t) H2 P/ L
                sync ();- N) e6 c% ?' u  C5 {! \' E% M
                save[i++] = *addr;
# l: t: f; h5 j. o                sync ();
; G8 A9 [$ W6 [% j4 J                *addr = ~cnt;
- L9 U6 s- c+ \( v5 l1 Q, G% e        }
4 b8 @. J- X" Q+ n* _% U
2 |3 w% A6 R1 Y8 S* z        addr = base;; M! M1 L6 J7 ]
        sync ();
: ?4 x* |: O/ Q6 i. j( X        save = *addr;
1 v6 R) E! f( I( Y) a        sync ();
- ]% |* ?* C. @$ v8 l        *addr = 0;# E' N$ F4 I+ \8 W' |0 y' M: {
3 K( a$ S8 [1 @6 x
        sync ();! K; [8 m  B, j5 x& L0 H& Z
        if ((val = *addr) != 0) {- }0 n) [, F$ N% |
                /* Restore the original data before leaving the function.$ r$ J6 c. ]+ u- ^% d! b. L. {
                 */
7 [% w* m; v' K! {+ _2 D                sync ();
5 `  s* g* n% x                *addr = save;8 P9 A( R* {* T. ~9 {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% \+ t  q  l- Y2 ?
                        addr  = base + cnt;8 {+ _5 A+ X& X2 \$ P2 p! F
                        sync ();$ s9 D$ O: t% T& \7 r# v
                        *addr = save[--i];: z  h# `9 b3 T7 v7 j. r
                }& J% V# z6 H1 C0 C% ?
                return (0);5 O/ a8 ?- c5 l8 e( v# M9 ~* S
        }9 v" k9 Z, p4 r& J, k

4 g* t& I) v; p6 F+ Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- D; j: S5 j$ S; z+ c7 w
                addr = base + cnt;        /* pointer arith! */) n+ M) S* `/ `" a
                val = *addr;
0 t; |* P9 A+ y9 N                *addr = save[--i];
8 `' A# N4 q( `' b$ ^/ G* v                if (val != ~cnt) {
" |( H( {. F3 V& {                        size = cnt * sizeof (long);
- S- }+ m$ Z. O6 S  G; L1 ~                        /* Restore the original data before leaving the function.4 ?/ K. G1 u: t
                         */8 H& Q' b  R9 t4 ?* Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# j1 }* N, V1 j* B6 F7 z
                                addr  = base + cnt;
! }5 l7 L" C+ o9 l4 ?                                *addr = save[--i];, |1 j' {# B( T6 `+ h. A0 Q9 B
                        }5 G. g# V" [4 }! ]
                        return (size);
/ g7 K2 S3 y! _& _3 t; l" f                }+ e' S+ E2 b3 W8 ]
        }
2 C1 L2 G7 v- c& e- g) u, Y5 Q1 t* O7 M1 I# D
        return (maxsize);
4 l+ ~5 z9 o$ W/ w6 l% a  j}0 R# d! V% Q, X0 ?% [2 u3 q& E* x
int dram_init(void)
( V& z% |5 T: e1 p0 K. C' w! M$ K{
0 g7 y, {. A& n6 i        /* dram_init must store complete ramsize in gd->ram_size */
, x9 E& g$ S& Z) W- s9 O5 R, l        gd->ram_size = get_ram_size(
7 h0 v# R1 ~: {7 G7 v                        (void *)CONFIG_SYS_SDRAM_BASE,& H. r, k2 [4 B2 b0 _: f1 W
                        CONFIG_MAX_RAM_BANK_SIZE);
* ]' V# N" n0 h& K2 x& E        return 0;
# q$ F, @5 W: Q9 L! _. Y) k}; Y+ G3 G) x. T9 {( g- W7 L1 l) K
& V# n, e  R! `. m' K3 D! [& g
4 w$ P+ t* v$ X5 k3 |$ X

$ Q5 f" K; Q& c( @) c2 g5 V; H. [+ r  B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; T# X9 r" N9 q% a& K0 u6 r& W
3 a. B1 D9 L) P3 u) U8 T, w. j

( X$ M4 g* |5 e; v8 \# p3 L4 }

- z3 c: v8 p* W4 V' t* ?. S& e; }+ z




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