嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 J  R) s/ s6 @. n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ O/ H. d1 _% I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 w8 }4 \$ R( u2 e
. K, q( Z% W3 Y. |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 A; t4 E5 |9 G' t

) E: c9 q: }( h* {3 G
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ T3 i4 J& k6 R/*
7 y1 V4 }0 S/ n# ]* Check memory range for valid RAM. A simple memory test determines" a* v- k6 X- [+ Z; c+ S; q
* the actually available RAM size between addresses `base' and
7 C+ P9 [& @' L$ S* G2 m* `base + maxsize'.) M0 z- ]. G& I+ ?) j9 U. _: ]8 @
*/
8 R6 ?% n* b/ o4 }" Slong get_ram_size(long *base, long maxsize)
! {& Y( M9 A  c{
4 A1 g4 S% B* |        volatile long *addr;
/ W6 c* {- q! o/ Z( b; g        long           save[32];
! V" Y% U. T% l! c! A+ |! V7 C        long           cnt;
7 L& V$ ], w3 [! h- z) |/ y        long           val;, {: u# s; D8 z1 I0 c
        long           size;
3 t; t4 Y' ?, M$ Z) Q        int            i = 0;
* \5 ^% V" K& ~2 @+ ~
8 Z7 h* ~' V- c( M% u' \3 ?        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 ~7 M+ a1 p% a) x
                addr = base + cnt;        /* pointer arith! */
" y1 U- I! @! x) Z8 J  d                sync ();, R5 |- j( A! a- V- Z5 f# W
                save[i++] = *addr;
& F, [: \" R" p5 b) J* ?                sync ();
, W& v  V) E$ g                *addr = ~cnt;" H; b! T8 T1 `9 I# G& _8 Z
        }$ C, a& d3 E3 n# u8 h5 ^

2 X) u! j3 V' \) ~' S! \8 t        addr = base;) m) W2 d: ?8 |- M" D3 C6 ]
        sync ();
% @1 S5 k. f0 O) e        save = *addr;' _* u4 s, w; l7 K; I+ y- q- w7 L
        sync ();) J2 N8 d) X9 l' x& @- B& I
        *addr = 0;4 X7 l1 l% W) L; w3 y

: k7 [2 O; c5 u/ K& C3 ]' C        sync ();
5 ?4 Q' T6 e4 l: K, t. ^& d) B. F        if ((val = *addr) != 0) {
# g) x" j" X+ e( \1 m3 i. d                /* Restore the original data before leaving the function.
- S6 _( B# d5 p& e' Z4 G                 */& f) T6 ]  P' u* l( ?6 G( [
                sync ();' z3 c/ W4 w7 ~0 ^) c
                *addr = save;
" M6 T$ w) s* x3 r; s! u' |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, Y; u7 ^8 V, s
                        addr  = base + cnt;
' V2 O: X9 w/ T                        sync ();& A' ?" j- |* ~, C
                        *addr = save[--i];; F: H0 |/ B+ {( Y( B. @( T( Y
                }- ?6 n! s, o6 G+ ]
                return (0);9 J- d  }/ h1 V5 M/ e. G
        }! p. i. o- q& }0 k- \

% M7 |- x" Q% z! ]/ ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 L3 P# d5 T3 @& _0 Q7 m0 G                addr = base + cnt;        /* pointer arith! */- Y3 z0 v7 |* B( a: s- Y
                val = *addr;# g( |- b# `, `2 U  @2 M9 m
                *addr = save[--i];( z- n4 w: Z2 A5 S& a  c( G, j
                if (val != ~cnt) {' Q4 B" d0 h) i/ \: c8 |
                        size = cnt * sizeof (long);
7 t4 O5 w9 a0 c5 t$ }+ a                        /* Restore the original data before leaving the function.5 n, @& ]; a# r3 b* M/ k
                         */; x8 j. n' z" X9 t( h9 ?% ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 D3 t/ v: Y8 T4 T, f2 J% n
                                addr  = base + cnt;
7 u+ I. f$ S( F$ h8 R                                *addr = save[--i];! T& T& I1 X( G! x
                        }
8 n6 ~! w! h( e' J5 @6 |                        return (size);7 k1 q+ l7 ?8 G7 l1 c  ^$ r
                }
; _; w; h9 X6 G& L5 L: v$ d        }
9 {" W& M6 W, g" @! W' j
$ C( a( i0 K, k, R        return (maxsize);3 u" E2 Y- A0 R! ~7 q. [% h& {
}0 r1 ]; W! C5 ^
int dram_init(void)
& `5 Y8 J+ I! z( E# k{
" W+ o! |( ~4 q; X        /* dram_init must store complete ramsize in gd->ram_size */
9 G, H: ]7 n9 f4 {1 p        gd->ram_size = get_ram_size(
! I* {( w$ W! K  w( ~; E                        (void *)CONFIG_SYS_SDRAM_BASE,
" w  Q) E. v: q$ t# n) x                        CONFIG_MAX_RAM_BANK_SIZE);
( J7 l4 X6 k0 G9 F  ]" c        return 0;
/ B, t' `% i' ~: f5 E}1 C" q6 @3 x; N, _' {

; O' ~  _6 u8 _- ^# j
" t1 b8 ]) g/ m; d* N5 L3 F1 f
% i; z1 K1 `6 K2 B
! t( m8 s- G% F3 NFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" {. j- m& A% p; G+ _
& M; g5 h. c, ?" d2 [- c8 _; ?
' b/ U/ ?0 n4 s

, m  V5 u8 D3 @4 m* i




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