嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 X) ]3 T8 M: s. i/ B# V" i$ m6 |核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 q  R7 }# j5 b1 o, _* B2 z  `这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" \1 ^" C$ B7 o  x, \3 x; @# x, h+ N& G$ I% Y  _6 t9 {2 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. A4 t; l4 u$ N- ]5 ^- Q
. A) N( J, y; r/ N
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' F/ k! e6 _6 e
/*0 C; @2 Y" b" a( Q
* Check memory range for valid RAM. A simple memory test determines
# c0 h6 D5 H0 P* the actually available RAM size between addresses `base' and
* b, X7 d7 d% N! e. W8 o* `base + maxsize'.6 x" V# t: `7 j- }8 p; H4 |9 N
*/
6 a, g6 @3 O7 p7 F- Y; plong get_ram_size(long *base, long maxsize)
: J9 s7 O. S2 M* D. U" F. o- `{1 s6 y4 W1 d" m/ i
        volatile long *addr;
: r, k9 y4 m' K3 w        long           save[32];# o( t( [/ l- P
        long           cnt;
+ S2 h2 V& H& F; R, v, m( G; u( [        long           val;. @, a/ f2 V" e2 A" g
        long           size;
' c2 z  S" s8 R) d        int            i = 0;
( F' o' W$ {$ c
5 r3 U$ V: ]* a3 \* L. M4 Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; k! ?7 `' v5 r: g' r3 J
                addr = base + cnt;        /* pointer arith! */
# ?" |/ n* Z6 F% Y                sync ();- C+ N$ H# a- g' {/ e0 H' D) j) r
                save[i++] = *addr;
9 z+ p4 {3 ]# V2 v                sync ();. o1 _" s2 H7 S( o# ^. W
                *addr = ~cnt;6 [: t. S+ Q$ ~6 ^. }' g
        }
  H, |) H# c, ~* D  {
( t: Z/ g4 l2 F$ ]        addr = base;
( b: X- ?: A" F  E/ N( x6 ~        sync ();
6 E, Z2 l9 }/ L7 }+ o  f        save = *addr;
0 o- e1 S6 I. p. }) \. D. f        sync ();
5 D" r" ~  ?* v/ y        *addr = 0;
# N7 n& X: x4 ~1 n8 {, A9 L. o
2 u' Q) Q9 F9 a" _        sync ();
$ b9 D+ G5 O' |6 v) ~0 O% p- j8 f        if ((val = *addr) != 0) {# R# ~5 E% f/ L  }
                /* Restore the original data before leaving the function.
" ~8 K* u6 G. j4 ^1 G                 */: t0 c- W1 k% Z/ j& |4 K
                sync ();
  ?4 F/ F. H  p4 [: w# {                *addr = save;
  j  b7 _0 V7 w                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" s" E) M( h2 M5 ^
                        addr  = base + cnt;' v, R2 @$ ]/ w+ T, d3 Z# U7 C
                        sync ();
( Y0 ]' W2 J; B" y                        *addr = save[--i];
; t4 @- b4 c: u' B& f/ S                }
  L2 E5 x1 ~: o+ U) T                return (0);
4 S" N/ f3 ?: y  [        }3 r7 p0 h: w* f% F) F+ k- a( ~0 _

2 k% @0 f1 j5 H& B; w  T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, A) K3 W+ R0 L7 {                addr = base + cnt;        /* pointer arith! */8 L; t8 v- [& C6 i% Q
                val = *addr;, X! T+ g( i# H$ d$ e1 c
                *addr = save[--i];
5 P/ r' ~* e+ j7 `2 ^2 P  N  N                if (val != ~cnt) {9 b8 ^# ?" C- t, h5 v
                        size = cnt * sizeof (long);
( q1 I( Z% ^% u0 v+ I2 O( ]! ]                        /* Restore the original data before leaving the function." @1 z& m8 s7 J# e& Q. d1 f
                         */
0 _, u$ R, w* W3 E+ r9 x  i, L! ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 ?( v# N* U4 }8 v
                                addr  = base + cnt;& b. [% }4 N0 @+ u* ~1 E
                                *addr = save[--i];( A" i7 ~+ G* @
                        }
8 U9 K% J& Z3 ?7 g9 f! P& W                        return (size);
9 Y+ C7 g; @4 q' l1 G- }& Q                }' h& n" Y( F. G( t
        }0 r1 r) K, e+ I. A

3 S* a( L& D4 z4 s        return (maxsize);
/ ^3 {; z5 R0 T}
2 Q& y5 w1 o& \  g6 e6 Uint dram_init(void)
6 _& p* {# F4 R0 w{5 y! L; L4 y) G
        /* dram_init must store complete ramsize in gd->ram_size */
; C# `% B* D7 H9 P. L0 U- Y        gd->ram_size = get_ram_size(. v) Q$ H+ L2 W/ z
                        (void *)CONFIG_SYS_SDRAM_BASE,4 `: M7 Z3 ]! Z3 W6 C
                        CONFIG_MAX_RAM_BANK_SIZE);
. I- m" K; M& u! n6 K. c        return 0;
7 B' I+ @' v% P3 `}% Z7 ?+ v: @9 Z: {! C0 Z

; {' U& {9 Z. C/ k3 S1 u8 I
# X6 k  @+ o9 ]5 y+ E  R8 v, y' Y, U1 K7 h+ [. P0 d, r
& a; E8 U1 Y- l" [3 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 R/ \1 b+ r" Q0 v" N
/ r" [( L. N3 y
  Z$ a" `2 y  X- g& `* k* T$ p

1 A, ~) Q2 \8 _* g( n. y




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