嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 Y/ I( r& O4 m) |( e& m# {核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 B! o3 L: g" G0 v这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ w4 J4 w1 w/ ]* ]
7 V2 Q# ?) @( e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 o% c  p; j( u; _; x
# \8 x2 u+ {/ i: V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( A/ h+ r+ q% S  c& ~/*+ r4 D" k; L, ?1 ?! G
* Check memory range for valid RAM. A simple memory test determines
3 S4 t2 \9 G1 N+ p% m+ ]* the actually available RAM size between addresses `base' and& w. U+ p. ~* o& L6 s
* `base + maxsize'.
: N( x$ t  t' v& e' s6 @*/) d0 H2 V) N5 t, o: _5 Y
long get_ram_size(long *base, long maxsize)
/ v: a* _7 r# j& j0 Y' |0 P) C{
; @2 C' d* k- k4 j0 l        volatile long *addr;3 M5 P$ Y  s4 s# H0 x
        long           save[32];( C0 s1 O+ G5 n# ~% L. U$ ]' I, \4 x
        long           cnt;  ~7 K7 Y* U# R0 c
        long           val;
2 F8 j" G: O7 J7 j        long           size;
  V9 ^' G  O: n! E/ r- |1 ^        int            i = 0;
5 _3 e0 k" U: o  d3 Q' P) B
: C% `% A" y6 g4 ?0 @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ p) I9 V; x2 J% L
                addr = base + cnt;        /* pointer arith! */
/ [- A1 [1 ^4 o" u+ W* D                sync ();
9 Z4 Q4 J' n8 z                save[i++] = *addr;
$ @# D; I4 }! [# B' I0 n: @                sync ();9 a4 i! h9 N. n0 K  E
                *addr = ~cnt;
3 P2 ?+ o; i% h: K        }
  E4 T  D, q5 e! n
" ?% V, e. _3 e$ |1 `6 r0 z        addr = base;1 t. s$ a. ^  _7 ~/ G: s. h7 s
        sync ();4 g8 X; k; H9 I3 [9 i. ]
        save = *addr;% Z' ]* x# I- G9 o1 t" B
        sync ();1 {3 i0 L: B9 w& @' _
        *addr = 0;
) k) X! f4 g, L! i7 N. M) F
# d( y) u" r9 S        sync ();
. T5 ?: W' o% z0 U        if ((val = *addr) != 0) {
4 m; `* G: X0 D/ q& h! U8 l) u  M- X                /* Restore the original data before leaving the function.5 r- U* Y4 \4 {( \# d
                 */
7 v: i. l' Y6 U! `                sync ();
, V6 g  M  j; X! ^                *addr = save;
) x! y9 F; G$ E& K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) y% ]  r/ k7 P, L
                        addr  = base + cnt;
# n8 |. m* v6 g% \9 V0 n                        sync ();
4 ~. B5 w$ P$ v* Q8 W) P' O                        *addr = save[--i];, H7 p  E! T* {) g) f% R
                }- S6 {* R3 @7 w! G) \+ A$ R8 g
                return (0);
( T. y( ]. r9 P7 v  Q  v        }
' @! [" @( E) u; n  H5 q3 s
  T2 s" a- A3 X- a# ?+ \+ a' z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" e! X5 \, y" A9 \* _: x7 l
                addr = base + cnt;        /* pointer arith! */# j& S. p+ e* }, x  c/ M
                val = *addr;
9 ~" _! H8 i1 A                *addr = save[--i];
) l* U4 j) W. j  o3 O, K7 j                if (val != ~cnt) {+ [+ Y2 M) l* G$ z
                        size = cnt * sizeof (long);" {  A" b3 Y" b" S
                        /* Restore the original data before leaving the function.
9 c; M2 j" }  r* [0 n3 o1 E                         */; H: \4 g( I6 `. p
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 f' u( c% G3 o. g5 V+ ^- `
                                addr  = base + cnt;$ B& s0 f* R0 C7 R: G
                                *addr = save[--i];7 l- M$ D2 ]- c$ I
                        }
/ r- a3 {8 w" {- J. A0 r                        return (size);
0 T# ?! U9 y8 Y  b( s" d8 O/ n4 s! Q                }
( X/ Z/ z1 a% _; n2 ^        }
- V' A: F7 y  D! K% r2 T/ O$ w' F3 l: O" M5 I9 Y5 w
        return (maxsize);( L$ H0 P# `- Y2 _( ?) T
}! J2 H$ i1 N  |6 M5 w, O7 |  ?
int dram_init(void)
; Q7 u1 r* C. n0 `3 O- y{& d/ I' }2 `: |- h2 B* L1 x9 ?: ~6 w
        /* dram_init must store complete ramsize in gd->ram_size */- E- r: W% D/ L
        gd->ram_size = get_ram_size(- K9 e& ]6 T9 O( `  V: G7 T
                        (void *)CONFIG_SYS_SDRAM_BASE,' M: a/ O' G1 K/ n. f- N
                        CONFIG_MAX_RAM_BANK_SIZE);8 @. \1 R1 q7 A6 N
        return 0;
. a! O5 A6 x7 M9 [}) C' T: r- S9 [- w/ l' d8 d
; [6 D+ b4 g3 h& ]8 V) Q; t1 d6 ]

4 i1 Z' b! V9 ]5 Z/ l0 P
/ {  }" u. u$ o
0 O4 V' P, |3 e+ U3 Q; sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; X* i+ J9 ?: h: P" |: P' N7 D

" q; t/ F1 @. r7 x' `
6 S/ \' f" r; S5 O- U
  b# Y8 C0 V% |( G' {( ]2 q





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