嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  v( E' V8 Y2 b核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 b+ q! A7 {/ L! f1 j7 [这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; u; @9 b( q) S/ n$ M

: t" `+ _) {5 \, v# p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  o8 P$ c3 i, q1 M. [( \$ T) t2 T

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' \6 L( G6 W+ c% V
/*
' ]) X- T" d0 L' u: f* Check memory range for valid RAM. A simple memory test determines4 L6 A' M- h0 V# b9 X
* the actually available RAM size between addresses `base' and/ P% A- j' i. P, y) p
* `base + maxsize'.
) e: }$ l# d+ D) N. T  z0 w*/
8 F" X1 l" o* Olong get_ram_size(long *base, long maxsize)
$ o" u9 s  Z& ]{- }$ s6 d+ ?' w( \0 ^7 O
        volatile long *addr;5 N7 W% J5 Z9 q- l, H
        long           save[32];. A) C, f5 ~7 ~* u& T
        long           cnt;) [1 {5 K0 X6 `
        long           val;
6 I' r. H( @: x) ?4 p        long           size;
3 g! c/ t8 H  d/ a2 H        int            i = 0;
/ {$ h& @& F- Z# m3 y
3 Z- K5 O4 a6 R) m) Y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& X* Y/ [" j9 u  w1 j  m                addr = base + cnt;        /* pointer arith! */
- f8 y$ @: v% z+ q( O+ O                sync ();
' m* S; L: X$ J" R( a% n* l                save[i++] = *addr;
$ B% F% _# N# t9 y4 b# V* i( K/ q                sync ();4 [; w3 Y0 J8 M$ a( I* P1 W& Y
                *addr = ~cnt;
% }4 F# t! V, t( V4 S        }7 p, i$ C3 ~+ }: r' H% ?( r

5 H) T2 H, G  ?4 C* f, T: |* y        addr = base;
9 J1 D# n9 M2 Z) c% Z        sync ();
9 u" H( ?: F3 j        save = *addr;
" U/ ~1 l- p) r1 u2 k& z& g3 C        sync ();
6 ]  e8 l& K+ i: Y" y+ ]        *addr = 0;7 J( T! y# Q5 t1 ~' k3 i: F
* F& C! }# q! q* i4 u3 q' E7 G' H7 H
        sync ();4 ]: j$ o, K; ?% v  b% h# j
        if ((val = *addr) != 0) {
$ u* U5 V" T5 X0 A& C) J                /* Restore the original data before leaving the function." G. I5 e6 t+ `
                 */
  @: Y" T. o7 y! F: o& s% f                sync ();
6 m; f* F. p4 M                *addr = save;
2 r9 ]- f* @- Q! ?" h+ q: v                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) s& K5 T$ s1 f) W% }. n2 D* G2 M: Z
                        addr  = base + cnt;
4 ~( P% M9 c) O7 x  ]# [                        sync ();  Q4 K" U/ ^; b1 C8 S  W9 q
                        *addr = save[--i];, M# k; O" b* E) s" k& g
                }
3 P# \$ T3 `. m  N/ q- e; V                return (0);
: m) b3 C& k, U1 ^9 m! `. D        }
7 ^0 g0 W( S1 A% x: d, q' y
. F3 V5 {9 C8 i& ?9 @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ Z- b' n  E. k. P$ x
                addr = base + cnt;        /* pointer arith! */4 k% y! N; T) a: m# e3 f' ?
                val = *addr;5 w5 j: b0 i( F
                *addr = save[--i];! h# F9 {6 G3 l) B
                if (val != ~cnt) {  h% i' }  w" M* X" ^7 T
                        size = cnt * sizeof (long);
6 d! E* w3 E, \/ H                        /* Restore the original data before leaving the function.
5 E6 H4 M/ r' |! _! I/ f* o6 j                         */% f8 t) m" D& l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! @1 N3 n) l" m, H2 `9 m' }0 }$ g                                addr  = base + cnt;
6 D) v6 Z2 s1 g" O% S' e: `                                *addr = save[--i];, S) I0 D, M7 E
                        }0 y# Y* v! D3 C6 s  R
                        return (size);. J4 N% F4 l0 S8 K% x0 ]
                }) I0 n+ w% d9 j$ D. K% R) \& q
        }
# V% M3 P! L0 S) v! \" L- ?+ m; J" D, X+ a$ w
        return (maxsize);9 N. {( X% a9 k2 o) b  `
}
6 ^. @: z+ q4 m# K9 r, Qint dram_init(void)
  c9 A: Z; \" c% D# y; _{
# D/ a( _5 c7 v3 G+ C$ M& M  w        /* dram_init must store complete ramsize in gd->ram_size */+ K& O% h1 |+ W2 h
        gd->ram_size = get_ram_size(8 P6 w6 t1 A2 K: |( \+ ?
                        (void *)CONFIG_SYS_SDRAM_BASE,
* i" R; w1 D) X1 c' a8 N                        CONFIG_MAX_RAM_BANK_SIZE);! S8 a/ I/ m7 L! N% X
        return 0;$ f" y# T5 V( G4 T' C3 H
}
% s* y) \3 y. l% `
3 [3 Q5 y5 m1 ~4 H' H4 ~# E0 y4 G& C6 h: W8 l' m2 r4 l
  j- t  Z- h9 a8 r

: w- A; b( ?7 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 E6 L2 l( @2 d6 m5 i

+ O$ E5 u- d9 X: n$ m. V: X* A, z/ y6 w0 f6 `* Y
+ M+ w, i; X1 p; H3 g( Q





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