嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 R2 W& f- K+ A" ~& r" e1 W核心板2:DDR2 256M Byte   NAND FLASH 8G bit# ^+ I- N: n: |+ L' D+ i! B8 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ Z2 [0 z' z% @; G* F& M
6 `- j3 a" T3 Y& L! }是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# C7 A4 c) ?9 {6 b" n) i8 ~9 W" R- T6 d* |2 U, o! @5 O; a

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! O' E( B' y' H
/*" |6 E8 j( F) q, Q) K
* Check memory range for valid RAM. A simple memory test determines
& `; H7 z5 E0 ~5 y/ A* the actually available RAM size between addresses `base' and# e. s4 b7 S8 Q, e8 C6 U0 g6 _: J2 B
* `base + maxsize'.
2 L: S! U2 Z4 }*/0 }# k8 d6 W' m: j6 ]" F2 P: ~" E$ n
long get_ram_size(long *base, long maxsize)0 O  r9 u* c9 Q% l) R0 A9 T8 k
{' v& d8 S$ L+ s) h6 l' {4 }
        volatile long *addr;
0 e: R# O) h0 T7 m; z9 ]        long           save[32];
! s9 {' Y; \7 w8 ~, l        long           cnt;8 }% C/ Z. p# |+ ?% V) o
        long           val;3 p6 R% c4 r) ^9 Q+ _
        long           size;3 X3 [2 o7 h- J' _+ v% v( j) ]
        int            i = 0;
9 c8 @% u4 N& i$ \. A& x
5 w  \" [5 x1 ]& s- n, C1 p( G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ Z" j. F8 s1 Y. u2 G7 E! O
                addr = base + cnt;        /* pointer arith! */
  t/ a7 A+ w+ D0 l- Q                sync ();
9 ^: j7 ?, c3 q8 J: M5 d                save[i++] = *addr;: I; E0 P, T2 a  k0 d
                sync ();0 R) ~. M5 r8 {( A9 f) p
                *addr = ~cnt;
9 Z; }; r4 U  [! L        }
2 w! u5 S; I* {3 v9 {- n
+ Q/ _7 Y& M  k, O7 E% N        addr = base;# o+ f6 P- C" Q2 V- r
        sync ();
  W! n, s- [6 T& t' N: M        save = *addr;
% F" A) F! S, _* V% U! p5 ?% V        sync ();
, K- `2 g8 b5 u* s3 f+ s        *addr = 0;( d$ V, i' G, q3 `) U
4 E( u; O1 b& t; ^7 B
        sync ();
6 w; p$ e* d+ d+ Z# q* k        if ((val = *addr) != 0) {4 Y6 a+ p' W+ F$ o( b
                /* Restore the original data before leaving the function.6 G+ a! u8 |5 U: c- B% W# s
                 */' [; C5 t0 y( \
                sync ();; k7 c2 m( q; T& v2 m! D
                *addr = save;
5 y! T3 ^% c& Z2 r* ]" E. H) C6 v( @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( i; Q6 l. H6 k; h1 j                        addr  = base + cnt;
/ U6 z, y3 X! O; j$ h( R                        sync ();1 s+ l1 ^8 F- ^! s* K5 H( \" P
                        *addr = save[--i];
2 `( o: v7 U& {0 H1 R                }" c  R8 q8 j7 V2 t2 I, S
                return (0);( ]9 |+ a5 _% h* Y3 ?
        }
4 B5 z* v+ y, O! m4 k: z1 I/ j+ H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 o  [2 K8 L5 {) D                addr = base + cnt;        /* pointer arith! */
  B4 b+ r) ^3 U- Z( n0 a  a                val = *addr;  r7 c, y6 M! i! t9 ]* [5 ?1 W; m
                *addr = save[--i];
, N1 i/ M- `9 |; l                if (val != ~cnt) {
3 i# c4 {) C) f7 ~- N, t+ }                        size = cnt * sizeof (long);( [# I3 Y9 p: i# C4 ]
                        /* Restore the original data before leaving the function.& I3 Y2 i" T* \' d" g" Z& v, B
                         */
' \  ?, t; `! w' W+ Z% s, U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% n2 j( d! o, B+ p                                addr  = base + cnt;. p. n6 j* O6 f. J
                                *addr = save[--i];
4 i7 P. X: E  ^! q                        }
/ H9 W3 t$ S; D1 E. u                        return (size);
( D$ h" |; @6 H, m                }3 W( ]! c+ G6 C
        }
" m9 J2 h+ V) v8 Y2 x
2 l' u* r* O& D: G8 Q$ h1 [        return (maxsize);& c4 L2 [7 w+ U( _) |. M+ `; ]
}
! i* B* M7 g; Dint dram_init(void)/ F3 Z5 _  Q9 G! ?
{
4 D* c) O- s. _/ G4 A        /* dram_init must store complete ramsize in gd->ram_size */
+ x# k- g/ x$ N! i2 i        gd->ram_size = get_ram_size(
+ v+ E& _2 F+ H' K                        (void *)CONFIG_SYS_SDRAM_BASE,
+ \6 i- X) c0 w; w3 b                        CONFIG_MAX_RAM_BANK_SIZE);+ ?+ U7 O# @0 Z$ w  _& b) C/ j
        return 0;5 S+ F: M4 i$ r, i( K, I
}
8 J  M) [5 Y4 }. O3 @% }' b9 y1 I* s) T
! f0 i) w% {$ X" [" P, ]4 m

' M/ K: `8 I$ \1 M7 e! R1 V  b! v, K: K- K( s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; c' e8 M% G3 w2 u

4 }5 V; [6 v7 f3 l) [7 |! a
4 m2 m# {, O+ {0 g2 J4 z
1 G2 m4 B& a4 M. A. z# Q! e5 Q





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