嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' @: y! D# j+ d" [$ p核心板2:DDR2 256M Byte   NAND FLASH 8G bit. j/ p! H- Z) M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ U4 q" O- n" X: r+ B1 a
7 n/ b: x1 U' i# P( ]是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! z( r" i  z" E' R) W& y

! {* r- i: b% U4 r1 h( }0 I9 C  l7 @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 N, p% t. r9 n- C" B6 L6 q/*
$ i- ?" r$ T' r# Y* Check memory range for valid RAM. A simple memory test determines
& |& L3 v1 L1 }$ a/ a7 f5 ^* the actually available RAM size between addresses `base' and
6 r  O6 K9 {+ h8 L* `base + maxsize'.& Q$ H9 T; ^' z1 b# y0 W
*/. U( W; L7 w+ h- ~+ _* L2 `
long get_ram_size(long *base, long maxsize)3 \( \6 X- K- K0 |2 V. _  k& u
{
: [' g/ ~1 X! z( U( e        volatile long *addr;
* \8 W* W# f6 D4 c        long           save[32];
; b8 V) U6 G  a. R/ T  r) d        long           cnt;
5 c) d) N; l+ r( c8 m  F7 c! B9 M        long           val;/ u  G9 v2 V+ [; e
        long           size;) j. G. h" Y: {# |2 k' P' @
        int            i = 0;
$ d+ l6 n+ S! I2 L- `( h! \! d
2 z( P  ?* _% B) c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 n5 E3 Z; ^6 V/ W+ d
                addr = base + cnt;        /* pointer arith! */! a5 f  t; H3 c0 t0 x7 M
                sync ();
  r; d: @( K6 m4 ]& y% q" w. P                save[i++] = *addr;& e8 H! F  \' g5 n$ r
                sync ();
5 X6 k. E) I' x, A, G5 n9 L$ l5 k  n* ~                *addr = ~cnt;6 Q7 U6 N1 A) W
        }% v! x( O$ M3 S- {; {

* f2 s- n9 A: _+ @        addr = base;
# ^: K/ b" X4 Q( {: n7 w+ t6 N6 y4 M. C        sync ();& }7 L9 U9 }4 ^( ?
        save = *addr;0 \6 p4 A. d2 z6 H; X# p
        sync ();; M4 A' Q( l1 S6 e& u3 w
        *addr = 0;
$ J8 l; y" @3 W2 S: L
7 h) L2 o4 j& l, v4 _1 i        sync ();
6 E. l& E1 H2 @$ m! P        if ((val = *addr) != 0) {
* V# V; p6 }4 B+ Y                /* Restore the original data before leaving the function.: M; J7 n+ o6 X
                 */
, r" c" U& F8 g% F* I- G3 l% M( Q* {$ r                sync ();
. H& A  A* U  e& R- |                *addr = save;
* w" ?: ^5 `8 {7 W3 J  @3 h/ k                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( H+ @+ \) r, u# Y1 D
                        addr  = base + cnt;
7 I6 H! T! T; G) x2 [6 |4 b                        sync ();) v# M) R- k( Z$ g
                        *addr = save[--i];; H* k" {5 g' B# Y/ T
                }
+ @$ C" p' a3 R1 Y: ]                return (0);, X4 [: \1 r4 l" h  b7 g3 U
        }
0 V" H3 A* ~9 A( t
. l5 l8 b1 X& G" _9 w+ D* h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# s! @% I1 b/ c  ^! O/ T7 P5 ^
                addr = base + cnt;        /* pointer arith! */
9 G) P. a! y: Q' t1 z" z6 T& n6 e                val = *addr;# c% _1 o; @, N+ Y, g- R2 a6 \
                *addr = save[--i];
4 j2 e, s  t! B) I0 e                if (val != ~cnt) {, Y, M5 Z* }1 r4 L& ]9 R
                        size = cnt * sizeof (long);
7 a& J. i& V% [                        /* Restore the original data before leaving the function.5 m3 s8 v) a* n8 z; L
                         */
7 o8 o6 l3 D( M2 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% T! p4 }/ e( Z' a4 h; [0 O+ J5 ?- N                                addr  = base + cnt;( Y: M" Y$ X4 ^. |8 {: w! b
                                *addr = save[--i];
) `  b0 }2 a7 \8 T; Z% r% C! Z                        }
& s. ~$ u  v( j& @                        return (size);. L7 S6 n$ b5 T, y
                }
+ A2 m9 _5 K) ]        }
+ V- G/ ^- v1 Y& a+ k7 d
' s  @* s5 k* @$ t4 Z) ^. x0 h' Q        return (maxsize);+ _  z" Q! e, M$ V: K, y
}& f8 G; \& x: k& e( b
int dram_init(void)
# `( k. t( P2 ]) Q9 n8 _* I{0 a3 o3 S0 s3 p6 j+ f9 L0 |
        /* dram_init must store complete ramsize in gd->ram_size */$ M# j, L. Z3 M
        gd->ram_size = get_ram_size(
3 p/ k% N8 b5 _$ s8 l  \                        (void *)CONFIG_SYS_SDRAM_BASE,
% W' ^9 s# Y$ [# ^7 T( W6 D' t                        CONFIG_MAX_RAM_BANK_SIZE);
3 C7 f9 s( O5 J1 E' _0 O# R        return 0;
# T& X1 F* M9 {- {}
0 x8 G; [) m& k1 W$ G! p. T( c: z
: K9 s1 ^0 e3 x+ v; `% R- K& T$ S# v) ]0 q' \
! w& t7 Z! D0 p/ Q% B9 n
) L. J! N9 P) Y5 j. a0 A) [+ \+ _# p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- P0 e6 _9 T& g7 _9 X' R$ T
8 N, S6 Q5 E2 M' `! z4 x$ u+ a3 ?
0 `: D6 J7 W+ f  b5 k. M
1 \) T& s! b- z( O; G) C





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