嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( E0 u# c3 @/ H' C) _4 S# v
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: ~* n7 d8 y' \8 Q. \7 f7 C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# O" Z& W. ]" R! [1 r- @2 d2 b
) E) B0 c3 E4 k3 K% z; [: Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 P1 k2 I. O- y8 k9 s

% ?% K- B' v1 I6 D- |* y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 Y. c9 |* x  q' T  }- P) @' u/*; a$ ^8 f/ ~+ k& c
* Check memory range for valid RAM. A simple memory test determines
7 \: {. m" }; h* the actually available RAM size between addresses `base' and) h. A! ]& k2 p
* `base + maxsize'.* H5 r  J) W9 T% A) t3 |
*/
% u1 u" k6 O. q: xlong get_ram_size(long *base, long maxsize)( S9 b/ T$ T1 O/ ~- j: K
{
) @8 J. h. s1 c+ Z+ o        volatile long *addr;; X' [# }, Y& ~  u7 K$ |' w0 N
        long           save[32];
. R- o8 p% F8 s        long           cnt;
0 G6 \  \" i$ o" m* b        long           val;- d" c- |$ o1 M2 T
        long           size;# R/ R+ C/ b$ Z# F9 e; C, R6 [
        int            i = 0;
5 Z2 ^1 |) ?* v# a. }
* O2 [2 S$ R+ @" s0 A        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% ^+ a8 N2 _; ~- z0 x: y9 y
                addr = base + cnt;        /* pointer arith! */  E$ z; O; t/ g
                sync ();( E" ], e, w$ G: e6 m+ [
                save[i++] = *addr;- j$ r$ V. M) w# r1 t* j+ o
                sync ();
! ]- S  V5 ?5 }                *addr = ~cnt;* {$ b3 ~' p* Y2 m- T# u
        }* @% H/ |! ?8 V9 {! @

1 p. x: N: k, _7 p        addr = base;- D2 {! H* I4 n* ~7 P$ d) L' m; b
        sync ();
4 I2 Y9 P( g- n0 a$ E, s& S        save = *addr;
5 A5 @: u6 D- N8 @( o+ Y        sync ();" @' h6 P. k% E; k* N2 A3 O
        *addr = 0;9 [& t5 f$ @& Z# y" T6 a" S- H9 b

- N8 l7 h9 j! P- g. {        sync ();3 o/ y* k0 h3 O  i6 @! ]; H# C% ^
        if ((val = *addr) != 0) {
3 O( t, ]0 M; R* y9 g                /* Restore the original data before leaving the function.
0 h9 S4 [0 e0 k2 }                 */+ P* P4 {: G+ S! B
                sync ();
1 R, [% {. J9 ^( [5 u2 g                *addr = save;, L% {$ z, C" r& O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: y9 ^  m# A9 u- w$ J1 ?! q                        addr  = base + cnt;/ u9 o. }+ R: u+ C
                        sync ();
3 Y( l: d) {. S* D' N" f                        *addr = save[--i];4 q# v2 Q- M, [" v) R7 x8 K
                }# [' I4 R& w. l
                return (0);
/ r) G2 X3 W$ v) F9 ]* F- W        }
' E; t; B) _8 @3 C# |/ y. [
) E$ X6 ?0 q9 Q( b        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 [* p3 [5 g4 T# Z- t2 W                addr = base + cnt;        /* pointer arith! */
. s& l7 _, h" K0 e7 [                val = *addr;+ \3 [9 h( V6 W( K& W$ H8 B
                *addr = save[--i];- ^- z0 _2 q! u2 s* P# J
                if (val != ~cnt) {6 F; P8 Z0 s7 S1 M. e. B, S8 c
                        size = cnt * sizeof (long);( @6 y" n  V+ y% |
                        /* Restore the original data before leaving the function.
0 @3 @" \! i+ W$ n1 f, R6 k( d                         */1 ]8 G5 y( v$ Y0 X2 O) S+ |% V& v' X
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  }' u7 {  t" _* ~+ |
                                addr  = base + cnt;" I0 O. N4 H7 [5 T6 N2 z- A
                                *addr = save[--i];' m3 @0 ~2 h0 a0 \
                        }
5 m; A2 R3 S! v0 ~$ T* X4 K' {                        return (size);
, z5 O# G$ F# F* d) E9 v! G' v0 P5 T                }
4 c9 q0 n3 ?: j% e6 ]! ~  t8 I        }
6 G& G& {# Z: O. J# ~8 ]
2 Z% C# j$ D" d: U7 W        return (maxsize);
. f4 V- f8 w% c9 C. y}
$ g) k  N1 k1 q- q; L) k- z4 p( Tint dram_init(void)% y7 N1 o/ X% E3 g- W
{3 F8 B1 b7 y+ U& L% h
        /* dram_init must store complete ramsize in gd->ram_size */+ b. j* S' x" K
        gd->ram_size = get_ram_size(
' }5 d  z% b$ X0 }( [, g9 U                        (void *)CONFIG_SYS_SDRAM_BASE,7 N1 D# T, t0 ~1 B$ D# \) }/ i9 k; ^' G
                        CONFIG_MAX_RAM_BANK_SIZE);2 ?: e& u) z; ]8 h" F+ j8 L% {6 h+ N
        return 0;
6 R+ l5 F$ K1 w5 d( Y3 H% ]! _$ o}8 c" s: z: N, j9 u* D
  {* M. ~9 O# i9 |- h

& B9 B' k$ I* [  P3 M* B8 d
& W8 e/ g& }" N- l
& a4 E8 v  {4 wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ j, [8 T8 {+ V" {5 L

6 G0 {# D  C# M2 D5 Z: a* v* _0 q; w% ]6 ^; O

7 R2 D7 y( Z! [0 ^9 f& G1 q7 C$ d




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