嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ f) r' C" S: P2 X1 r
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 [# Y4 d/ \/ H+ a. \这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ N: l& J+ j9 Q. N' h5 N; S

* z( g( R0 w- N6 a3 B: w+ ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, R+ F7 Z- w2 r4 c3 Y% Y
) [4 V. _- D  [! P! H' E' i, U

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; n$ l1 ~% m# m2 l; w
/*
* \$ u2 {( {. g6 s, X* Check memory range for valid RAM. A simple memory test determines: ]8 m) U6 J4 }- ~
* the actually available RAM size between addresses `base' and& P2 B" h$ x7 F. E
* `base + maxsize'.2 J& ~5 M9 M- t  {/ Y
*/  U0 W1 k+ M0 W/ b+ C
long get_ram_size(long *base, long maxsize)0 @+ @! `* ?( S% U) j
{/ a' c- T7 I2 u$ X% A) k8 y# |
        volatile long *addr;
+ L8 c9 }  Z  S. N: k        long           save[32];
' Y. d8 w. \" R. F! L: R        long           cnt;
$ R. w. Z! t' a8 A        long           val;
) }6 H  o  ~! X' P& ~        long           size;
  Y) Z$ V4 `& t( X/ x+ b4 ~7 O        int            i = 0;/ I  j3 H- V& n: `

$ M: r. W9 u: Q0 p# I" j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 ^1 R/ q2 c% r$ K& ]
                addr = base + cnt;        /* pointer arith! */2 Q! t/ S* k0 \9 `
                sync ();
, r; H  x; m% W) i2 D" t                save[i++] = *addr;
7 T  z1 _8 N+ _8 `# R+ v                sync ();
0 O5 ]' v0 Y" ~6 m. k                *addr = ~cnt;
( c+ S' m* p* O  i        }- N7 Z8 J$ ]7 h2 P7 u
" i! F7 {7 b1 l* D/ u/ v
        addr = base;
& x# w- t4 W9 B8 w" H        sync ();. k* }6 h) ^! y* l% c. a- ~
        save = *addr;
- N+ Z& y0 }# O# v        sync ();4 Q1 T. C- ]# P4 s; j6 q
        *addr = 0;
# N. Z7 S; j1 X/ }$ |/ B$ y$ q
$ n$ U7 U. v, G; \) Y* Y5 J: c7 k        sync ();1 t' K+ B$ r% Y7 x" k( U. T2 }
        if ((val = *addr) != 0) {# ]. {. @9 J/ {0 \) A( q/ D) b
                /* Restore the original data before leaving the function.
$ J( J* }6 m) S( Z- R                 */
$ z9 e0 H2 m5 a% n3 G                sync ();3 }2 C. m; r! }0 {. z
                *addr = save;( e$ F" ]# u% t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 j" y/ r) Y' S1 ~8 e
                        addr  = base + cnt;
8 J6 U. a) r" V+ M$ v- m                        sync ();8 R+ }6 W8 d4 ^* L& C  F) ^' p- p
                        *addr = save[--i];7 P/ f2 m9 X/ P5 f7 o- U8 A
                }; k+ c+ r0 E, r7 F  r
                return (0);- {6 p* f# f+ d
        }5 E0 [1 D  n- `) W) F0 f) W' r

2 e, L8 w3 Z8 a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# Y' m9 k" Z6 v6 u  h4 m
                addr = base + cnt;        /* pointer arith! */
$ n# `. U0 Z0 W. {& J6 {                val = *addr;- F  Q) u4 g+ c* V1 T; |
                *addr = save[--i];, v, d7 ^- n0 f( [; j
                if (val != ~cnt) {
7 B/ J( [( a% N# F7 h: N                        size = cnt * sizeof (long);
  T( K" A1 v4 r; O                        /* Restore the original data before leaving the function.
+ v8 ]+ Q7 L* ^6 w& o                         */
, }8 c! p+ K1 K9 c- I+ Z  D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 r4 h6 N1 p7 Z4 v- d                                addr  = base + cnt;/ P* W; X. F# x. E% S/ l$ Q% n
                                *addr = save[--i];
7 e% q" ]- ?2 V( s5 ?9 n                        }3 J6 D: c, @( q. y+ m
                        return (size);2 [* e  c. x! G8 u, y0 X% U
                }8 y- G4 y' y0 r
        }
+ y( E+ m2 n8 O2 {# _5 i3 H4 y- V( d- z9 V. d! i
        return (maxsize);& j( X3 _7 X* t* i% {
}
1 Y/ H7 q* s/ eint dram_init(void)
; s  D  T1 e0 r$ `# W" c{. s3 m! P$ K4 {: j6 y8 b0 p/ Z
        /* dram_init must store complete ramsize in gd->ram_size */, z( r3 w; m: }. o0 t$ m* q' u
        gd->ram_size = get_ram_size(" V' q$ {! e$ n3 G
                        (void *)CONFIG_SYS_SDRAM_BASE,) N9 P, o, k/ h' y9 B) Q
                        CONFIG_MAX_RAM_BANK_SIZE);1 S$ k' v9 l* T; l5 {
        return 0;
% o  l* v# G9 ~$ U+ i$ ~# ], u}
* z% Z# t9 U& H7 F& X4 u: T1 ]- R- B
. C/ \7 Y! _: m2 T
' [, d$ B0 h& A  I5 {  h* A* l0 Z1 X

( q( A5 {4 v4 x" x! yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; ^4 i& k2 T; [" T. Q) x1 }
! X! U% a& V' _$ g$ r0 }+ k6 z. n- `
9 {4 c# V7 B# A: Y; q





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