嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# A3 Z- L: y& x& h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; V7 {. J3 ?4 G; e# q5 T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. u! B9 B0 U, a9 \) Q
# b* x3 Y2 f. }. ~8 B是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 j9 ?9 N0 g0 W0 R, g# x$ F! G% g" K1 r* E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* p5 r" ]$ m( ?* c7 B$ V- z$ @
/*
# R- `+ s  r9 V# p1 }6 H7 x* Check memory range for valid RAM. A simple memory test determines
/ l( s0 x9 h+ B+ D! x* the actually available RAM size between addresses `base' and
0 `; x" G+ G  }* |- `1 O* `base + maxsize'.7 s5 L( F  |( g8 M5 U! F
*/" L* _8 u4 m7 M# l
long get_ram_size(long *base, long maxsize)" q! W( W& l4 l. l& U2 n
{
8 U4 Y6 {) [5 d9 c9 Q+ y        volatile long *addr;! x( |9 I# d% c. u# q" y/ P
        long           save[32];. x* R- n6 _/ [9 \
        long           cnt;9 k" T" |' x7 s  V7 n* ]5 L
        long           val;) l9 q! w' b9 g5 ]( A6 o
        long           size;( U$ ^: K+ n) a7 d+ `* M
        int            i = 0;9 O, ~/ T; k* V( L& C3 h0 i5 }" |

7 X4 B  T  ^4 Q! l8 m: N  [8 `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ B% H# x* E$ S0 o, U& B                addr = base + cnt;        /* pointer arith! */6 q  {. E, G% ^3 o
                sync ();  Y& i! L- Z. C' X9 X
                save[i++] = *addr;
! G2 u! f* P# p2 Q9 R5 p3 _                sync ();) D( Y/ j( q* C: y* l8 Q
                *addr = ~cnt;& V( Q0 k7 e8 G9 {( ]
        }2 e; X3 r6 t3 W, K' `1 F, @
" R: h" k9 i9 `' ^9 p  H
        addr = base;
9 W2 h$ E. \0 |        sync ();
& e* A$ K. _# Y4 T6 |        save = *addr;6 Q: z9 c" p: q* a' v  W4 B/ Z2 x
        sync ();
  H6 O, b: G3 ]        *addr = 0;
5 j& B* s" i& c$ v6 Y7 A1 N, S  U5 i$ y2 t: a! B( j8 g1 W( ^
        sync ();% c9 h* N3 X" x- s+ e6 ]
        if ((val = *addr) != 0) {
6 V0 Z( ?  }5 x% l/ F                /* Restore the original data before leaving the function.
8 e0 t) ~7 w( c, u8 c" r0 E% [1 ~                 */. V) g$ y  i4 z) Y
                sync ();5 V4 X1 g9 s6 z. m
                *addr = save;
# Y8 ^3 D2 [0 E( w! b* U9 [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ |6 g6 Q! \$ I/ M2 u# _                        addr  = base + cnt;
: r2 Q; H' V9 b                        sync ();
7 p; Q+ p( H" v. v" J                        *addr = save[--i];( X( z8 N, e7 q: w  s
                }% s3 D1 V  v* e
                return (0);6 F2 l! Q+ O! j, X5 Y
        }" S2 r$ u" T3 U/ e
8 ]8 N5 J2 F2 V4 Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; R/ L; p. W* v$ p                addr = base + cnt;        /* pointer arith! *// ]# o" b& T$ W4 ]. z/ W, D
                val = *addr;
. h- ~- p) Q+ ~$ i* i                *addr = save[--i];
, C) A- Q: U# {& p' o                if (val != ~cnt) {
- p/ I$ N3 v' J                        size = cnt * sizeof (long);$ o3 q2 f9 R  Q7 |
                        /* Restore the original data before leaving the function.
* r! D- C! a5 i1 U. |' I$ ^8 U                         */
1 j' O% d  \; Q7 I4 @- j. D$ i                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' a- `0 c1 d) h* O6 N5 M: E# w: `7 O                                addr  = base + cnt;
* _, d- |. F7 ^9 `$ Y# H0 _9 n& P  ~                                *addr = save[--i];# K5 N1 b- O% W, _  L4 d
                        }  ^  U, Z8 V7 w
                        return (size);
" M( @* N" l8 p' `  ^                }
" n! z4 Q) V" v/ O' a8 W        }8 a+ Q  A8 J5 X8 F$ U! Q

9 r- J+ q/ E( f. ?% ?+ K        return (maxsize);
  P4 p4 q$ l: C- U; g: e. S6 f; R3 m}
" c! F% q/ u+ K3 g9 Tint dram_init(void)1 o/ ^  C) g9 K: m5 D
{5 U# [. Q$ S. B# [2 q% R
        /* dram_init must store complete ramsize in gd->ram_size */
: s$ d- A& y0 I, m' ]* `* g1 G/ _) ]# n        gd->ram_size = get_ram_size(& I9 }/ K3 V$ B
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 J' `/ B; p. t3 t' g% x                        CONFIG_MAX_RAM_BANK_SIZE);2 l+ q. {9 g% w5 g% ~2 a1 V2 S
        return 0;- M0 j; ]! Y: P' e( N
}
- _* b/ s0 }5 c1 D: x
. P' I# P1 {2 O7 Y7 R( l/ G% D9 V( B  s

) v9 T, r) e' n' ~8 m
0 [- o$ f' I# P- A% p- t4 uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ W* [3 p0 S/ [' W2 b
9 y: ?0 {0 r8 g1 a& N. R
5 |1 t. `2 I8 Z7 D( V

: @. |6 |% ~% F! c+ R9 g# g2 j




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