嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 Y4 {# v; I6 M& u+ l! g1 p核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 U/ K2 W: T. E3 w# m
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 i5 W" V/ i5 y. T6 x# y+ K) ]
) v, U- v2 R4 U( j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 m+ V- o) n1 ]8 i- |

7 t% [) C5 i" r9 W) C$ P/ s
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- }2 A( L' u( k9 i" T. j% c, e
/*
$ g: c$ I  @) [9 `2 R& X* n* Check memory range for valid RAM. A simple memory test determines
2 q& F: ~; I1 \' \5 H- R! V* the actually available RAM size between addresses `base' and
; d0 }+ ^6 \$ T9 Q2 r# l" b4 H* `base + maxsize'.
. {1 b2 a6 d1 E% a. ]*/
$ U2 ]5 N" [5 l8 b0 R( {/ Q- Zlong get_ram_size(long *base, long maxsize)  s* Y- Y2 c: J4 E6 Q0 [' z! g
{
6 N" L) W# i8 j# U" h; j8 `        volatile long *addr;% M8 E, ?! a; l9 j6 j* G, V
        long           save[32];& _% }+ Q# M2 z. p6 i& l( M4 n- T
        long           cnt;* ^' T( ~; _1 I1 v: {0 j
        long           val;0 d% L5 j( B) P# u2 B- D( @
        long           size;
! [, Q* l; P- s" D* o        int            i = 0;) k6 o9 ~* Y4 c( C/ G0 L

6 ^7 Q5 z0 g6 V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( ?& d4 ~: C3 A3 Z3 U5 s4 j                addr = base + cnt;        /* pointer arith! */
" T  g' x8 v2 @: Q! z# ~6 H8 j                sync ();
9 E% D+ e& @+ [; p6 ~; ?0 n- ~                save[i++] = *addr;* T0 q. i8 g- |  M1 J: ~6 K
                sync ();5 ]1 I3 p/ ]; c3 [
                *addr = ~cnt;' ^. p- T, |7 t, U. v8 k, q. N
        }% U. n/ J6 v" c0 m
6 k$ u5 e1 @: [8 a2 p' ~7 |
        addr = base;
1 j' p8 i* C- `! p5 `4 q        sync ();5 a0 _* U( L( d5 A9 T' L/ ]/ s
        save = *addr;
, d' ~8 q2 K. c- @, S: _) N/ l! I        sync ();
  i4 T2 t) R# `# ?        *addr = 0;
0 Z- b: a( G+ e- {% {( Y4 ^, {$ z" q
        sync ();4 x/ X& b2 J* O
        if ((val = *addr) != 0) {- Y! h) x' i- Y, N7 Y1 u7 F
                /* Restore the original data before leaving the function.
2 L+ t2 Z/ h2 b  A0 p                 */! R5 j* }, y! ?; z$ X- b, _  o9 B
                sync ();: i- p8 K  Z1 v: O) f) c
                *addr = save;
5 K/ E* v! ~" R8 ^/ X; u                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# B) G) z1 w: W! R3 Y                        addr  = base + cnt;
9 K7 @# K$ Z7 L3 F                        sync ();
1 h% x! R% d9 W+ s                        *addr = save[--i];
2 g- F/ h% z- u5 y! }                }1 l6 _% a- T: X' t3 J+ d+ Y
                return (0);% E% q2 a2 Z0 n/ ~* E  L8 t
        }
- B& {, @- [) e7 r  {
/ r; w5 t, X1 `- E6 o6 r" U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 s( T& V) t3 R% R7 d1 {                addr = base + cnt;        /* pointer arith! *// w' e1 K& n: {7 Z6 t1 t
                val = *addr;
% F- H3 T% j1 ~                *addr = save[--i];
! J* v. I2 s& H3 w                if (val != ~cnt) {  k$ w, r4 w  m8 T% \
                        size = cnt * sizeof (long);0 ?  t% v! O4 ?- l. x
                        /* Restore the original data before leaving the function.
1 ^* u4 I+ o6 p* o4 `0 a; W                         */
" K7 a: [7 q4 G) m! E7 `7 r+ m                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 Q' w- X( w0 Z* r( f. L" C+ A                                addr  = base + cnt;! D. G( K  [$ r9 y" ]
                                *addr = save[--i];
2 m% o4 d& t6 g8 `  S  V( N- r                        }
* T) C& s' T6 F" V4 `' Y" G                        return (size);
6 j* d( x' c& T# j( k, _" ^                }
* h; X! s7 @9 i2 f9 K        }" [  G. s) A6 Y2 o

% M) H5 T5 @( Y        return (maxsize);3 M, b) i) x7 m+ T0 y( Q. h/ E7 n
}
$ V, g( _. C2 f' x4 pint dram_init(void)3 L( u1 `/ @5 b1 S$ x
{
  p, m- P+ L/ S& u( r* o/ |        /* dram_init must store complete ramsize in gd->ram_size */' D+ D) ]! W6 @4 X1 y) j/ t
        gd->ram_size = get_ram_size(; P0 G7 O2 {5 m7 }8 K' g& n
                        (void *)CONFIG_SYS_SDRAM_BASE,
! R/ t; z2 M: X& a3 @7 j                        CONFIG_MAX_RAM_BANK_SIZE);
# m; L/ G# ]8 @- J+ u7 F& t+ X% b- |        return 0;
5 x$ l. Q8 \& Y, H}
3 e, Y( N9 I, D2 X) {" p  F/ T. T' Y' e- j3 {# `; ]1 M) e
( P  E+ Z+ T5 I! ?" C. ^, m& F
4 [* h, R; `& Z4 O8 ]

* w* w' U3 E9 O# z1 ^: o* LFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# j/ ^$ J8 G1 s6 E9 x& e- r' V; Y
1 R# V0 D2 ]# `* j6 k9 l8 |# c5 }! l

7 a# X# \" p7 o( I, G. D- l" \




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