嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 G5 F; y8 N# T% c核心板2:DDR2 256M Byte   NAND FLASH 8G bit, i! F. y( Q  v4 J* h* A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 n3 b, k6 u6 @+ G
/ \2 I  j) h0 d* D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" j3 h) P+ o5 ]1 H( a( \& O
' t1 D& G, {: Y2 v! P5 Q6 Z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ ^: U$ x: k& o( o3 K, J7 X+ }$ t8 a4 ]
/*
) E) r7 j  B) x4 G; p+ E9 t* Check memory range for valid RAM. A simple memory test determines# V4 m8 G# E$ B5 ~
* the actually available RAM size between addresses `base' and
. q$ R2 E4 e* |9 j9 t- o8 [& x8 M* `base + maxsize'.
9 F+ l/ W# L, N& V*/
5 _* B# W8 j/ ~: j  N2 Glong get_ram_size(long *base, long maxsize)
' Q* q8 K7 L) O/ x# W/ e/ C{
7 j; z9 D  W  g* Z7 K* V        volatile long *addr;, X# ~. A0 ^, z
        long           save[32];
  l1 s) D' J: Q        long           cnt;, x7 @6 r/ V( n; X7 A8 r# V; L3 N9 s3 K
        long           val;9 l/ X/ \5 ^5 n. l* f+ T* ^
        long           size;
* C* q" L' U7 |2 p6 O+ c        int            i = 0;
! S3 g7 M" ~, Q% S7 l8 @3 X+ h: X5 R6 a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 b5 s  Y* T% R# q9 b                addr = base + cnt;        /* pointer arith! */
0 H' m6 }  S8 u4 m                sync ();
' J2 @0 [/ n5 H6 Z  [1 C                save[i++] = *addr;
1 a* v! c+ e) l( F: T5 _. n- I                sync ();+ {( A8 M0 p! ~( B$ M: q3 A( g
                *addr = ~cnt;! Z0 F% W* ~" B: v- n+ c7 O
        }
/ J0 k) T# I8 R* h7 P( R$ E" Y+ E8 h* n" O5 ~/ K5 @+ ?$ P
        addr = base;* {) K# q8 {3 F6 t5 V7 N
        sync ();: F5 O3 Q& t  e; Y6 v5 k) T5 q( }
        save = *addr;0 s  S4 ?( G* O. F4 \
        sync ();- K( C; c" ?/ C3 Y) P# U2 Q) f
        *addr = 0;- M! p2 X1 n, m+ o: d

9 K& V, P( S+ D        sync ();8 G3 C( N9 `1 p9 u+ T, n
        if ((val = *addr) != 0) {" Q1 _+ K1 `; J2 k  D
                /* Restore the original data before leaving the function.# O. {  }- W( g5 q" F1 k3 z, L
                 */  i8 N. Z( }: L& m* B, \
                sync ();
" p% P# e' y0 y/ W/ O" r& j                *addr = save;
! s1 h) Z% a* l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& l+ a; f+ v9 f8 H2 |                        addr  = base + cnt;4 g8 W7 ~+ G. t
                        sync ();
+ y8 p2 W1 t% H) k1 z- `& _) x                        *addr = save[--i];7 k: A0 Y" q7 f2 ]" `: M
                }3 @3 C7 c; ?! g$ d+ N* \- s- a
                return (0);1 p% r: C( r" P
        }
3 c3 Y' n$ Y* f0 ^
4 n; s# W1 Y+ A) \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' J/ R0 x3 I3 C
                addr = base + cnt;        /* pointer arith! */
' r+ c  c1 R9 i1 F% a                val = *addr;1 G5 P% V! v& g0 l: Q
                *addr = save[--i];
, r, ^  R: U; M3 x8 Y                if (val != ~cnt) {
% W2 }  z; F% k' w  v                        size = cnt * sizeof (long);
- ^1 ]4 C1 V4 Y2 d; H) H; f" ?                        /* Restore the original data before leaving the function.
$ {* I) Q) c$ @  d2 e                         */" C$ Q6 d) P/ e
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% x8 E4 [9 p; t% z& }  }/ x
                                addr  = base + cnt;
2 X# B  N/ Z1 J) y                                *addr = save[--i];( x# x* |0 c4 Y1 p0 \# I
                        }; B0 z/ }  F& U7 G7 \+ m  m0 h
                        return (size);* j( A/ a1 R- Q& A: I
                }
! s4 I) W  B, V1 ?6 x- N: f        }
# u9 f1 |6 s# l4 C
& v& ]: z: a, n. a        return (maxsize);
7 l; t  \0 k. G0 f/ l1 b}
4 z2 p- ~& c6 Oint dram_init(void)
! Z0 n* L- z2 }, i{7 |( q! S0 y' g5 V7 j
        /* dram_init must store complete ramsize in gd->ram_size */
9 a5 H* j) J# z) n0 m        gd->ram_size = get_ram_size(3 U, ]" I' [2 g
                        (void *)CONFIG_SYS_SDRAM_BASE,& [+ v1 K2 O) _( D9 V
                        CONFIG_MAX_RAM_BANK_SIZE);
& {# {9 e$ z% o8 |" U        return 0;. m" J! y% `1 ~! K7 e
}
* E" M, {) J7 |/ w3 l4 E$ }
6 i6 c, Q. I* \) ~4 C' r$ n1 ]

) I6 O$ R; u1 \7 l3 x# H4 e! X5 I7 I9 }0 G) H, T! d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 \0 p' m2 j* i4 Y$ R  y+ x! P& B! |* V9 y% F! _
& W& u7 q' S1 L" G" Q! d

' |. s! n- Q6 H4 L- G7 t+ J




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