嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 Q- p' h1 y* m! F0 m. v9 F$ `6 l9 B9 e核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 W3 w" G' Q) e/ Z# T8 h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 Y& |) G7 Q7 Z( N

/ J+ i; Q: d6 c% v是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; @, \$ m1 `: i8 K$ s* L2 x
  L) \5 l* i, T5 f2 i  x- W) V9 E
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* f& D( e1 X6 O' q3 R
/*
: e$ ^1 C2 Y7 s* }* Check memory range for valid RAM. A simple memory test determines
! i  r1 D# N  L* f* the actually available RAM size between addresses `base' and
3 q$ A/ N: ^0 ]* `base + maxsize'.
1 C: Y" ]) a. s: V4 i" v0 Q. I*/# O" F# X8 M; L- s. j
long get_ram_size(long *base, long maxsize)
1 |0 Y; ^( \8 r; p1 ]. }{( F3 R- P& U& e9 H) s
        volatile long *addr;
5 T2 G- a/ `, |/ F5 Q# [# I( ?        long           save[32];
* k5 s; n/ B( o) n: C        long           cnt;2 S0 }" A; N( R0 S
        long           val;) X' K; `3 C  L+ R% M
        long           size;5 b" ^1 I7 E9 T4 E" M1 U( u. I
        int            i = 0;
0 ]) h( L0 x6 }# U. H
4 s$ i8 f# }& H: Q# t: O# t" L: Q! `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( e  r' X) z' x( O7 I! C) }
                addr = base + cnt;        /* pointer arith! */% O4 I4 c. Z2 B7 [
                sync ();
9 ]: r5 }6 J4 ?: m6 m3 m                save[i++] = *addr;; h: i. v! l" _) ?" H
                sync ();
- a" B( ]8 q2 Z0 q+ q                *addr = ~cnt;! J" `+ i7 b) ~: T6 N# l
        }
  f8 F- }# G. X& s5 Z9 ]
% L. q. A! l% N, Q: j        addr = base;5 @* V  B* c" {, H3 g
        sync ();
- k% j% R6 z' m$ p        save = *addr;
. u! d0 D: Y, r; D        sync ();" @: Y- s0 `8 J7 i: F4 Z! s' w
        *addr = 0;
. Z$ p; j* [1 E
' `( T( n8 m& }: Q9 x8 C        sync ();
, s* Q' ]& C- j; B        if ((val = *addr) != 0) {, u& t- F7 _7 K# j4 g5 G
                /* Restore the original data before leaving the function.
) |/ q' b8 X' f7 @                 */
& K% W' I7 S. c8 i                sync ();3 M. l) C4 w2 F; {7 F; y4 k9 |$ s
                *addr = save;
- B7 _; U3 E+ I3 q3 o                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 D+ Q* Y" U( E6 m& S' {                        addr  = base + cnt;
' j. K# j2 a2 S, B                        sync ();# O$ l7 O% A% J8 ?& k# F
                        *addr = save[--i];2 p  c6 `& {& U+ l1 l" U% ?( `
                }+ u8 f: \: M( J, X( B8 ?0 {7 z! q" z
                return (0);
. [( `) x. I6 z6 K2 P" ^) I/ N        }
% F0 ~$ p7 C$ X5 b. q' F$ U4 K" T* O1 I9 C$ S7 t3 K0 a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' h/ t, @, s6 b# L% Y% J, @2 |
                addr = base + cnt;        /* pointer arith! */0 \; I' U/ F% ^$ m
                val = *addr;* I; D# d7 W" @3 U2 L6 X7 x" m, l
                *addr = save[--i];! p8 k% O3 x/ F: |& R
                if (val != ~cnt) {- ~3 H1 m( Y+ h
                        size = cnt * sizeof (long);
; h. E/ Q) \# Y9 z. g. J$ G                        /* Restore the original data before leaving the function.' ]0 H: u, E8 s$ [
                         */
$ m8 |! z  v( j' D9 ^# t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 b& u0 d) V" b  I  N0 ]                                addr  = base + cnt;$ X9 {' s0 X" I9 R/ n7 {8 h- J6 E
                                *addr = save[--i];
& Z  `0 B2 ]; B3 L- [- ]+ |+ R$ k* H                        }1 r$ |1 z7 C" j8 E- c/ u
                        return (size);! n- p% J/ @2 n4 q$ p; d6 w
                }
: X: C" |' f5 d  i4 B7 k5 r6 f        }+ g3 Q+ v0 ^$ H( J% x. C; A
; O$ H- g7 r1 i. s
        return (maxsize);
* i8 S" L! L  ^5 |3 v. _# P5 t}( y% `0 `8 m- i7 \1 K" k
int dram_init(void)8 A: c. t2 \1 U; p1 J! |) R5 @% c
{: x5 c  j* q# X  c
        /* dram_init must store complete ramsize in gd->ram_size */
5 I0 W1 y& k+ o6 p/ T6 Q        gd->ram_size = get_ram_size(
, T* F7 x, G7 q+ J, V, ]' u  B9 R& E                        (void *)CONFIG_SYS_SDRAM_BASE,
( j5 c2 Y: j7 h+ c1 W1 G" ?8 i( Y                        CONFIG_MAX_RAM_BANK_SIZE);* F9 ^3 |8 q* D6 r
        return 0;
# @7 N% {8 n4 }6 H; H, I& v}
# k$ [, r/ p* \8 p* ?$ ^
; T/ G' G; P5 [6 s1 @" {
) Q1 j3 d$ Z! f9 E: e0 ?; G0 ~4 Y( q

7 n0 V# S: I; x' n5 t( w  }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 p& ]+ i' B: ^. A3 u* j2 X2 R
2 i, j* N4 q+ I9 m
7 p% w& p4 \) V

) M( r9 `8 _& G0 D/ j% v




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