嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) H1 y# }+ [/ B! g9 P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 h( K* w1 O3 m3 g; o" H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ d( I0 M  p4 g9 Q7 g2 i" ^2 k* k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& \1 l3 P1 {& |  ~$ \

% y' C! D3 q- d0 k; K8 X
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 q2 p  @0 @5 L2 e" a( q/*4 @3 p" D* V6 _4 f
* Check memory range for valid RAM. A simple memory test determines
6 T0 j1 l1 w1 f( l3 d" O  ]* the actually available RAM size between addresses `base' and
# H- b3 K7 r  h1 q: v* `base + maxsize'.
$ s( H# b" j/ G" m( ]- ?# \  v*/. L0 U7 r" j+ d
long get_ram_size(long *base, long maxsize). Y" g7 O$ u* a% M- n1 Z/ x
{+ z$ r! v" P; O3 s3 W0 O& \
        volatile long *addr;1 A) o4 |* B7 z! N! Q) m
        long           save[32];$ r5 h/ N, B0 Y; b7 B
        long           cnt;8 B( {$ _# i9 l
        long           val;
/ Z, U: W0 p+ K        long           size;
7 J0 s' q. |8 @% C2 h        int            i = 0;
9 Q: W5 t% k: a  k$ Y/ m1 t6 m2 `) d
' H! V1 e1 i  v8 g9 G( z3 s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 G7 M5 k! T5 D& _2 v* }                addr = base + cnt;        /* pointer arith! */% u" f. E2 N+ Y
                sync ();8 e! m  i" r7 |+ H
                save[i++] = *addr;  Z1 l4 e2 U4 ^3 |
                sync ();
- ?: |# S8 A7 t5 R                *addr = ~cnt;
5 o$ j  C+ y1 Z' F6 b( U& f1 c/ Q        }
* a4 ~& _. ?5 a4 X2 g/ ?9 ]- k! j0 P+ ^7 ^8 J7 o" F. K2 ~' M
        addr = base;% F5 s( F% d7 n8 j
        sync ();9 H2 U, e: ~( z
        save = *addr;- X% o% _1 @$ n# n& }& t
        sync ();
9 }4 s, Y6 ?7 f: g. l! Q" j' M2 C        *addr = 0;
! c1 C0 X- M$ M, q
4 M3 [+ V( l1 ?7 o        sync ();7 U/ Z8 s2 ]5 f6 l% Q2 x
        if ((val = *addr) != 0) {- ~' {* T$ ~/ L( Y
                /* Restore the original data before leaving the function.- |& ?% w6 Z: S* {3 G( `+ I( W9 F
                 */
* J; r& M3 i& i* F                sync ();% t" x* C& \! ^; q* U
                *addr = save;0 X# g5 o2 Y( T" x6 \( {( ?
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  Y! [5 I2 |: {3 ~1 J6 e                        addr  = base + cnt;
7 r' l" w$ h8 d& ^/ t4 _8 f/ k                        sync ();& ?0 M0 I: z% Y) \/ m" h3 j
                        *addr = save[--i];2 l) h3 w& c6 p8 `2 m( s
                }
! z* s) r% n9 q, T- o8 r                return (0);/ f) t& B: }0 C
        }; l% G5 q6 l1 J6 e: k
" H, G7 }9 A+ s% q. k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* S1 B$ K8 S  u6 R
                addr = base + cnt;        /* pointer arith! */+ N# i* @6 ?8 s2 [( J
                val = *addr;
: k, D$ M9 x6 K- D0 ?8 O& g                *addr = save[--i];
6 Z; K2 h; H/ \* D* t* d) x2 _, u                if (val != ~cnt) {. K+ }. f  j  ?
                        size = cnt * sizeof (long);
, n/ M$ i5 ?8 Q% J2 k9 u! t; G                        /* Restore the original data before leaving the function.3 `, \+ R1 [1 C& v% `
                         */
& D7 F% i6 {0 U  j3 {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# s! m( D& R- J/ c" Y0 i4 t# s                                addr  = base + cnt;
' [* {# l" {6 `' n. u6 ?) ?                                *addr = save[--i];
( A3 ]3 B/ m7 N3 G' B) S) q6 d                        }
1 T9 W& S% f3 D8 ?8 A5 H' [0 F/ _                        return (size);0 c* K/ y% g. u. W; e* t
                }) ~, d# {1 M+ q" f! u6 q
        }8 F3 D8 j3 ~# N
+ F7 U& Y. x2 ?) w7 d- e
        return (maxsize);  [6 `$ i9 e. B2 v: i/ D% ~
}
4 E6 z, U( d. y) Bint dram_init(void)
! z: X$ k! J; S! ?: ]" O1 W% u{# e* K" Q5 w" ]5 D
        /* dram_init must store complete ramsize in gd->ram_size */; ^6 w/ Z5 L' g) ^7 ^  n- |
        gd->ram_size = get_ram_size(; l4 \) u! J& v4 Z' K) D
                        (void *)CONFIG_SYS_SDRAM_BASE," }; S/ \: A5 T  d$ S& n
                        CONFIG_MAX_RAM_BANK_SIZE);2 e  e" z, o8 J4 @
        return 0;- w8 [' D) i1 z5 L8 p& i/ v- R
}6 ?/ i0 H# s4 t
6 W- ]+ ^- V& Y/ v$ M. L

" Q3 e; z- s3 b6 c* L2 v& ?/ T7 |9 S2 m3 e* p! T+ A( W$ M/ l

: o4 B9 g5 t' `" [$ xFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 x/ l; ]  P6 [' q

# J7 S" w! L" ~: e
( d! U& _; l! _7 T2 N3 W, W
2 t0 R) j% s3 U$ i* c  V4 @6 x





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