嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 _; A  [2 Y0 ~' }1 N7 n3 b7 M核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 i6 |' E( D5 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, {$ o/ {& }, n6 E" n( Y- R4 Y. a/ z' a

$ A5 V3 y& s9 |: X: w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" y( j. d1 ?( f0 _) z/ ?
: Z9 n2 ]: Z: r# l- I2 D
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 Y( B/ @5 W9 l/*
) \) Z0 y; s7 H/ Q* Check memory range for valid RAM. A simple memory test determines! I4 o! J& @2 d1 J- |
* the actually available RAM size between addresses `base' and
+ ~; y" W" N" a1 n* `base + maxsize'.
2 r& ^) E/ O1 O. z/ r+ F4 N*/
2 r  g5 G  ]) m/ \long get_ram_size(long *base, long maxsize)# B* I( t4 L7 L
{2 u/ I3 a( ^+ \( x' a/ q- y" w
        volatile long *addr;1 T$ S, Y0 s  C1 w% H- \& I
        long           save[32];
! L* {# N( H! O( i! H        long           cnt;3 n0 ^# H2 f6 u' H8 X$ u
        long           val;: ^8 V7 B  V2 c, a
        long           size;
2 l( G0 J" j9 M! k( _  Y+ u* X        int            i = 0;, x1 x- C' S! z' [- N

  j! G2 e6 a1 }$ B0 a+ j( H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 ~* ~+ L2 A$ m% F/ L# U
                addr = base + cnt;        /* pointer arith! *// I8 V4 |, T- H+ n9 n2 g- z- ?
                sync ();3 `! _  Z. k2 @" u6 p: z: \  L; m
                save[i++] = *addr;$ g, p0 |# r; H
                sync ();+ p# y. N4 u0 S. V
                *addr = ~cnt;
' i+ w: P+ s* n7 J+ I! b0 W        }' y* {) E1 c4 X
3 y2 B8 X" l% j) b- ]
        addr = base;
0 S; K: C$ q. D. K        sync ();
( [4 D6 e5 X- d& n" e        save = *addr;
( O6 z4 x& @8 g, L9 z" X8 F% b        sync ();
5 O- w9 D( U! q* V$ l2 E' L        *addr = 0;
  r3 A' A- M0 j5 d, O
7 j! d, h( }, x5 C' X3 c        sync ();. Z4 ^% F+ u  F' w3 P7 a
        if ((val = *addr) != 0) {3 I' j; P; O2 d
                /* Restore the original data before leaving the function.+ k8 \" v, H# L* l2 \2 Y
                 */
  ~8 q5 u: W3 l% t6 ?7 A& Y7 g% g                sync ();
! M+ A: }$ y4 T9 x$ b9 ?                *addr = save;" c, ]1 t" J3 f5 @) e) @- |% i& ?
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% `3 l; m- S- |
                        addr  = base + cnt;: `) R- @% l9 G; J) p; ?2 }
                        sync ();: I& Q0 g4 P+ n' T/ e; R( L
                        *addr = save[--i];
. s2 v4 P5 P/ X! n  Y                }
& k4 K) i% q0 w/ T  P0 S6 t8 q                return (0);
0 _1 S% N3 K! p2 V1 o. j: D        }8 j4 Z/ w! v, ]1 [/ X( }! L
( x+ f/ `3 e8 G/ {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 m' \: c, W  H( b
                addr = base + cnt;        /* pointer arith! */
9 c3 s- X: `& H" ]                val = *addr;- Z$ s1 e/ w( X( I
                *addr = save[--i];; O; o" z' Q4 y; v+ E
                if (val != ~cnt) {/ p* C/ b7 l+ S7 M9 t7 G& n
                        size = cnt * sizeof (long);
7 \( G& t, _& ~8 D5 E- E, S                        /* Restore the original data before leaving the function.; {, {! r2 c% f
                         */
& j& G: X) ]/ ~2 V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. ?2 q- c. N8 x) X6 A& f; M& }                                addr  = base + cnt;
# x8 D  u# j7 E$ @' p" J- X$ Z                                *addr = save[--i];
1 F0 j6 j& V8 D/ T                        }1 V" z/ p( Y  e
                        return (size);
' x9 g" v. Q& m0 z! z4 ?                }
- {* _" z/ t1 J/ P( e        }; [5 g+ D) l) k2 U- ]$ A9 u& ?

2 F/ y) [& z' G9 n( }        return (maxsize);% B7 b6 D. {) [; D6 w; q/ u6 @
}- T3 H* ^2 O8 x. s/ D$ {7 W2 E4 B
int dram_init(void)
1 A- x4 ^/ }3 s& B{1 Z6 N/ b( P( ]+ }/ x& ~" T+ b
        /* dram_init must store complete ramsize in gd->ram_size */
8 P7 B5 B7 O0 z        gd->ram_size = get_ram_size(
# |7 G+ l* D( u                        (void *)CONFIG_SYS_SDRAM_BASE,
8 B) N2 H$ J( |( r, A4 C                        CONFIG_MAX_RAM_BANK_SIZE);
  z+ q) q7 Y3 s  D4 J4 ~        return 0;& |" @0 P# J" h% e5 f3 ?8 m
}
5 W' A( o8 ?$ h2 ~  ]& f
3 ^9 S% F- J0 Y6 D) x- {( Z
; y8 I$ u* |# C* B# I. y+ E+ r0 }6 @; N6 J% e

& w2 a, |; i; |* i( |5 ]FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 t% z9 k/ H3 S, n; [
5 {3 ^( [$ G" {0 p8 @5 k

! r: |2 i2 _7 l6 u* g& K$ N- M; L' b

6 y$ e4 s8 |" y" ]8 x; Z




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