嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ l7 s" H9 M9 w# }& c核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 F/ n) c0 O; o' {8 a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; p# L# _: g) Q; r* C( W2 L9 f. W9 ^3 Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 I+ V% ~2 i% `7 Q

! V5 a* Q8 f3 b# e. N
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  G( j* P, B& O. Y& d) H
/*
$ r* f" v7 a+ c. w9 S( n2 e* Check memory range for valid RAM. A simple memory test determines" C6 q4 F5 d0 u; x2 H" q& ^% p
* the actually available RAM size between addresses `base' and
% D% Y' v2 u( {7 t( J4 X; n* `base + maxsize'.3 i2 e/ S% q& k0 v% [  Y, U
*/6 b6 T( ]* y7 K: N
long get_ram_size(long *base, long maxsize)
; M) J! \& w# J6 @" l1 b, g: E{
7 _! v4 i' R& W7 k* n6 w        volatile long *addr;9 M8 d/ q* z# F, g2 n! o$ B
        long           save[32];
# O2 a7 |. g. q% m! Q        long           cnt;
+ K: W* `% P0 g3 x* ~$ L2 Z* B        long           val;
( y, P  ]7 M' y5 O$ M        long           size;0 e- b+ b1 C3 B0 X
        int            i = 0;
0 X: S& |# f1 Q3 a7 {/ S/ ?. [( I0 {7 \& d5 S
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ i" H! P" |5 x3 m5 G
                addr = base + cnt;        /* pointer arith! */
+ [0 Q/ ]6 m3 z$ j                sync ();
+ C7 `/ N, U- X                save[i++] = *addr;
& z5 J5 z" J, ~* L+ _6 N0 ~; g                sync ();
# Q3 K) k9 }2 f% W                *addr = ~cnt;" k6 p; ~% g' n
        }
! ]9 L& `6 t3 Z* [; @8 F! C$ [; a0 w0 U1 v4 s5 Q8 z
        addr = base;5 X0 X/ L6 o. Z0 [9 r8 S
        sync ();" u5 P! S9 z6 _$ J
        save = *addr;$ c$ |' g! O0 C  g4 O& y5 H
        sync ();
4 y; K: f2 p* |* j% \  N/ ]        *addr = 0;
9 c/ U% h" S$ |$ @  {3 k
( q9 T3 ]6 r4 H9 V& F        sync ();+ y9 D) R7 R, F' v
        if ((val = *addr) != 0) {
+ s# V: C, ^; P% {+ P" u                /* Restore the original data before leaving the function.
  Y! Z" s* Z) ?! M                 */1 U) b3 J) |, _" s0 s
                sync ();" p; x5 D& I/ n) O8 S
                *addr = save;
8 ~$ e# H6 P. Z; U# p- w3 _! x) e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ G' `6 f) f2 p2 l! H; x# _% @
                        addr  = base + cnt;& _: p7 R8 Y, J% m
                        sync ();! N. s) ?  V  z+ N1 g' N5 h" j
                        *addr = save[--i];" K1 G4 `# h- }8 D7 q' _
                }
9 {' I% u' u9 G! V                return (0);
- B, p+ O2 T& G, |9 G. c        }
5 v, U1 _) n1 F+ s) O; `$ X7 s+ X! J, [1 ~- _  w, b& i/ Z# G0 l
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 s2 I2 i  w( m% k. K1 K                addr = base + cnt;        /* pointer arith! */1 ~' z3 d1 k! S, i! d& K
                val = *addr;4 ~( _4 U! t$ T- S" F
                *addr = save[--i];
) f, {9 \' D7 X/ x                if (val != ~cnt) {5 U  ~) F2 j: d  C8 J+ B  {9 G' q2 v
                        size = cnt * sizeof (long);$ \$ y, m8 p- R$ W5 e0 H* H
                        /* Restore the original data before leaving the function.1 ?3 Z. e" l/ k, S& ^4 H, q& w
                         *// [+ C% N0 x$ O+ s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 a; A7 m$ i2 ^* W6 P7 C' x
                                addr  = base + cnt;4 w: M  b9 H4 c
                                *addr = save[--i];2 b8 s$ V  l0 Z" `, R* m1 Q- v
                        }2 W$ p7 \  |( m9 j) z
                        return (size);- b. ~3 u, ^, U4 t' u2 R
                }) n' k; H5 t1 I- m$ ^( u7 P8 L
        }: i7 x  L" P, F! z! C) }
0 H7 `" i5 i  |- [: L0 p9 w
        return (maxsize);6 T: ]9 ?5 x7 K9 ?7 k
}0 x  m$ y1 G/ r. L) P( \6 B
int dram_init(void)8 z: Z' s: l/ [* q
{
" ]7 j% A8 A6 s: H, s  O        /* dram_init must store complete ramsize in gd->ram_size */
7 G# p, {/ g: n2 l' f        gd->ram_size = get_ram_size(
7 O+ z8 p* S6 J5 C' o                        (void *)CONFIG_SYS_SDRAM_BASE,
% u+ G1 I% F& ^, H: @/ C2 h                        CONFIG_MAX_RAM_BANK_SIZE);8 W+ j' W$ M; U# v. W8 Q% ?; F
        return 0;# J7 |) b- G; E3 W$ ^
}% i% f1 P& R, f+ z% \0 v
/ y+ Z; Y& G. S$ q, L
" z& \- c' y, ^' a  M3 ~" m
2 q# w$ A" z  i) U

3 _" l' o! k) ]; L/ t0 iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; T, X2 V3 r6 }' z; _
: c& j8 c; N' B. L2 |2 h
; R, v0 D( n" Q* r

0 l' o2 ]0 Z9 E2 `




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