嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 H1 ]2 N/ `% I9 Z& ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; ?# Q- h0 |, P2 k- C: c  E7 w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 y; l$ \3 U8 r* l& q  ~1 O
7 `9 |7 u9 o9 V* W5 U9 a4 [& [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 }' O1 X' q: M

% T( k6 d2 V- @1 [: a- K$ V; w
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 g" H0 v7 `# t1 E, m9 T4 X- h/*
* R7 Q0 z" S/ B" @8 M; c* Check memory range for valid RAM. A simple memory test determines
! s6 H# Y, |% u& \8 y( q* the actually available RAM size between addresses `base' and
" v) \9 u" j; [3 T* `base + maxsize'.
. v1 w+ Y. F$ N+ L  Q*/. U! |& {3 k. c4 \2 Q
long get_ram_size(long *base, long maxsize)/ q" h9 l* a( X$ v: l; @1 j
{4 J/ U6 D) ^0 W
        volatile long *addr;5 K. n( }, E: A. |3 q& k( Q
        long           save[32];
( m1 P2 @9 j$ w" a+ F: {2 W2 i        long           cnt;- o8 u) v9 I7 H5 {$ ~' I
        long           val;
1 S: }8 P; \2 |3 `( v* g: Y; G        long           size;
& y4 @2 n2 R& w: l4 T        int            i = 0;
: C5 C! ?0 t& G8 G1 u  N4 ?* A6 ]0 x, S' Y+ B" ^, s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) z! m: G9 ?- H& o
                addr = base + cnt;        /* pointer arith! */0 P# r7 K( ?4 ~* g' T( O4 J; k) Y4 Q3 n
                sync ();* U+ @: r, C5 o' q
                save[i++] = *addr;
( b. q) G! b4 _2 w" `8 S                sync ();
- M: e7 U; M& E+ K. q2 U& b                *addr = ~cnt;
' g3 W3 d+ A$ \' v        }
' p4 M; d' ~* L9 d
( o" u( z+ J, |, q; K& i3 E        addr = base;
0 u! F$ M( v4 O        sync ();
; d9 ~4 M( Z4 C* B; U        save = *addr;0 D4 N! k5 e' e: G
        sync ();( B* A& X. _% T* k/ f
        *addr = 0;
( n! {- J8 P% J0 Y, ^0 W' B5 u9 H( j. p8 T4 b1 w. z* g
        sync ();1 l& E$ z# |9 V% X! r/ X
        if ((val = *addr) != 0) {6 [, i, y; R3 h0 `9 S  ?
                /* Restore the original data before leaving the function.6 w9 t! U% b# Y  l+ Y( W0 `, e
                 */
4 F8 v8 [; H' ]. P# s& k/ r                sync ();" V4 w& ]6 b3 d! K
                *addr = save;
: ^0 O$ A$ `  ?% g5 C. ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: Y( S9 m4 Q1 B& c# ^1 j
                        addr  = base + cnt;; M/ ~6 U. }+ n  m! |; `7 U
                        sync ();7 v* l& Z6 e( m3 _) {/ A& }/ |
                        *addr = save[--i];
' l' ?( Y" c. l7 m5 h                }5 ?( t" @6 s9 c
                return (0);
# n4 F! i4 u# |. m% }7 P        }
0 \; V$ q/ O0 ]3 o% r2 j  \: Z1 e/ l+ C: m. }; {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! s' D- }1 D$ y5 |, F                addr = base + cnt;        /* pointer arith! */3 F8 q/ X, h' ~, l7 C- k
                val = *addr;
0 v, s" \- G( _1 T" ]                *addr = save[--i];
+ L8 Q+ J/ Q' @& p( w" l+ l                if (val != ~cnt) {/ v* Y' h& t3 a; y1 d1 h
                        size = cnt * sizeof (long);% Z# r! F3 f0 M& g8 m
                        /* Restore the original data before leaving the function.0 L! x$ _  H' `: y- L2 n
                         */
* V- Y# q" G; U3 n1 P8 K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) `3 O, @) O( |, O! d9 F                                addr  = base + cnt;
" d! B7 j4 o& r1 x7 N1 j5 u2 F                                *addr = save[--i];
' [; u( ^7 e. l# e! K( w+ ^6 F                        }
, h: c* e8 g' R# ^3 C# {                        return (size);# P) S: f! p* a( o8 g1 }/ B1 b
                }
- z+ }( C9 a- U* F& ~        }
; @& F4 ^7 S6 f( V" U: u- L( q* F1 S1 b* W( X$ d8 }2 u& F
        return (maxsize);/ i+ p7 _8 h) O1 o! p9 {$ f
}
; U! ^  j" \2 a0 `! q5 v1 G% v3 Sint dram_init(void)
: s! R: m9 U% B3 V4 W) q{
' X6 m9 n. D& h5 F) r8 z        /* dram_init must store complete ramsize in gd->ram_size */! P! v/ }* X$ b; s# k$ _
        gd->ram_size = get_ram_size(
9 W7 r6 |$ }! p8 ~3 i                        (void *)CONFIG_SYS_SDRAM_BASE,
( Q( C+ @( K7 p. `% T4 r+ E+ A8 ^                        CONFIG_MAX_RAM_BANK_SIZE);" ]& a# n) D6 s' [, D& P
        return 0;0 L& G4 P2 \" g1 I/ w8 N! I
}% u7 g4 c* m) w

( c# `' f! s+ R  b, ?- _
9 y0 \1 @5 u6 c+ J  C
+ ?) a" ^2 j5 u' K9 e% C1 ^' [2 Z' z6 o* m# ^% D& }: ?7 n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 M# P( e; p! `4 x0 g  \" c
4 Y+ U! M+ e/ n. ~/ t- b3 G/ ]/ L

" h4 U4 K& S8 f" P. e) C




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