嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 ~$ r8 ^; q- T1 v+ F6 C$ z( b! V$ M核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; Y( P% }7 y0 U0 S6 l2 c* q- l2 n4 Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  F9 O% h* z. x4 k$ i

( H8 f. ]) d4 Q+ ?2 P* E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! j. p* I! L3 _2 V2 ^, h: d. M2 z% x" a- F( D' p, B6 ~

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) |, D1 _" H) f6 V( R2 }
/*1 k; P9 w+ f6 A/ {. ^1 y6 ]
* Check memory range for valid RAM. A simple memory test determines& G& ]- T: ?" p
* the actually available RAM size between addresses `base' and
0 w$ u  v6 M6 @3 R; p: J* `base + maxsize'.) i/ i! P9 g/ C6 x" A( o3 g0 _
*/% {* U# \- `# C5 p1 j
long get_ram_size(long *base, long maxsize)
( o4 j2 A" e8 c2 d{
. h8 h1 W9 w) s) j$ ^7 k1 b* k) i        volatile long *addr;% j, Q1 q4 o" I. O
        long           save[32];
2 P5 S) u; X) W2 S        long           cnt;
5 a. U4 ?! ]9 b. {! w        long           val;
. j' Y% f; x! S8 q        long           size;/ R0 ]  B. [% {8 o- {. u7 G
        int            i = 0;  k0 b8 P3 m2 C! E, |" \- c

3 r: p7 z% `7 I- O0 w# h. Y: r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* O9 j; b, t9 W% V$ q( y                addr = base + cnt;        /* pointer arith! */+ W' H. N" h+ Q3 a( Y: I7 b
                sync ();
  ~5 Y4 F% ^$ r' F                save[i++] = *addr;
/ Z2 U/ l! Z! M                sync ();# I: x+ L. e9 E% Q
                *addr = ~cnt;3 P# ^3 H5 L% f' k$ \  w- m* |
        }
: m) B; i  R7 {- o; h! m1 \* O5 F5 s) l% c7 w
        addr = base;
; C4 l+ R6 U% `. F" V% a        sync ();( a2 R- d, }0 I
        save = *addr;
" s+ O/ d& z0 t9 Q9 c% G: U        sync ();
' x# e9 c/ O' r, R( Z# R3 B        *addr = 0;% K0 B  P0 d& x9 h& _+ @1 @: s

, K; |* w& ~7 h# p6 r4 F3 M# A        sync ();
: U7 ~0 H7 {& z1 O0 \  U  `        if ((val = *addr) != 0) {
, G1 m4 T3 q1 ?' s5 v4 }1 _( T                /* Restore the original data before leaving the function.4 T  D0 J+ W0 W) z) f- ?3 \
                 */
: I7 N5 C7 ~! W7 k- Z3 `                sync ();
6 }: Z5 ^; t! k& L2 w                *addr = save;
8 i' T; ^: N/ T9 l# y) `6 B+ f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 @1 h) {& u/ P; E  z$ Q
                        addr  = base + cnt;
1 l+ J% Z. e* i, H6 L3 d' i7 L                        sync ();
5 n0 n" @  L) n& ^! y                        *addr = save[--i];
1 C' M0 A( e: O$ @1 ], x  W                }
- e" A- |) a2 R. F; x- c                return (0);
5 N, d* D% L% U4 z9 q( A! p        }
( _  x+ y8 ]+ t+ ~8 f/ q: }. p0 k6 d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 @$ q4 t- `) M3 H9 h) w                addr = base + cnt;        /* pointer arith! */5 p' ?! {5 P: l$ f2 l& R( q
                val = *addr;9 z" `4 M& c6 |# P1 h
                *addr = save[--i];( G; T4 \6 I4 k4 Y1 r2 g( g( b
                if (val != ~cnt) {# f& A/ L& ?0 S/ q, \3 {- O
                        size = cnt * sizeof (long);$ ?) S; l% P) o. q* p0 D/ S
                        /* Restore the original data before leaving the function.
6 t0 s$ O' n. s- R( A, H                         */
: k7 u/ b# R6 w) y0 J8 q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 |$ d; J  `% V; M  O$ ?  p                                addr  = base + cnt;! K. k4 b9 n0 v3 j" f! {
                                *addr = save[--i];0 h: _5 I2 `& a
                        }9 ^# \5 D$ w7 E+ p2 T+ S% w
                        return (size);
/ z$ M8 ]0 J; @% ~+ s, }+ O                }
7 ~" ]+ {6 K! r4 n        }
, r% k, ~8 Y8 x9 g6 S/ L" u1 `$ z2 ]* w& R. L$ t( d
        return (maxsize);# T2 g1 \+ j4 g1 q0 l2 s
}
. B8 A5 f. i" d4 iint dram_init(void)1 h( E) F+ e: W% p1 Q9 Z6 E
{
0 J+ \% e3 }0 U- W3 p4 e& G        /* dram_init must store complete ramsize in gd->ram_size */
5 N; {/ [4 o- d+ ]* d* ^" P        gd->ram_size = get_ram_size(
" M2 ^9 M6 m  a3 i& |                        (void *)CONFIG_SYS_SDRAM_BASE,/ B) C. t) n$ X
                        CONFIG_MAX_RAM_BANK_SIZE);
6 p$ f. T! K5 Q( N/ v        return 0;
0 d6 A5 Y/ v4 p& B- u}" q3 L! [4 w4 C, x" z
7 h6 X" K. O: k7 t' c

6 I9 C5 T3 M( J  R; E: j  S/ q, z+ W9 q! u  w2 n% t

. g! \3 i+ q& e/ R2 T! m; ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: x6 G  ]9 O$ r0 _/ h' y0 \- ~/ l. W+ Y) D, R: R, m
6 a( U+ B) \6 D* x0 W* F  R

7 O+ p) C8 N3 e2 Z3 T




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