嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* K' _  u7 Y3 l$ j1 T& }核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 E: s$ E- w) P* V2 }8 a: ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 v7 R: y; s6 g  \% R$ Y9 z- |& }3 `' M) i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 _' X* R0 Q  @" q& b) _0 |
2 V" K5 F# V& S& L
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& g  V& w5 e  i/*- [, R7 s; Z" L9 U, `
* Check memory range for valid RAM. A simple memory test determines
# r8 v6 [# m. M* the actually available RAM size between addresses `base' and
; I% K$ d' F& ^2 t$ [# L/ @8 v* `base + maxsize'.
' o: u9 m1 U" u& p*/
5 M3 ^; d: y8 F7 L7 ^5 c. r8 |  ^long get_ram_size(long *base, long maxsize)
0 D) K, A% D: q( S{
- q% V# m+ R7 a4 n        volatile long *addr;
8 S5 {+ R/ T. N        long           save[32];
; E: x+ L' y) {) D. t        long           cnt;2 y# D: j( S, K. _0 q+ H2 M% J' a( j8 i
        long           val;7 t8 h! S5 }/ J
        long           size;
' B; H1 I9 O# q. H% o        int            i = 0;
0 m7 o0 Q+ o* @; U+ }# l1 b# u6 P1 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! l& G' |$ ?% P                addr = base + cnt;        /* pointer arith! */5 P# I# e  |1 I
                sync ();/ \2 |1 ?2 V! j0 }+ Q) k
                save[i++] = *addr;7 R0 S4 G0 ]2 J4 x6 ^' i2 D
                sync ();
2 K1 Z* d# j6 I% D% J                *addr = ~cnt;
; I7 m, N- M; A& a# C* ~& F        }
6 F  {# n5 ~7 O. [4 X2 |0 b
  N. H+ o( S8 L7 c; f6 M        addr = base;
& _  y- K4 R5 T4 q! B* |% t6 ]        sync ();0 Q/ f; Z" P: Y/ l; ~1 o: G0 j$ l
        save = *addr;2 B  f2 y9 ?* e+ g- X
        sync ();7 u% d* x9 m) V% R5 e$ @
        *addr = 0;  f& e* P& m" U3 v

7 S$ B% J0 x* L1 i# j8 R3 d* b        sync ();
' T, H' D9 `# w1 x7 @        if ((val = *addr) != 0) {
$ g7 r2 N# d! r$ t                /* Restore the original data before leaving the function.
8 S* |+ N/ F' Y5 z                 */
# k0 G$ g& `$ |! @1 y                sync ();7 r" o2 M3 o4 I) p* S
                *addr = save;
6 T- S" T# S6 C5 @# O( C                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- F! y) l1 g: C: _
                        addr  = base + cnt;, \2 P( i4 u/ i" [+ t
                        sync ();/ c4 ?- S3 `% q8 k9 z' {
                        *addr = save[--i];4 n% s& D% \! L  |# L
                }5 J- P, D- P: H# k7 Z
                return (0);
& b& a1 K+ f$ [7 I8 V! Y4 O        }2 j; ?$ E4 A* v% }

  Y) b: @% q4 G3 H6 @        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: B' E7 Y. I: i7 N" J. S4 J9 @$ r9 Z$ c
                addr = base + cnt;        /* pointer arith! */4 [. t2 C8 B* t
                val = *addr;
- f: x! Q% |# m                *addr = save[--i];
$ ^5 k- u, a# W$ {# @                if (val != ~cnt) {
9 a$ V2 N; \/ e8 Z4 n                        size = cnt * sizeof (long);
3 ], e- Z1 t% W. ]: J! M                        /* Restore the original data before leaving the function.
1 V+ @$ r: F) w2 S8 {( P8 o                         */$ Z! u; N- @, e; {. l* k) a0 f( Z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 [3 l/ n; Z7 ]2 A& t9 Y/ M  a                                addr  = base + cnt;
- g, C( ^3 C1 X& |                                *addr = save[--i];: m+ L. v7 v. z  h4 L2 o, B1 K1 z
                        }
( s1 }6 r& e) [& u8 D& ^( g  b2 Z& p' E                        return (size);  l! u( n2 W9 ~& Y
                }2 Q3 `, b; v+ ~5 x: v) Z
        }! e, V1 g7 [$ M  O
7 z2 j  D. L) ]: c$ o& f
        return (maxsize);
) n# M( H* F4 S1 }}; \" c5 q5 _# L% `: Z( d' f4 `0 `
int dram_init(void)  U5 U6 O2 f# ^
{  ?! B  S; @6 ?9 |- o: W
        /* dram_init must store complete ramsize in gd->ram_size */
, k9 ]: X% e# O6 i        gd->ram_size = get_ram_size(. v5 y! I. v1 e# c* d
                        (void *)CONFIG_SYS_SDRAM_BASE,
/ W: J0 D. u4 C. M% }' h5 \9 Q! w                        CONFIG_MAX_RAM_BANK_SIZE);" a6 z( }2 R; V( V
        return 0;
* B2 V, I8 }* x  o* M3 M}
. |( s, E0 D- _6 n6 V( n& u+ q
( S+ e' q* L8 a' t
; D" U8 w' L$ D5 X; j
/ z. E' t0 n  U- [- E. D9 j5 `$ v& t+ ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- Q- p: U# I% n7 U7 h  H* i9 H5 g( B3 w' V9 \4 P, n8 {9 t
7 c+ i! f  H7 N+ ?8 Z. I! @

, L- @0 A( y( K" U* K- e: }




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