嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! ^, o( L# D* ]* W核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 o( R/ x: `* d( G* k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# a$ _, k6 u$ V. U8 L

$ w+ ?' ?4 A; ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" f" i; L- ?  u
8 Y% c& }9 k3 p1 W/ \2 W8 u' J9 m' O
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 F2 b1 x& Z) k/*) b1 t1 r' W" L. j9 r# m3 e
* Check memory range for valid RAM. A simple memory test determines
5 K1 s* c; n4 Y9 @2 L* the actually available RAM size between addresses `base' and
/ }( `0 _# y, B5 v/ {( L- e* `base + maxsize'.. U* v: L) ?6 J7 a) I
*/% j; m- @( l7 f9 N6 j
long get_ram_size(long *base, long maxsize)* [& \+ ^; N3 H8 U
{
3 r5 q: |" K) J        volatile long *addr;( C5 Z2 T, `. X
        long           save[32];3 C, o5 `% J$ {+ t4 U8 A
        long           cnt;" ^( G$ C5 {) E( T" G" `6 T/ S
        long           val;* S) P3 d& O# }9 N
        long           size;
* W7 W9 V" t9 l6 ?6 a        int            i = 0;
# U2 _% J6 A  [/ {1 p: Z9 o
# e" B% t9 ?+ o, ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 W& w: g. Y( A                addr = base + cnt;        /* pointer arith! */: R) H: `) H. j. a; X6 k6 ^
                sync ();
" p: _. a+ r+ y5 w& B9 c7 S                save[i++] = *addr;6 F6 W, j/ a" n* T# a; g
                sync ();
+ m, A4 h3 Y8 ^  b$ t: W& C                *addr = ~cnt;
# `6 V& A( T, F% \' I4 j        }
( }# B; a3 h' C5 u, M
* k$ D) y: V4 M! v9 S- g8 }' b( D        addr = base;
) N2 w: d- B+ O* u' \' k1 s% L3 m        sync ();
. T/ j  z: c( c, f+ \        save = *addr;5 ^! ^0 G$ D, s* @8 @# y, W
        sync ();; d9 g" `5 ~1 H
        *addr = 0;
/ p6 u, ~( E9 t: l5 `" @; Y  w. V- ?  o' I6 I% Q$ g
        sync ();
1 K7 |. \/ R- r6 Q' T) z        if ((val = *addr) != 0) {
1 p+ H5 o2 N9 H+ S                /* Restore the original data before leaving the function.2 e; \' O1 g% Y1 e$ P( G) G  h
                 */- r: \8 o: u! R5 e6 @
                sync ();
: d; m2 T" ]5 v: d% D# v5 i' I                *addr = save;
; h2 Q8 F' Z4 Y' w4 w' J: K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 j( e5 r' |* q& _
                        addr  = base + cnt;! F& T% Y$ T( R" g- [
                        sync ();* q% }; }% P" S2 q
                        *addr = save[--i];
7 b5 N& w, M8 M                }
! j* n! \+ N6 v# W4 A  Y, A                return (0);
0 }% V) Z# j( {- f/ p2 B        }
1 f! u2 c  C& S2 d
& i6 X2 V  Z) X* ]        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- M5 [% |- o5 q2 O0 v& G# L                addr = base + cnt;        /* pointer arith! */0 H  d4 E& m7 Z4 A! R; Y; y
                val = *addr;
+ o, M- b( p. b) J. g) R/ S; P+ e                *addr = save[--i];
: C: u6 M" Z3 B5 \$ O, j% |                if (val != ~cnt) {
5 T) G7 E, V$ g0 S" W& Y3 k" s                        size = cnt * sizeof (long);  ~! Z) C# d5 `6 M  E0 P
                        /* Restore the original data before leaving the function.
7 x/ o* n2 |6 u# I+ {                         */! j9 |# ~0 ]: l* `
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 b% n# L4 m; S                                addr  = base + cnt;
0 W' l. |" y4 T                                *addr = save[--i];! M' b' m. X5 ^: [- P: \  y' j
                        }
: v) ^0 |. j3 Q8 X$ n- S. @                        return (size);
& O& C7 C8 f4 o$ ^6 l6 u5 l' b  t                }3 n- F/ l+ b- T; d
        }* o9 M( l5 M- V4 q5 z
% X( S1 S" L8 G# u; ?& ]
        return (maxsize);. U( S! a% t+ E; u5 A* |: o! m
}2 V2 ]) F  m7 r: M. A6 }: I; S
int dram_init(void)
7 [9 G3 K3 h" f# Q5 S8 r{* d% `. Z0 u; B" Y. Y5 C
        /* dram_init must store complete ramsize in gd->ram_size */
. ]" q% p% U' ^* H- F        gd->ram_size = get_ram_size(
5 `4 p5 L+ p3 b/ g$ i4 u                        (void *)CONFIG_SYS_SDRAM_BASE,
9 G& P$ V: I* _5 `/ y- [- S2 B2 e                        CONFIG_MAX_RAM_BANK_SIZE);
) e7 p9 B/ q. c9 |" g        return 0;
4 f& s( F, c6 h+ D# j' ~$ Z% M: a}) e( n+ @5 X8 Y" g6 N

( b9 O% U! z8 x" _4 S3 O; E3 n0 L5 @8 J0 \- K6 |- k* v. y* }# T
4 j$ x/ l1 n& q5 C& }
) z, [/ _# l% K; z0 y, g$ _! R; r! F9 }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! R8 |8 \2 e& R/ K+ W' q/ I4 |8 K$ j* c# y3 A  V
2 ]) q/ L2 O4 d5 j" y5 U7 Q. C
9 b% c$ \* U: m$ \6 U( u3 J





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