嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 p3 s$ F; p8 u1 B* x/ q核心板2:DDR2 256M Byte   NAND FLASH 8G bit, x& U, @1 H' t6 E+ i8 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 f; T& U2 B: x! C5 j& }  B. M5 r* a* @* ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 y( y6 \$ l' _2 u8 E

$ v2 {3 M0 g0 P3 W
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( @1 B5 D6 G9 T/ @/ v* X/*& M" _  b3 s4 t4 R
* Check memory range for valid RAM. A simple memory test determines, G! y  f4 ?4 l# K5 e3 F
* the actually available RAM size between addresses `base' and: d8 ^$ d* B8 l* i' e! P  q" o/ Q
* `base + maxsize'.- }+ ~  u$ O" ]( |/ U; C* C
*/
" I" u! B' D4 ?/ @* S* ]long get_ram_size(long *base, long maxsize)6 i$ k1 I0 ]( n; a, }, R
{( I* d6 }6 o% `2 U. }: E% U
        volatile long *addr;
$ I. I& d  o' ?        long           save[32];" p( p: O) m# p
        long           cnt;4 C) l  P% A: I. z$ O) u. D! |, N; n
        long           val;
2 @: T9 H/ }4 S7 E0 J: p        long           size;) l: u5 [. [8 j* Z
        int            i = 0;# \" b$ C7 W% [& n9 z# h4 F. Q
8 z' _+ b( U9 ?" ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ E) [, J# q6 _8 b
                addr = base + cnt;        /* pointer arith! *// X/ f/ |4 E( O; o+ e( j
                sync ();
- @: r* L. _9 a6 l                save[i++] = *addr;
0 {; N/ o1 o3 ?- R6 _3 w0 a                sync ();9 N' x  W9 U$ \! G1 W$ J
                *addr = ~cnt;
( i, d1 E( Z- m2 k        }3 x) j# `" c1 ~! y& R
! e: H7 e0 @8 r& ^
        addr = base;
# @  `9 d; ^, E& x& y        sync ();% `8 h; Q6 H4 X3 D# A; ]" }
        save = *addr;
* s  j- Z! ?+ f        sync ();
/ _- s8 N- W. |5 K9 l4 `) }+ L* J' C        *addr = 0;, a! x0 J1 o- u  G. B/ R: u8 y
# l* o% n/ g  T# N3 a- \' A
        sync ();4 Z5 K/ p7 Y, N$ i1 e$ k
        if ((val = *addr) != 0) {
; {7 A7 K( A( u8 ^7 p. t7 E                /* Restore the original data before leaving the function.
6 {3 D# O" ~) n( S' Y$ ~                 */9 R) s0 }6 T8 j" r" i
                sync ();+ ~. s0 D/ o) ?) h: W# Y# @% i
                *addr = save;
* p( ]' C- `7 f/ h- K; ?- p' |4 _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ y% E. [$ e+ s# y" N: d
                        addr  = base + cnt;
  m  z7 W( |8 M: i: T                        sync ();
, P" u- u# E* F. n/ q6 a                        *addr = save[--i];
  Q) [9 j, n* M* p( w: H) K& c                }+ i. z  J6 K7 b/ K( c
                return (0);2 g+ m) _: {/ I
        }
/ u' F' O0 G$ Y1 ~& [. W' T' U* V8 z( q9 Z9 E1 F" w" s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 j' `9 Z+ z; p+ D" O6 c* X* `' N                addr = base + cnt;        /* pointer arith! */+ b$ J, h+ p0 u1 K1 E) e! F
                val = *addr;
! n" R! H8 J8 w9 C1 ~                *addr = save[--i];
: z2 v( t, y3 F5 Y: \6 s- m' `7 ^                if (val != ~cnt) {
4 N7 A) A1 ~- Y( R' @- }3 a+ [8 O) Y* R                        size = cnt * sizeof (long);5 i2 A( M# q9 M- d: r
                        /* Restore the original data before leaving the function.
4 A7 h' C; J3 n8 d. u                         */3 C7 Y4 t& @3 o9 s4 U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 }3 o( ]' D2 C2 Z& _3 \
                                addr  = base + cnt;
9 O, W0 e* `3 B                                *addr = save[--i];4 ]" z* s5 r* n+ `
                        }! p4 S+ }7 ?& {( y7 q
                        return (size);
! Z! G9 K. J$ F* D" [                }6 h4 {0 \4 v: x$ S
        }, `- |: |% O( ~6 l. b
4 ?0 E( O/ G5 I( V9 r, s' k0 p
        return (maxsize);
* i7 W9 N+ L) P# Z+ E}
  p$ f% V- H9 r* kint dram_init(void)
. n% ?1 a' x9 v, m$ t' |{
  q: p" ?5 R% Q" ~5 W' `' a        /* dram_init must store complete ramsize in gd->ram_size */
9 Z$ `1 t9 q- E9 P3 U( r        gd->ram_size = get_ram_size(
5 m$ x7 U, f# I* t4 y5 G% M                        (void *)CONFIG_SYS_SDRAM_BASE,5 `: n6 i- b" R% B
                        CONFIG_MAX_RAM_BANK_SIZE);8 _# L; K6 l- f, r1 M: V
        return 0;
9 R# T, h, G" j! H, [}! c$ B, x4 L3 ]% t4 i" _: G

. W1 F3 m3 e9 r4 t9 f* X. ^5 o$ P4 ~# P- z

' i+ F" ]- J0 @- \
% h% U" @8 Y, o# JFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" m) e. q5 Y! F* Y6 |5 B5 e6 f
' R- I+ s+ u/ C& s& y5 E) q  E
* Y) n" {6 M% H+ c+ n7 |  O& L+ B
- L( [$ H7 Z% _- f





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