嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 F; L4 K+ N$ v1 t
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 @. w3 q5 y. j) ?8 h" X$ [( Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, ?9 j0 v: g- J$ B1 j; {

/ \/ W3 M% l' p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- J* B5 m8 ]/ K  b+ h/ U4 M0 a# k
# N, e( j; }* i+ {& L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: P# t8 X; g( W9 \% @
/*9 w3 g" \# `  ^& B6 P
* Check memory range for valid RAM. A simple memory test determines
7 {4 a3 D  O7 j' I" W( n* the actually available RAM size between addresses `base' and" m1 P8 a/ }6 S6 b
* `base + maxsize'.
: G) t) o' c5 s9 _*/. E' T8 [& p8 E" ?' W
long get_ram_size(long *base, long maxsize)* d  U; @; J1 b0 f) r8 X
{3 z6 J4 |2 Y  _: m+ z9 X4 O
        volatile long *addr;8 v; u/ H7 L& F1 e
        long           save[32];
# d6 l' F( s6 ]4 k* L! k, v: `        long           cnt;
. s6 v; l2 R* ]        long           val;
4 F0 _4 L& X3 ^$ ?: o; m) U        long           size;
' W0 G( I5 B- Y9 g. A( Q  Q0 c        int            i = 0;
8 C1 u0 I" J: ^$ a  Q1 ?0 x  b% ?! F, W- _, \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" m* m; Q; v, f) N/ e( v
                addr = base + cnt;        /* pointer arith! */9 @! C/ t4 d2 e
                sync ();
4 V; q8 }4 g* ~4 {, U. |8 M" g                save[i++] = *addr;$ _; o0 |6 Q  d& g( t" J" q4 ~" l- s
                sync ();/ o$ m5 B) ?& }; S0 _
                *addr = ~cnt;' |& z; S$ Q% D& f& u8 F# @2 N4 ^
        }. X% F: B7 ]2 g- ~; V: d- {7 j
' i; G  r! x5 [3 e. }
        addr = base;; M1 H: |) E" @  |7 G3 v9 _! H
        sync ();
" f6 S  X9 _  O# g9 c        save = *addr;: @9 S: K9 u; _# R. Z4 h( z
        sync ();
+ n( b% H. T7 g6 T        *addr = 0;
" \- |" i! F. i: \; Q/ D# y; O
! l2 b9 s/ a# v) _. U        sync ();
) C4 i& ^$ B# w4 Q        if ((val = *addr) != 0) {
" t  v) W6 b8 F+ n                /* Restore the original data before leaving the function./ i% ]* c8 e$ G5 H2 i
                 */- ]( q2 o: w0 }5 k! Z6 v
                sync ();3 {6 Z0 H& M2 R. E4 }
                *addr = save;% |( C" F% y5 \; I1 h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& m8 [! g7 m. c2 p, ^                        addr  = base + cnt;
0 d! q' V5 c" u/ l, [  n" `                        sync ();
) k, d, h2 J! I" i6 i0 J3 `* C                        *addr = save[--i];
) h3 h0 `  u6 P5 O                }4 |- `+ V+ S  m3 M
                return (0);
0 p1 }- t! ^$ s; {        }1 l. X! j7 H( W  ^: R9 i

) g8 I; @9 \! h' U# a3 M- j/ ?* a        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& ^( _/ {' a2 h/ ^0 F. c                addr = base + cnt;        /* pointer arith! */
6 D) M7 d0 t' k9 Q                val = *addr;: I' L! y7 p9 c+ d$ N. Q
                *addr = save[--i];
6 }' H  D. P% m" U" a6 g7 x1 m+ r3 U                if (val != ~cnt) {6 A: [4 ]' f+ n! y& x8 e
                        size = cnt * sizeof (long);! P8 z) m* S9 u, d% W
                        /* Restore the original data before leaving the function.4 V1 f% @- }' g) K, V! `1 C$ C
                         */
2 K. ^$ _, w2 H                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ [+ C# `! i  h6 M  j
                                addr  = base + cnt;
; z3 P7 y; g2 z: y, q                                *addr = save[--i];
0 j6 W* o- p& D: v                        }' t* Z% o  G3 L) w# m+ {. u) l' m
                        return (size);# y6 x- D2 R  o
                }
" g. ~; Y1 E! D2 F! U: d2 @        }3 n$ z( w" c- S
2 _/ G2 _# y! u9 M
        return (maxsize);. o2 H5 z7 J1 r4 L5 O/ K
}0 C0 ~. J2 F! p; J1 I
int dram_init(void)) j$ h, z7 _) C! {- N& o% i
{
- ^7 F: D0 K5 l2 C! p/ A+ c* O5 M4 l        /* dram_init must store complete ramsize in gd->ram_size */
. I' |% K  v4 o+ R* _! J  Y        gd->ram_size = get_ram_size(
$ Q+ w5 S2 P5 @. p                        (void *)CONFIG_SYS_SDRAM_BASE,& i" b$ B3 ?/ {( B* ~; j8 Q
                        CONFIG_MAX_RAM_BANK_SIZE);/ u" a  y6 v* T3 q8 ]$ ^- q/ Y
        return 0;
) ]3 O* t- X& F5 j: _5 b  v: s& z}
8 ]1 Q  o! i7 Q& a( t2 J
8 D7 {3 J( _( h0 e3 Q; W  L% q, N* S) g; D3 V( I& m( C) k

* T# C, r0 d3 T' G& [( P; z, s$ x0 ]5 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 T# {/ C/ |# W% a, ~% K  w& ~$ E9 W8 z

, ?8 U& t* L3 H/ ?8 O
7 W! {2 S, }, n7 N3 Y6 G' h( _
" P) `6 B- O* E. z8 B/ `: F





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