嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 Q0 H; o5 H2 v0 {6 X& Q核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 l. u. }7 C$ l! Y1 r9 X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ c  d- N, y5 z# r" G7 d9 g3 E' V8 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 U. |, K$ O9 O+ V1 d7 u2 }, V: V3 Y) f( y) m

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 Z  z4 j& c6 G% Q. c5 A
/*
8 [6 ?; ?' f) {  `; }, S- u6 Y  ~$ d* Check memory range for valid RAM. A simple memory test determines
7 U1 r( G7 b7 m; n4 Y* the actually available RAM size between addresses `base' and
# i9 e  e/ [& m$ T* `base + maxsize'.
) Z8 g1 a0 M3 Y0 n( o$ H*/: e7 b1 E0 d' a3 f  w4 c2 |5 {
long get_ram_size(long *base, long maxsize)
( j' s* `& O) _, F{3 B0 p2 y; k% Z, `1 D) R
        volatile long *addr;* j8 l% O/ a+ o( m, f+ D  X0 z' K3 B  \
        long           save[32];
$ m, K! N) M$ `% N3 d% p8 M  ^. z        long           cnt;
9 @6 Q: v& f. _7 i6 J# v* I        long           val;/ l8 `4 Y  B! g/ \7 e2 }
        long           size;
6 C4 ?( \" h+ H6 ?# T, V        int            i = 0;! S3 A& \/ X3 ^# T6 l+ G
( n, z7 D  T8 ~7 z+ a8 X% O2 v
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! V( ~, }: |+ g. @: O
                addr = base + cnt;        /* pointer arith! */% w$ ]+ c" v" b( {, ~
                sync ();
5 Q: c' Q  W2 M- l% w* [8 q                save[i++] = *addr;
/ t, |( v6 ^, A7 x                sync ();
7 d6 }6 p5 R9 b! @1 w5 r$ e                *addr = ~cnt;) w& z" y% C) |5 b4 B6 W
        }
* r6 v6 a& E! z* C8 [3 Z3 I; {+ q( c& K5 a
        addr = base;
* `. ^( t' S$ ~. n/ {        sync ();
$ q% l' o# Z3 j! r' r4 I        save = *addr;
# ^1 o2 c/ ~4 q5 ^2 p1 m8 G# b! k1 ]        sync ();
6 Q9 Q; w2 p& s  k        *addr = 0;# T' {5 ^4 o9 P
" Y# J( h, Z! F4 b% H+ w3 g
        sync ();5 h5 Q4 y7 z; L" ?
        if ((val = *addr) != 0) {
- z8 q! H% R) s& L; z& X, t                /* Restore the original data before leaving the function.
. p8 f. v" T6 z+ J6 [; m                 */& J* s- K( `7 O( i
                sync ();
$ Q9 M3 }5 a: A5 M                *addr = save;: X9 }& M$ A; ]  k) G. l) G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 H, |6 c; T7 {( ~                        addr  = base + cnt;8 s: f* G  M) x2 s: _( Q
                        sync ();2 Q! e7 k6 X# ]. i- Y. H# z! L8 }" p( M  G
                        *addr = save[--i];3 Q9 a# n6 X" p! i# I& p9 n( a2 v% ~
                }7 e' u* w! O0 N4 B
                return (0);
6 x1 v" C! K; u% t! f3 Q        }' T, }  P5 Q2 v) W( X8 C# ]

: e+ M* c: N- ^8 y7 i& p( c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 i) N8 ^6 B3 n' D) t+ R0 j$ s
                addr = base + cnt;        /* pointer arith! */4 w, x/ \8 h2 L
                val = *addr;- ?* X" q9 }0 R, s: r
                *addr = save[--i];5 j' ~1 y7 R+ s6 l: i
                if (val != ~cnt) {' \$ m6 N* v- j
                        size = cnt * sizeof (long);
7 ?) j7 T+ G% p, [/ Z: d: Z4 w                        /* Restore the original data before leaving the function.* X7 N6 U: a2 F9 d/ U! d9 s
                         */
$ x! k; _* {  M6 M* f6 s$ ^. a3 }                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, ~, w" v' j# E6 a) X) _
                                addr  = base + cnt;
/ F  B, m7 n( V' i2 }                                *addr = save[--i];7 A& f) p$ o- f2 X# r
                        }
1 M  w2 x$ u* T/ P) T# N                        return (size);7 S6 V6 e2 C+ h" g6 v0 W, u
                }$ V) V+ M9 S& L7 V
        }
! e- n$ Z; P+ d/ c
. o* v' V1 a6 c6 ~  S9 H        return (maxsize);
9 A1 W0 |1 N+ M; j}* X" D$ M; A# ^0 t! e7 |" F5 }
int dram_init(void)
6 H. I  g0 I! l5 ?; \{2 F  [" L9 x: _) Z
        /* dram_init must store complete ramsize in gd->ram_size */
4 s# ^  k9 _8 E& x2 N8 o/ g/ W) o        gd->ram_size = get_ram_size(
0 j8 D4 B2 w4 E  |" Y  ]1 ^                        (void *)CONFIG_SYS_SDRAM_BASE,
! K% q6 [! `6 Y4 t' v                        CONFIG_MAX_RAM_BANK_SIZE);' t4 C; ~. s( N8 _, Y. ^5 @0 @7 s
        return 0;! d) w# u& H# p& h7 `+ X
}
+ N3 B  [$ O7 ]% }& W1 R7 Y5 @' g: f
5 m# r+ ~7 @# ]# G* k7 O% _
* @; X9 [6 M2 n8 }7 v; {
! @( T+ \9 S6 y4 b1 S: H- z( X
4 G6 @& ^" t; m9 sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 S) B7 P# Q/ d- @3 \; v9 L

" H5 e' Z: L$ e+ y$ Z& t7 A
# m. K: i& w5 t, r) ~& \4 b( R1 Z

2 x6 e; I3 A5 T1 m/ v




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