嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  a9 ^$ Y; H2 G" M, i
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* e  X; b7 H8 _+ X% P+ \1 H' o1 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) v0 D. H; f2 R! l- S1 Y! L
( e$ I& f, _6 n2 r  E; r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 z1 P  k+ w  m

1 F" n1 J: f" @/ P4 R- `
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. D# r3 B0 u0 U
/*
" L) D3 a, f& w8 |. t* Check memory range for valid RAM. A simple memory test determines
4 J% L- ]1 e- {" ~! ]* the actually available RAM size between addresses `base' and
; r5 w& _" l) a9 v! ]+ s- U* `base + maxsize'.
8 q* z; Q8 n$ p*/' _" Z7 d& Q! t1 d
long get_ram_size(long *base, long maxsize)8 }$ J" `) A. z. [: d, b
{
* H. k8 z7 V; z$ v5 {4 Z( l        volatile long *addr;
  \# f% Q# @, h+ {        long           save[32];' W( v+ D1 u* ?  d$ A" j- U
        long           cnt;) @$ r% O7 N9 [: }! ~; F' t0 g
        long           val;7 L5 |" O) |1 @# r: }& F
        long           size;
( I, A8 V/ u9 l0 w- k$ u* v$ x        int            i = 0;; N/ Y2 A- l- u9 |

) t  [" ?& T3 Q) I4 o* ?9 [( o' T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. X) P+ l( J) |" M3 T) ?
                addr = base + cnt;        /* pointer arith! */! ^$ B4 ]. `9 v; ~3 i' v
                sync ();
  N; Q5 ~1 _7 S% z9 [) Z* w1 E                save[i++] = *addr;
- @/ Q, p+ Y1 ]* V; r                sync ();
& k; _& o; ?  Z; ?1 _                *addr = ~cnt;
$ D+ J. b- M& t# w! a# `# ~        }
1 M# r2 C; ~# ]) b8 ~
: N7 y3 F8 E; p# e4 q* i        addr = base;: W) V, x) m# X
        sync ();' {  G5 p& d3 l' }% B
        save = *addr;
- k& t6 a/ b2 q6 o        sync ();
8 I+ [9 B2 h0 u1 D' z, K        *addr = 0;
0 u" d7 a7 I, T! u0 k9 X0 E. @, w6 h
        sync ();
. h  D* @& |3 A  e        if ((val = *addr) != 0) {
. p! P6 d. c# G! H                /* Restore the original data before leaving the function.) B8 D. t. ^/ g1 U6 S
                 */
  L* K2 W& g6 Y6 E- K                sync ();
( p, `+ _# K- U+ W7 r+ q) K                *addr = save;* ~; h' G( p0 ]; s3 n7 g
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 ?% z+ n; Q) @5 L4 y# \7 M* k
                        addr  = base + cnt;" H* x% M! H( @/ _' S
                        sync ();
! M" _3 G3 @! K                        *addr = save[--i];
4 H6 q" g/ {' v; `  A  U7 v                }
; ~' n8 \: u. p) R3 C* ]% P( V                return (0);
5 M6 _5 H4 w" E$ d) d+ M" h        }
$ c! X" B& [" ?; h
& x6 y9 q# L* B$ E, H( `% A        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 m) `3 \! I; J. |' w) \
                addr = base + cnt;        /* pointer arith! */0 {- i4 g* i7 S9 R
                val = *addr;
# J. _3 M) g% l. G# h                *addr = save[--i];/ U5 Q$ C# B8 F+ M1 s
                if (val != ~cnt) {
1 ~; S2 V1 o: K1 P  s8 `) S                        size = cnt * sizeof (long);( _+ D! I( b$ w; @0 N1 m: T! y) V
                        /* Restore the original data before leaving the function.; u; M. \* B& G6 h
                         */
& s3 `: O. t8 a- o6 g& h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ l* d; N2 D5 k( N: x# e, n2 r+ a                                addr  = base + cnt;
3 X# R1 o5 S7 h: f% _& X' M, q                                *addr = save[--i];
& L$ q" z9 d% ]8 z, b1 ^2 _( ]                        }+ g; a- ?/ v6 S* F* x8 `+ Z
                        return (size);$ F5 _2 I2 U  x
                }+ e1 |( U* U  R" g+ U9 t( _
        }# \/ d$ W" }8 L; N& l
, X3 ?9 ^8 G0 v: [1 m+ Z4 \
        return (maxsize);+ U2 O3 Y4 R' p5 v9 q
}. l/ J. O+ O* p
int dram_init(void)5 `# h1 x6 D7 Z' u1 c
{; e! p2 L# W, t1 l. F/ `' j3 J9 K
        /* dram_init must store complete ramsize in gd->ram_size */
# ]3 P' W* ]2 P9 @- d0 U, A        gd->ram_size = get_ram_size(# k$ W) L# ~- W- ~8 `. u
                        (void *)CONFIG_SYS_SDRAM_BASE,
# G9 B# r8 v# b9 f# J* @" i                        CONFIG_MAX_RAM_BANK_SIZE);) K0 y: q4 q) q* ]/ l( l
        return 0;
; {  X& v  w6 y) T+ A" P3 }}/ m0 C/ c& b1 a% L6 B5 p

) z5 O+ a  s4 K) ^
- b! C% E+ U3 s3 P5 h
* I$ e+ e) F' Y9 I1 T  {& k# E2 W! l3 |
* I) c" j( W4 q- a3 nFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 Z1 l/ e6 u) f/ h4 r1 B

! ~9 E. z/ H8 j/ v2 t8 h/ ]1 G2 C, p* x& B! g$ K2 Y$ c

: d+ _- ~# W, T! C0 h




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