嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ V+ e  R# x' D1 `
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 h- f2 b& r4 m% r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 {9 O# h% J& P! {# Z( r2 w* ]1 l2 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! H2 I) n) T: @- _  W9 O- ?3 s3 y0 j2 Q7 n, |

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 Q( r1 d$ X* ~+ H- W4 w
/*# R) c; y* A7 @2 A* Q3 ~0 T
* Check memory range for valid RAM. A simple memory test determines
- j6 H5 h8 Z# e; x0 t" ?* the actually available RAM size between addresses `base' and
6 u& q2 ]# q% F  D; ?/ k  C. ?* `base + maxsize'.
' _# e. x+ H: H*/
* n5 f8 L7 l/ S6 y& Wlong get_ram_size(long *base, long maxsize)
1 L" y$ G; o/ M& s" c6 W, [- j{
: H8 L9 ^' U+ r0 d3 r' T" z        volatile long *addr;
; P0 J$ E; A- B2 C/ Y        long           save[32];0 C- l2 b& q5 |" L) _  x- e2 H( ^
        long           cnt;
) P3 j1 g1 H( ?" z& U        long           val;0 x# w: I9 L, U# r- e
        long           size;0 Q: i2 E& O2 n; p) [' `
        int            i = 0;4 I0 E# P2 L7 N5 n9 {' ?% k5 V

) L, ?1 R# m) V: Y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! ]9 r* @$ `5 P& d
                addr = base + cnt;        /* pointer arith! */
) O6 s+ `7 {7 a5 ]( C                sync ();! ~0 G6 e3 K8 L
                save[i++] = *addr;
- [9 z: D; J5 Y/ t8 m                sync ();# L- K' S8 p" j0 y4 {* _8 F2 M
                *addr = ~cnt;
' t$ t4 N2 T: e- M        }6 m! h1 H, S# ]
0 `. i1 g1 o4 @) U: ^7 ]4 r# l
        addr = base;* i1 V( y' P. k; v' u
        sync ();+ n1 I% O, I! |" E+ J
        save = *addr;. d$ o7 o% ?) ]* x5 W, q1 b
        sync ();1 Q/ M) C0 m* a* Z0 `/ L5 R; m
        *addr = 0;* ]$ Q6 q6 `* U. N& y
& X3 M& D/ H- B; a+ s; P' `
        sync ();) y- h" Z; |0 l1 b$ V8 n: i
        if ((val = *addr) != 0) {' @/ X6 R( J/ p6 Q' @  Q
                /* Restore the original data before leaving the function.$ P& R$ K9 H" B) a5 v
                 */
9 b/ @& P2 f5 ^  ?3 `                sync ();
. Z! l4 ?( R/ W" G+ x4 G* o3 d* {                *addr = save;
, v/ d1 K2 J4 n5 V& x0 o& j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" `6 V1 U1 v6 r( @2 N8 Y) u
                        addr  = base + cnt;
8 V3 I$ R9 e! J. j0 Z$ D# O, i$ z                        sync ();5 y8 c  j( o+ q; e* j; M. g% ?
                        *addr = save[--i];9 y/ M! u5 y" }- k
                }0 _- @% N' b) _
                return (0);, e5 ~# T3 u) r- u' S! q) N
        }/ C5 A: m& L% H! q& E: q/ `8 t8 o2 T1 d

1 c# x" `/ {2 N! ^1 e        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ N2 |5 M4 M( H! J# T0 E$ y+ o
                addr = base + cnt;        /* pointer arith! */
: Q; X: b0 a; F" `' s; \, Z9 G. F. d% B                val = *addr;# j% g, |- V  Y* ]
                *addr = save[--i];
5 g+ |* m0 T, @+ O- ]. s                if (val != ~cnt) {, x: D/ C2 u! x& N& C
                        size = cnt * sizeof (long);
$ c) z/ K! ~& V                        /* Restore the original data before leaving the function.) X! g; l7 q0 I  o: D0 _
                         */( L. }( J5 c& G; l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 a$ ~% O& L; U- L3 b" F* Y
                                addr  = base + cnt;3 t0 |9 _+ T8 ^5 U! g0 [* P
                                *addr = save[--i];
0 g& L5 n! R* s                        }
0 ?; U, b- A" n# Z! ^9 b. t                        return (size);; {! k8 X- b9 U" p% A
                }/ M" ^2 n0 h/ P( s
        }
* r6 u/ ?- z' e9 @# E% U7 R
; \- q3 l& D) U: ^        return (maxsize);
' |& `. B0 a8 ^% _: ]  b, G}
, S0 O7 i% n' n8 z- Lint dram_init(void): |2 S* r/ j- _
{
4 y- @( c3 T. M, {' Y; ~        /* dram_init must store complete ramsize in gd->ram_size */
9 L# t- ^  A6 S9 a        gd->ram_size = get_ram_size(2 I" f8 {- y( V& b. `0 {4 w. N
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ S! \2 B( i6 @( ?" {! S* d                        CONFIG_MAX_RAM_BANK_SIZE);  }/ k! G/ `- a' y  N" q
        return 0;
1 D9 o( N3 e1 m0 I% I}2 F- w( b8 H4 \! n3 V9 Q" P

' U9 L( {6 v; L$ A  s3 p5 `
) r+ k4 J( @) L' e9 X5 X9 q8 y4 }$ m0 b# ^: e& M6 O  L

4 l9 p6 i& e2 g; M, ?* iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& r/ |  a! z1 I4 _
+ d$ x: N4 y! A$ A- `/ P2 C! I
3 F7 v6 ?3 P, x1 I9 j0 K

5 |" [6 M! N& ~5 T7 u




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