嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& \) Y) B, c$ s0 y3 I! b1 Z8 u核心板2:DDR2 256M Byte   NAND FLASH 8G bit: O% k5 s9 c! A. z6 P+ X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' n$ T6 u: B  q
0 f4 T( N& I7 f; ~; b; ?2 D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 E+ ^2 ?; @$ P5 T3 C0 q
! J. Q, J$ Z# t( D& D5 \
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 Y& Y! K* r# y8 F
/*, g% ~; l7 p: Q
* Check memory range for valid RAM. A simple memory test determines" |, ]6 q$ z$ ?. M" R  }
* the actually available RAM size between addresses `base' and, }  G/ }" A* u: h3 |& \! l
* `base + maxsize'./ Z8 B  \, P8 J% @% T
*/
/ x' f9 [( I. W: l( P* }( along get_ram_size(long *base, long maxsize). ~" Z3 k1 m( }- o$ o3 _, F
{
6 }- A- R/ J% N" e! v* a        volatile long *addr;
; X2 c" a% _8 @, ~        long           save[32];8 I; ^8 K- m$ b+ Z8 v
        long           cnt;
& [* n6 E6 |! Z, t# I* \        long           val;
9 R% u- M) A: ~2 }$ f9 ?        long           size;
$ P* C- b3 F6 E. D0 ^9 g        int            i = 0;
3 q4 T" g  T+ D; o+ I) X) v, O
( G0 l) S0 w6 e4 C7 l0 `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# b' S# o" @" e, @: U' @0 i                addr = base + cnt;        /* pointer arith! */6 b3 E, |0 l/ T$ D4 Z7 y( h
                sync ();! v2 {. m- y" [5 z, u( |
                save[i++] = *addr;2 E9 Z2 u$ g5 ]) m! l4 `5 e4 m
                sync ();
3 F2 K& y! B3 K8 j3 `1 T% \                *addr = ~cnt;
/ K/ @$ {9 T, K8 V$ X+ D        }
- q7 `' a! @3 |4 f7 D2 c, Y+ z# A
        addr = base;
  l" I7 A! K' D! A: C! W' l4 i        sync ();8 \# c. f0 q5 R
        save = *addr;' B8 _) p" z8 ^+ p" V* k* t
        sync ();, R2 _7 ~4 M7 f
        *addr = 0;
& i1 m4 k; _( t" X! T. v: [. e) c1 M& F
        sync ();
$ D  c8 M+ t0 [* s1 G$ }        if ((val = *addr) != 0) {
+ x; b$ s  {: H! ^3 R1 M, o5 V                /* Restore the original data before leaving the function.
% ]0 {' k0 E) C; a* Z$ l. e9 |                 */
7 p' a. {) C! f$ Q, r2 i$ W1 m( J- S                sync ();
/ O1 A% H8 a  k: f                *addr = save;* n# b; K: Q3 x- {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: ~$ y6 k# A* h4 J5 Q                        addr  = base + cnt;
# `1 a2 E* F' A8 \4 d                        sync ();! P1 j7 J! \1 l1 }, S; ~5 u; L( v
                        *addr = save[--i];
$ j/ |& X2 K. G! }8 ?. c                }- F" c, F* K; [3 {
                return (0);$ ^5 I# Z. r2 Z( @4 z. B# J* m$ L. Y
        }+ x7 A3 Y' o" b/ c% K5 d

8 ?5 x9 W; K% Y4 ~% T/ ^$ u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' A& d4 a1 D) y4 Q2 j
                addr = base + cnt;        /* pointer arith! */
. d/ w, T% s" P$ n                val = *addr;' `4 f/ l8 R$ I6 \5 O
                *addr = save[--i];6 p8 }7 X( g. U' S8 X9 V4 ?
                if (val != ~cnt) {8 ~+ s. l( `& L/ E( o0 [
                        size = cnt * sizeof (long);
1 S; d0 {( e$ p! C5 O. |                        /* Restore the original data before leaving the function.: B% `0 V3 T8 {  |
                         */, J1 w( l" z9 @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 m/ X# \6 U2 p* ]! f. j0 `
                                addr  = base + cnt;+ z0 \  h& |6 `9 M! L% [
                                *addr = save[--i];. Q6 F5 J" _7 e, d& k& n7 Z
                        }
. I( T4 j; I$ `                        return (size);
- `3 U! \# B3 R$ Y3 o1 u) f7 Z                }5 H+ D) V, j/ w  R9 j! X4 W
        }
5 x  O/ j3 j" A
* ]# E1 l  }  m2 X# M        return (maxsize);
. A$ d; T5 M  _- [; _}
, Q+ g. l' x4 \1 t  V2 oint dram_init(void)
- ^; ^( h! A8 _: n9 `$ {& a% _+ [0 D{9 L# W' U$ m$ D7 t
        /* dram_init must store complete ramsize in gd->ram_size */% W; R8 W0 @, t2 ^) W8 {; G
        gd->ram_size = get_ram_size(
* r$ T: e7 Y4 v+ H                        (void *)CONFIG_SYS_SDRAM_BASE,
$ W; O8 [  ~; q7 `$ G: E                        CONFIG_MAX_RAM_BANK_SIZE);
( ?# r: T2 j7 O4 p- _) P& T        return 0;$ Z5 I3 b: D3 h) ?7 H8 n8 z
}
5 Z& G: Y6 `8 r0 [% t! J; r7 j# t, w. n3 K0 A7 h# F4 v  a' ?
! J% @" j8 O9 ^' D

/ x+ ?* t7 v  U
/ e6 e/ K1 p& `* UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' z, O5 B" r9 a7 S* n& E1 e* v

" P! {. D9 }, {6 M) a# i5 q( |* }/ ?4 H% O; s, \+ b
4 b+ U! N5 t" q8 Q, B2 N" Y





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