嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; I$ F, {, r) ]6 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( L0 y- d* z7 |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ x' |' @/ F- ^4 u( G! y3 z
+ _2 h1 p2 n) R! }( u- G0 W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 ]2 s, V: |4 }- D1 E# H
# ^  h0 Y6 I8 o7 o, x. Z, m

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 F- u4 i& g9 b, R/ E4 ~
/*
/ {6 A- w' Q. L4 s/ Q( ]2 c9 n/ G* Check memory range for valid RAM. A simple memory test determines
9 p, W. }4 [4 u9 B' `* the actually available RAM size between addresses `base' and3 |7 ]" H* M' a5 w, V1 y0 _) H
* `base + maxsize'.# p0 {' J4 x+ ^$ T3 B; |& k3 g
*/
, U! |9 @5 t5 ^" _0 Tlong get_ram_size(long *base, long maxsize)+ b; X$ j% i/ ]1 X  g
{
7 D% A' I& X9 D9 w+ m        volatile long *addr;
" p, {6 x% {0 |- W* r' E        long           save[32];
1 L6 M: G7 y, m        long           cnt;( u. f  b: R. h. r$ u4 C
        long           val;
& u7 |8 `: |& R# D4 J* p        long           size;
2 j  X' E: D6 Z7 N        int            i = 0;0 [; G7 U2 ^5 {

( _0 @0 y0 z, Z' Q8 v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# J( L, N& Q4 z4 _/ C( ^4 j                addr = base + cnt;        /* pointer arith! */
3 [9 J( |! Y+ z                sync ();+ j1 \2 J5 s& p1 E0 R6 Z" n$ Y
                save[i++] = *addr;$ ~4 q% }8 m7 c' z8 p+ H6 Q, @! I
                sync ();- u1 e& v# `+ a
                *addr = ~cnt;% e: }- [1 M" I; D1 z
        }
$ g5 h' f0 _& w) ^# X. O& \9 F0 J( M6 [5 w& z
        addr = base;
, W; r; {3 X0 U9 x2 v; c2 A/ v! T        sync ();8 V2 o  b3 x: ]/ t# q! \: c
        save = *addr;
/ U* X4 L2 Z2 Z+ x        sync ();
  O8 D3 D- |; ]! c5 i8 F7 k        *addr = 0;( @0 L/ A) \: s" ]  R- \( ^& s5 ^: J

5 N5 }0 j* }* Z: e/ n/ A  I        sync ();' j1 F$ K; n0 z2 l. d
        if ((val = *addr) != 0) {( D' W4 Y" L6 |. K5 E
                /* Restore the original data before leaving the function.
/ r+ \1 c, o, L4 Y4 M3 k                 */! ]9 y( ~; }  p% A; V
                sync ();
/ H# _5 f$ w. M/ D2 w* d# Z                *addr = save;
, A$ N' p+ T  W9 H( b& d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 z, x9 Q! G2 `% K6 w6 M4 U                        addr  = base + cnt;
8 ]4 `3 \* q* a* d                        sync ();
+ ]/ y% n7 Z: B! J0 E                        *addr = save[--i];
& _" d9 P) H, R; U1 Z7 x2 }7 S0 @! T                }
0 c" w  \9 L2 d# G( N                return (0);, F* b# d6 r0 f
        }
* j( s/ b" K+ G8 p' @0 t. o  H1 R+ p+ c5 S) m. u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& [% ?- I1 [+ |' Z# S2 p8 a: M                addr = base + cnt;        /* pointer arith! */
' K: T2 r! L. E                val = *addr;
  w/ ^2 F; c- N+ R                *addr = save[--i];
- }1 G9 Y2 l; M: x1 N                if (val != ~cnt) {4 Y7 M$ y9 N# E
                        size = cnt * sizeof (long);
( s+ B: p. p/ g9 g0 b. i9 s                        /* Restore the original data before leaving the function.
; F; K+ H  l: }, f% l                         */
5 P9 n. p8 t2 U4 F% _* S                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ K+ o; M! m$ M! F4 g                                addr  = base + cnt;
) o8 L, ~5 X8 y                                *addr = save[--i];
+ T! j; R: |9 t0 n" ]- }7 F                        }6 i% I9 x7 K; _$ l* U2 Z
                        return (size);1 Z' R" U" w0 A) T, X
                }$ `4 F$ ?4 p) a8 J- n
        }) d0 b  c0 A" Y! ^2 P! S
1 r6 C+ e" J% h
        return (maxsize);' ]6 s3 Z4 t/ @: Q9 a2 {
}, v; U$ k2 X' N" K: j3 f; ]2 q7 z
int dram_init(void)5 T! W& k* v$ Q$ L
{
5 @. r; a- }$ ]        /* dram_init must store complete ramsize in gd->ram_size */  C8 m7 Q! e. _8 F
        gd->ram_size = get_ram_size(
/ s& |' r! u/ B# z, e                        (void *)CONFIG_SYS_SDRAM_BASE,& B: K5 e& ?3 C7 B, G! L
                        CONFIG_MAX_RAM_BANK_SIZE);. I) A* i  v! d+ D9 r
        return 0;2 `( [: c% T) [) Q+ D3 q3 s+ d. `
}+ B- b( {4 b' [  ^3 g  C% p0 W

6 _* C1 z- R% V1 m
0 s6 L$ G) q+ E
* B) V0 N) M$ P' K* e( z
- m. Q  s7 i9 R' U6 ^  uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, u7 U  E9 ^/ G  [0 {5 A+ {. H2 _% W% |3 A2 K3 p. \! ~4 O

) D2 ]- d7 z1 o1 Y0 M; t

+ d& S  j, \% K7 u/ ?2 y1 C




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