嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  l& h+ s; e" u8 a1 W核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- w4 x- D% t7 u# C这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: [  B1 R5 |! j1 o
  v0 C! v' j  t+ A& }0 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* q$ A1 P, O( @. P
$ I. K8 N, L$ o5 {  k& _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 A3 K: l$ [: N3 ]" }/*
5 M" g9 [, T6 q5 ^3 E+ R$ t/ t* Check memory range for valid RAM. A simple memory test determines! s+ B, n! [5 d
* the actually available RAM size between addresses `base' and
- M) d" m1 d& W$ E* `base + maxsize'.
" w4 Q* ]4 {4 S; i  R*/
. b7 D" F! G6 `. Z, b% Along get_ram_size(long *base, long maxsize)7 B( R7 P' l. J* M
{6 h/ y( e( L5 a- X+ x
        volatile long *addr;
* ]0 B3 y- b; S1 e+ ]. N        long           save[32];  X( N* W% g) Q. L, ]
        long           cnt;
3 _3 B$ J; k0 j  A" j# _        long           val;
; Z4 E; |) s* v        long           size;
( w) d& }# J/ l6 m4 i8 m6 V" ~        int            i = 0;' S, D7 C" t) [9 ^- F

2 }0 M8 l! J- e# d# `  s" ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% [( \: b5 L. V( f4 J; v# e3 C0 g# O$ n
                addr = base + cnt;        /* pointer arith! */
8 i  y  a4 A' X7 j                sync ();
- S1 r7 n% D, L6 W7 _                save[i++] = *addr;
: z4 }5 }' N$ y0 \- u5 m+ Z/ D                sync ();
0 S+ t( }; r1 J) J                *addr = ~cnt;
. g5 [4 \- A: _" w4 X# d        }
) l, v  H2 l) h% M4 T( x' h% C
5 k, [  \2 m' }+ N% P6 P1 a        addr = base;
# g8 P6 T. h9 K& C1 i        sync ();, m; T$ M$ w1 s) p+ H$ k6 o
        save = *addr;! L2 G* @3 }$ d4 S# o0 R$ T
        sync ();1 ?4 ]2 j, b4 a/ g) ~
        *addr = 0;
0 t- h7 R' j- u7 g
/ O! x( l* v& i! t" e# o        sync ();! {1 r3 ]: ~7 E  e5 }
        if ((val = *addr) != 0) {
5 l6 r7 [/ C5 V) T2 I# ^" F                /* Restore the original data before leaving the function.7 W) C2 f# _! `
                 */
. [3 N' G! u/ R% J                sync ();$ E" w: w  N. X! @$ C( Q4 g
                *addr = save;5 F# u5 ]( u7 I( j2 r" D9 |+ P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 c) W7 F+ s" F6 S6 j" |                        addr  = base + cnt;3 z8 g! D- R$ [7 i
                        sync ();
: B& Q( V2 ]+ \* f2 }) R: B  u                        *addr = save[--i];  }; X% P$ v! _0 N% l( n  t, Y
                }' @& Q; `  D2 k3 \
                return (0);
/ O2 N' c$ c$ H        }: I  T6 r6 P! a: _" E( [

; u/ n- O' ^5 _6 z+ B        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( g3 z4 ]; w8 Y+ M2 z* {0 F, X
                addr = base + cnt;        /* pointer arith! */' C: C# K7 f2 c- v% G
                val = *addr;* u6 c5 c( D0 b$ `1 _
                *addr = save[--i];5 {  F1 f: B' M* ~) Y3 V0 m
                if (val != ~cnt) {7 K+ l2 `: q! \* \4 T/ z% @. `
                        size = cnt * sizeof (long);
- P/ W: W5 I; k4 F                        /* Restore the original data before leaving the function.
7 l  n) e% s) ?" N5 W5 A                         */* V2 S+ c! C0 G: L  U! ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 {7 e4 H* X" D; R& D
                                addr  = base + cnt;7 a5 Y9 B- |9 o" s3 N( U+ s
                                *addr = save[--i];0 I) a. J4 P! [' K* z( d
                        }
* M4 E' {- W' o8 O$ s$ Q2 }8 r                        return (size);
4 d. S* L8 t+ W5 v' w6 X" O3 A1 x                }
$ O7 P4 t( ]1 O, I5 F2 R        }! `4 m% f( ?% [. k0 {  \  |5 h

6 U( s' T3 c8 H; h' N5 q        return (maxsize);
4 ]% j0 @4 E: U5 k) {5 m6 x}
9 L) k. f, S& `! Jint dram_init(void)
( c! U8 I3 v1 I# \& [+ v1 w- I{
1 y# y) h- ~( {+ f$ n, S) c        /* dram_init must store complete ramsize in gd->ram_size */4 ^) q$ _& u. U( c' F" z) e
        gd->ram_size = get_ram_size(( R3 T: K9 D( f
                        (void *)CONFIG_SYS_SDRAM_BASE,! x0 \* u& X+ }0 r: B
                        CONFIG_MAX_RAM_BANK_SIZE);( L1 W; ?% B) C
        return 0;
0 W+ p8 O0 t% o- D& G}
2 J! J+ D4 v0 u4 h8 k: t3 @1 L
  h. ~0 ^% J! A. ]& e& ?  ?2 j& Q! b- @7 U" f

) R" K! J% w' O6 c2 Y* `! g( x3 Y0 z# @, y  a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" a+ I0 b% W( k& q- `7 Z

6 C. W" p& P$ l. X7 `7 H
* l/ U0 D! R& |& ~4 f, u4 a2 \
( X5 e( ~! w' x* ?





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