嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 O* u  L: S: i8 [+ x5 e2 p核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 {# G. g5 C! y' s这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: s9 D1 u. J, T8 V/ M
) K' J- K( m/ U5 {4 _
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 q6 N; ]' i/ A% r- {& Y

8 K5 \( ?+ L' e2 M* i7 r0 ?* U9 ~
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 I- e; R: a) t6 q$ A! T: K/ [
/*3 ~( E2 _* r2 D$ u$ P6 T5 }
* Check memory range for valid RAM. A simple memory test determines
) ]" j; W- i2 s7 u0 s* the actually available RAM size between addresses `base' and/ ]+ ?7 N6 B* ^! c, r& Q
* `base + maxsize'.
, @+ v9 [3 }* E*/
, j' z( q2 y: k9 Q; tlong get_ram_size(long *base, long maxsize)
- {8 h4 t5 V! q. i# }{0 I- [2 `$ o- l' c/ `8 q
        volatile long *addr;
' r: h8 k. E" ^/ m, M8 U        long           save[32];$ [' V7 ~3 d2 H: j
        long           cnt;4 X8 J( I1 n) P4 f, \3 o" h
        long           val;
( X3 v, a- w0 t+ s0 p( ?        long           size;
- L& q8 W* W) T! G5 f6 ~6 i# m5 V        int            i = 0;4 f* v. q+ X6 a; e2 _4 }! }& @
, i6 ~6 S8 b; I! u& p) ]' Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 ^' y9 V7 E$ g$ G- B2 h5 M                addr = base + cnt;        /* pointer arith! */
  P. T% I% ]5 b% m. b                sync ();$ y% O+ f/ L6 A- O( a) R
                save[i++] = *addr;
/ F% g# {+ y8 }5 B. F! E                sync ();9 E2 X! K. c+ N3 E, h, u+ {- p
                *addr = ~cnt;1 a4 L) k* T+ V; J
        }
8 u- W( {6 l- K
$ L$ d# d2 r) D/ u* b, {        addr = base;
. X% {* R6 d! d* n% G- F6 A. S        sync ();
% S# |9 b7 k1 e- y        save = *addr;
  W2 \% Q5 d) j        sync ();1 v; n+ z+ k2 V3 S, H
        *addr = 0;
% A, t8 }3 t+ L, k4 L$ j9 p0 R* G% i- }& @7 q  z8 f
        sync ();& i4 C5 z) q$ J8 x  j* U* N* @
        if ((val = *addr) != 0) {1 ^2 d/ F1 j' N+ {; P+ t
                /* Restore the original data before leaving the function.
8 \5 j* }0 E% |( z+ c                 */
0 F$ |' f9 f2 k9 E# `5 H                sync ();8 z$ |! h6 b" g
                *addr = save;
' z8 @1 q' G4 N; P$ m& L; r                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 }. M. t1 U/ d; Q1 N
                        addr  = base + cnt;! N# M; A  ]( C% o! c$ s/ W
                        sync ();
9 N8 i# Q1 E. Y/ ?8 [                        *addr = save[--i];4 v  F% N; p, O: S3 ?4 \9 b9 F& T
                }
$ I6 C2 z, x7 [. [2 \  U; h                return (0);! D. K# v) `8 g5 b2 F5 x! I
        }' r' u. s+ ~) W# T* O, [
0 C, ]7 W0 ]; V7 x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' w7 ~  l' g, L# F  F+ W
                addr = base + cnt;        /* pointer arith! */
  X, \2 N/ ]% e4 h                val = *addr;
# t3 Q% A3 Y. q% s3 P                *addr = save[--i];: k# D1 d& @' X3 P7 t7 d
                if (val != ~cnt) {
0 u& p2 i1 X, A7 k4 ~$ H$ G                        size = cnt * sizeof (long);
! h: n0 U- E) @* r. p1 {" i                        /* Restore the original data before leaving the function.9 p) v( x, b3 E' O
                         */9 `1 q8 d. G) ]4 o3 r) a8 c. `" T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' b. T, b) u! N  C                                addr  = base + cnt;- _" |" m8 \. v) G( n$ x
                                *addr = save[--i];
9 W! u  |/ m; H5 U                        }
' ^( q! a9 d2 S                        return (size);
8 s" h( }$ ^3 n. C. E  l' a7 e                }9 r* S3 Z& D# s8 G  L, ?
        }
# @, m0 R1 D+ T
  q5 \! G" `+ ^9 G        return (maxsize);
- p  S$ u) `0 X: G9 @* @}" a0 K  o( }9 t2 O' L6 H' l
int dram_init(void)
, X: ^+ g/ X6 u2 A) K0 M# w2 {) V) ^- s{
3 f; L: \5 m2 t- z) w5 {  |        /* dram_init must store complete ramsize in gd->ram_size */
8 J( d3 N" G+ x3 m5 s* F        gd->ram_size = get_ram_size(( G- x% g, N8 ?
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 C+ A0 V2 I3 B& v5 J                        CONFIG_MAX_RAM_BANK_SIZE);, |% k5 N, q  S
        return 0;2 k* m! w; N+ j
}
. G: g+ I* F+ c" ^# q
. s5 k* v: O# P: R& J
3 _" ]/ Z  X. v7 f- A4 T6 i8 N2 J& c1 \6 ]- T/ u* w9 F
7 |! g: t! b- h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) `" u+ Q  j. U! G$ L, `

) J' a$ r- R/ V
! x2 d5 l  N% I+ U

# {( ]) ^; z1 M2 A; i




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