嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( t; @/ B& s2 ~) d! A核心板2:DDR2 256M Byte   NAND FLASH 8G bit- x  K8 z& h( m7 r( p3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( J/ q& b/ ?- r# ?* V+ M# o

* z2 g( K8 d) U( }是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' p7 {. U: m5 r; v5 V' ?2 R
+ [% C( o: d2 {- [; o- U, A

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 ~9 e' W2 o6 H% o6 l9 E/ C
/*8 R: X3 H  ~9 @" P
* Check memory range for valid RAM. A simple memory test determines
% z& \! R' @" a" b" ]9 d* the actually available RAM size between addresses `base' and
  j, t, t0 f* q1 m7 c  h6 U1 A* `base + maxsize'.
5 F3 ]" [0 e( ?: }/ l- P2 L( m*/7 }0 d6 Z' a, [" j2 Q
long get_ram_size(long *base, long maxsize)
% `, ^1 k; H8 A1 s# t{* L+ X( J% y( O, I* ^4 S0 g
        volatile long *addr;) d. v* J& `' g' r9 A$ N
        long           save[32];
( b: z0 y  I7 e( K4 L+ D5 I        long           cnt;; j( ]3 u, q  B2 W
        long           val;) c7 }8 X- J: C
        long           size;0 ~% {, e; o' ^! v+ }* R7 N: I
        int            i = 0;
3 D- T+ Z8 S- ^( l! V: _0 I
0 S! e* B# m8 o6 i: o  S  b* o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, \; W; b! w0 e2 l6 R- Q
                addr = base + cnt;        /* pointer arith! */
0 U4 R7 H5 m# d1 [9 ~9 l+ r" F                sync ();
  H& @$ i# u  Y+ |& F8 G                save[i++] = *addr;& W9 b7 U" J! F1 L7 o( _" {' Y
                sync ();( t8 H* _. @! m3 }9 B
                *addr = ~cnt;$ h0 l9 y' Z. m) F
        }* U. }" `, W4 a! d# P( t! S

' G; a) u% r0 V  A" h1 N        addr = base;
1 ?# @2 V, w' z7 l& x        sync ();
" \/ I$ c$ s; z  c! L        save = *addr;
, F* u  T# |! i" \8 M4 u        sync ();: `$ C3 i! J6 A+ }0 \7 a
        *addr = 0;
1 E4 d# _. r) y/ @5 z* p  m1 P" R' N7 Q, Q/ F
        sync ();
2 s7 f4 m* h# G4 U        if ((val = *addr) != 0) {
7 Z# m9 h' A, ~$ p                /* Restore the original data before leaving the function.
2 ]% ?( r# a0 w8 A: o/ {6 U                 *// U9 R3 j# c; x9 p! J- l3 ~
                sync ();8 f' y4 i1 k0 y- Z9 U9 r
                *addr = save;/ L8 ?3 C! ^) H2 y7 S, w$ b
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 j3 |* |# b7 J  \& R. D
                        addr  = base + cnt;% K/ Q. e+ G  i
                        sync ();- ]. b7 a' G1 K" S# ?( p2 a
                        *addr = save[--i];* n/ u$ O, \0 O1 s
                }" g! D9 E' {# \7 ?5 m! C' {: ^) }, P: ?
                return (0);% g7 y) T' ~' |% X
        }
; r! G, ]+ b- r+ d  K; b& r+ x5 b. B; H% Y$ W; v, X( E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  b. t6 r- p# H1 u6 I1 A                addr = base + cnt;        /* pointer arith! */
/ l5 z7 X# J1 c! F                val = *addr;& z$ k/ S6 k, y2 [8 J: {9 g
                *addr = save[--i];. I, x' h  v" {$ J) {) j0 ^
                if (val != ~cnt) {* x- X) j8 b0 x: F+ i; z
                        size = cnt * sizeof (long);( G+ O; J0 e$ ^! I' _
                        /* Restore the original data before leaving the function.
+ z3 ?+ \) v( D# k9 q& ~                         */
$ |% _3 l2 l. g' P2 t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( E4 A* |) E% |- u  v8 V. @
                                addr  = base + cnt;1 `4 ?0 \2 J/ I. X, ^; G  E
                                *addr = save[--i];6 R. U: c! T2 ?" @9 @
                        }- \& R/ H. J/ r9 S5 x$ E
                        return (size);
/ m0 W. @8 u5 E$ P) ]                }$ V$ y9 p0 B; `% d. O
        }
4 Y7 \* K% g- N2 p, J  j2 E( ?; z1 E$ E- \& \* b6 W1 _
        return (maxsize);
0 ~" S8 N: q5 W& p9 e8 b2 ]1 H3 d}& ^; H3 \3 Y/ l# y" K
int dram_init(void)
) T9 \% X9 c! c' Z& [9 V6 g, @{" q  d; v) E5 o
        /* dram_init must store complete ramsize in gd->ram_size */* z* w- k! U" T1 H3 I
        gd->ram_size = get_ram_size(. }9 Z: s* F- B
                        (void *)CONFIG_SYS_SDRAM_BASE,  u' L1 T4 l' `
                        CONFIG_MAX_RAM_BANK_SIZE);
# j2 t. \  N/ H+ {        return 0;) Z  A& Y  [4 }, x) G
}' ?& o' P# m) C- p  [
% s& M  I0 z: d. Y
9 N* V! ^4 f' r/ Z4 M) N  s  T$ ]
" h& u* A5 \0 p( m
* B$ \& S. T- s4 z4 I, Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) _) F, H) Q* a( P0 s

$ }# }& p2 D2 q5 E- f/ c
" n8 J. F5 v) x

  Y/ B; V" N; m1 T




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