嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* K& p7 V+ t/ w+ q核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 X  P/ h) ], E! k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; X7 c9 l+ C6 q- \" d2 m4 Z7 U# y6 v6 g* l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( L+ w( @2 d" g, G4 ^* j) ~
9 F. {5 d% o5 _
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) R) }9 I# b3 O& R7 J/*" I! g' A$ @* Q! ?* w& s
* Check memory range for valid RAM. A simple memory test determines
- m  R( R2 Y* b9 N& w2 ?* the actually available RAM size between addresses `base' and
% G7 M! }) K8 U9 H* `base + maxsize'.
! V) _  Z9 W7 L0 P: T, J*/
: E5 Y. i) l; l6 ?# ~8 _4 ?2 }long get_ram_size(long *base, long maxsize)
% a" O4 G( u% |  k4 B! u{
0 g: M, d3 e6 J8 T7 l0 r        volatile long *addr;
( ~+ b7 F" O9 W! _+ L& r        long           save[32];
0 a2 o% v: |5 P, H        long           cnt;
- N8 K& b: X" H# e. `        long           val;+ d# c/ N. K6 j* A5 f
        long           size;
* D' |! y5 K- a& g6 ~; z: G        int            i = 0;5 q  c3 |) {) |; l) g
* d' N' ?! j# H8 J  O' G- S' _
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& s; s- k0 N  A8 m0 n; O' w4 |                addr = base + cnt;        /* pointer arith! */
/ M  G; P# e6 B0 a* G4 H* |                sync ();
3 H; B, o) I$ ^' k5 G                save[i++] = *addr;! [; a- y8 e7 V2 v. \3 `) I+ E
                sync ();
, a( w2 e" l# b9 j4 ^) n                *addr = ~cnt;+ W8 J/ P8 t6 r/ u; O; {0 U9 i
        }
, l8 Y' \0 j  N( F- f9 q
) t9 u8 b* E- w; |. _- \3 k; }        addr = base;) Y8 Z8 B7 R* Q* }
        sync ();, q3 q" ~. E4 U8 l$ D1 |) z
        save = *addr;, I8 W2 `5 F/ [
        sync ();
5 }" i. }- t, j) p        *addr = 0;
  L1 `( n+ O& N" e: ?6 a
  B: c# [/ Q9 ?        sync ();
. R1 r/ ~  \# L' u. h        if ((val = *addr) != 0) {
1 O. a  L& A  b, s# W                /* Restore the original data before leaving the function.! p3 ]7 [3 ?  k2 j: F
                 */
! l6 Z! \# ]& u/ h, E* }                sync ();
, l  {* K& o! Z2 S& u2 O5 j- p                *addr = save;9 M6 _) E$ ~0 P5 b+ V3 r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% o) O5 ^$ Y, P3 q
                        addr  = base + cnt;
( r/ E; ?8 s; W  q' q2 [                        sync ();9 T0 c4 `5 p: S9 ], s- Y1 a
                        *addr = save[--i];
4 W* v! h" Y% X8 ~& G- g4 X                }  }' v. Y2 k: d3 S3 a
                return (0);% J8 q& H  X7 e
        }
9 @, J' G- E6 N% H( v
4 t% d) m$ P9 ~! E        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" f6 ]5 n& g# u% E8 G3 `& z
                addr = base + cnt;        /* pointer arith! */
. ?0 G, X1 l/ X3 Q                val = *addr;! d' p# y. |7 z* q- N
                *addr = save[--i];
& j4 v* E% U  A* |5 p+ V; k/ ?" }                if (val != ~cnt) {/ a( O1 f  x. P/ @! L1 h2 J! c7 O0 W
                        size = cnt * sizeof (long);/ U, ~2 a* I& w) W9 u2 V1 C, J
                        /* Restore the original data before leaving the function.* N: i$ z% B" j" h( y! Q
                         */
* [1 n( k; e- N/ b* Q( P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 V* c/ V$ |, X% l
                                addr  = base + cnt;, t* a+ I: w( o  U/ B& J+ m
                                *addr = save[--i];
. ~( J2 a2 S, q                        }
! Y; B2 Y5 m* E0 b  K                        return (size);/ z8 Z+ ~( Q2 |( L" {, l4 ]
                }) [6 c; U1 v" Y. ]' C6 L
        }  _/ ]' c, B- ?8 ^5 X6 r. p

0 i6 o/ p; i$ C        return (maxsize);
. L! E  c% s9 [}" J5 w* f! p" r' V1 m  D4 ]. L- B
int dram_init(void)
! ~/ x, s- I' r. Y1 g{
* k. Q# ~) v1 F9 ~* a( \        /* dram_init must store complete ramsize in gd->ram_size */! ^& w4 z  m" T& i9 K* ~
        gd->ram_size = get_ram_size(; \+ f/ [* }1 E* ^5 l9 ?) a
                        (void *)CONFIG_SYS_SDRAM_BASE,# g7 T& }1 S4 m  `
                        CONFIG_MAX_RAM_BANK_SIZE);( {- I& |( w/ g% |$ v1 C
        return 0;( e2 Z( _4 c0 R5 Q( l& A0 j& V- N$ D
}
. C6 b; j* r6 u4 U3 P# O, c5 @5 l! v+ Q: i  d! \

% ]* t) ^6 m& H' v. f
' I$ {" O  n; R3 m' a, }6 [% i" l* h, ?9 s: T) f8 [  S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% \. q) B" V- Q0 g! U1 Q
( }8 d/ M. b! r0 W4 l& {6 v3 }

1 R' u+ _& z! w& ^# w
: B5 U& l4 C0 _. J% m5 [( _/ f





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