嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% q# w) @1 O9 I2 G( Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' U* X( z8 k- V1 g
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  r1 F0 }7 T+ h: n! l. k, w
# E& f* i/ P: O% ]2 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' q0 q6 C- F+ R- ^0 k7 d1 }
( E5 a5 e5 E0 j+ w+ [
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 V: U/ t, q: K2 D: P( F. S
/*( e( E8 T8 k- w1 ?. Q, M/ N
* Check memory range for valid RAM. A simple memory test determines& j1 G. y. g; L; L
* the actually available RAM size between addresses `base' and7 {# ~0 {" ]. w* |/ I" a4 V
* `base + maxsize'./ ^9 P2 y2 g/ D9 ^6 |& d% I
*/
) \; {1 T3 _6 c$ A/ k: [8 x' hlong get_ram_size(long *base, long maxsize)
9 I$ M0 ?$ B6 E+ O4 }) M{
" g& i6 c* Z. [% l- k        volatile long *addr;
7 [% |* r% a* ^8 ~6 p        long           save[32];
# ]* x% g& F( C& Z$ h        long           cnt;& Z9 m7 c2 [6 F# `/ f7 m
        long           val;# i% B8 I' e3 y' E
        long           size;, @" P' a9 l: z# q
        int            i = 0;6 d7 D; u4 _4 S! U$ J( t' n7 p0 i
; ]$ U; H: ?$ Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ T) D# e3 L% ^5 y
                addr = base + cnt;        /* pointer arith! */
' g7 B( U0 h  O/ f% b5 p& x( H2 B$ p                sync ();
3 K- \+ H5 \+ L7 @* p6 T                save[i++] = *addr;* m2 d  I' ~1 x8 R! W8 Z/ Y# ?/ N
                sync ();
3 z4 e) ~0 Z, W                *addr = ~cnt;
% T$ b, F/ O6 t  L        }
2 N2 q, [  D  Y' l# K1 v# _
+ K7 u: A  V2 p( A/ s9 J' a        addr = base;
: R4 C: _9 o4 E& ^9 s        sync ();& ~# Q1 i, V7 ]/ K& j8 x
        save = *addr;
0 \) Z. l$ |/ K/ f! M" N: h' e        sync ();
2 |5 V1 \$ `0 x7 u7 z        *addr = 0;
( A9 x( z, @% s/ D
- g2 Z' g1 g) U        sync ();  m" l  x6 Q9 @3 E# M0 L7 G5 _
        if ((val = *addr) != 0) {* K  j0 i7 @# D0 \9 A& g# Q: u
                /* Restore the original data before leaving the function.
0 ]( B9 Y: y) X" M0 x* Z                 */
) v# ?2 ?6 A/ U  o6 _# d# L, D                sync ();
! o- l. g7 R6 |8 P( n. ?9 F                *addr = save;+ i! l* i( J6 U+ r. _+ S6 \3 [3 H: ?
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, K8 |9 w' i) {. F7 ^
                        addr  = base + cnt;
1 |" N. ^6 M  I5 F: J2 V  V; w0 R                        sync ();1 S8 L$ v) F+ E6 g
                        *addr = save[--i];
* b! z; H3 S( z% @& u5 @. a% r                }
* D- Y2 i+ @1 _, j0 ~                return (0);* j, }3 }6 _$ `$ g% g
        }
# J& s, V* m8 V: b. v8 u* _
1 O0 u: Z. x1 }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 \% @: a5 d; j" p3 B, X9 o
                addr = base + cnt;        /* pointer arith! */
: K+ r( h& b( o% @                val = *addr;" q6 z0 q; F" X) `8 C& C
                *addr = save[--i];
' n- [, |" n( L6 c$ b9 C& P                if (val != ~cnt) {
8 K. {% z) l, j                        size = cnt * sizeof (long);
9 [- C( o3 i4 ]6 q& S) D. j                        /* Restore the original data before leaving the function.
# n1 y. H3 A0 N* Q* D1 a                         */6 G- E" I* l* R- L
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( l# g6 S) D7 n! D* N3 y3 C3 ~                                addr  = base + cnt;
, n" @) I. F$ ?( ^( s9 l  Q9 ~1 t                                *addr = save[--i];  G1 E& [/ u! G7 t: V1 z* w
                        }
. w, Y7 I* `6 T/ T- W) ~# x: k% r                        return (size);4 \8 P7 z1 z# z$ ~1 {4 |- J
                }
. U: X9 F( T; ?        }" v6 @5 n$ p# A5 C5 L
. Y6 p$ u& ?' S9 F4 S  m2 N
        return (maxsize);
# ]7 w# K, W( O, p9 n  l! l}
8 l, Z& m" a; T. _9 ^; oint dram_init(void)
3 b8 \% u* O, p7 [{5 Q/ t# `! w* h+ [$ I+ y
        /* dram_init must store complete ramsize in gd->ram_size */6 j5 B9 A1 \' x1 w- Y# {8 l4 E" g
        gd->ram_size = get_ram_size(
  T" x! `/ i4 H4 y9 n" N) y0 F                        (void *)CONFIG_SYS_SDRAM_BASE,3 Y- }) T" Z5 b& T" d
                        CONFIG_MAX_RAM_BANK_SIZE);
- D0 R7 S* [! W4 P6 P# Q8 U% R        return 0;! D% A0 Y$ ~& ^$ i- j" g
}
' _% E+ Y  V, K
6 X. D( C, Y4 o' f1 B- b
, T# {6 r! L/ A* E4 j/ \( `' Y- F$ l
+ K2 ?. |  Q% e* ~7 R/ E2 e& e$ v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; y: S0 W8 j, n

. Z7 ]* S! j3 P- j# x8 \" Y8 Y
6 ^# }1 z$ A6 ^5 @
1 `9 I% y2 Q! |0 w/ [/ k$ p) x- S- n





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