嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 E* S$ f* U  W9 i; J7 O' R$ A
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% q1 Y4 z) T  j, C这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# z1 [# H% F/ ^; e9 L! \: c- K+ F
  g0 o; _# A( n$ f4 u0 e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# j+ D: V3 ~8 U
; c* B% u9 Q& w3 @: \6 {
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! q6 X* c' i6 \: q4 \& N$ [/*
8 {6 h' i* d' m$ l! b% W3 q* Check memory range for valid RAM. A simple memory test determines
: Y: h) ]. b$ v& ?- J* the actually available RAM size between addresses `base' and- D' }  [1 h& [2 C; J9 \
* `base + maxsize'.
% ?4 U. {4 K# T; p*/  H) }! n+ c5 [
long get_ram_size(long *base, long maxsize)1 P2 f( d( L9 G
{
  b( u& @5 t4 E" l+ p  j        volatile long *addr;! N" _# Z% b# Y
        long           save[32];
2 f  h0 X; _3 D, d        long           cnt;
$ G: r: ]1 F3 I) O' s        long           val;( z3 C0 g# x& Z0 ^4 E6 z/ z
        long           size;
. l  q/ G$ V* |. [# Y* S' P% k        int            i = 0;7 ]- }( |1 S8 {4 P

( \2 s9 N; R' \- t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: k) d- s' h3 D5 L# A                addr = base + cnt;        /* pointer arith! */
+ z0 k; c, G; _' M/ n                sync ();  S# \5 j6 R+ O+ Q7 q" g9 c' v# W
                save[i++] = *addr;# e* u: x  H- O8 X1 p7 y+ q
                sync ();
. t. t# u$ U# S' `                *addr = ~cnt;
4 S, A7 A1 B9 u. E% T: {' l. A        }
4 k6 n3 n) n) C5 {5 ~
; Z9 h, L4 r3 x; z8 W8 F/ h5 b7 W% R        addr = base;
6 M1 i) R* X% m6 H7 B- {        sync ();# z$ M5 F$ t. `+ t# e; c! G
        save = *addr;, M7 p% L$ k7 G8 C$ M5 x
        sync ();3 U, s7 H' r7 T) M! Z% A7 v
        *addr = 0;
1 E2 _; p0 p  V# T4 j+ W
5 P6 R. t$ o5 u6 O& U" x$ E7 V        sync ();
5 t: |6 s2 a7 \        if ((val = *addr) != 0) {/ u% |: ?& }3 ]% T+ i7 l% Y9 J
                /* Restore the original data before leaving the function.: U/ b0 W# }2 W* ?- ^
                 */1 X- I) q. X# r) K
                sync ();
2 Z9 f- ^, g/ R- V, e: s5 L                *addr = save;; T6 W  s" A6 R7 N/ `! a( D, A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& W, V3 M2 K& w  m                        addr  = base + cnt;" A" Q; G; P7 k: F" t! h; @3 \8 b
                        sync ();! }/ V& m. k" v  A! N% c
                        *addr = save[--i];" O& p' e& p9 S& V1 j9 |
                }
5 _3 E  g1 m& e. G! f                return (0);4 X* a/ Q  L# n; L# N
        }
2 _. O* I' i6 L% G9 g8 U/ E' A' V+ u5 W7 [" @0 S' \: U+ M  Q; I4 c
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# s) o4 T5 C; p* K# P: R
                addr = base + cnt;        /* pointer arith! */
1 T2 X, a* i4 k# F+ q  a9 M                val = *addr;1 C7 C" I$ ?4 U
                *addr = save[--i];
! ?. L9 p, c' s0 X                if (val != ~cnt) {; Z$ v" x: \4 ~- @$ h
                        size = cnt * sizeof (long);
0 y0 Q9 G3 X# v+ `( e7 U$ x                        /* Restore the original data before leaving the function.
! ]6 m* _' c2 }% A                         */
# u) E2 z1 v8 N' \: Z  m+ I7 I3 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 E* P: ?3 T" f% o5 V- U
                                addr  = base + cnt;( O' n2 W) c/ W+ W- J; O/ F
                                *addr = save[--i];% ^) {0 }! b- H
                        }0 ?2 \6 I* |3 s& q
                        return (size);) i; D8 k: x; E, I/ [# |8 C
                }0 }: d  H4 z7 L7 X
        }7 |$ ?  L, A# t8 j# r4 u1 t3 D' @, s

% _9 r( b+ y2 \3 I; v1 o        return (maxsize);* H2 G- H( x8 {; }  |
}
; r5 L/ ~( x3 K3 }- `) Kint dram_init(void), P. R1 r  }+ y& }" q$ y1 |) U
{
' U& @8 _/ F& ]1 A; n" f2 f        /* dram_init must store complete ramsize in gd->ram_size */1 Z2 |6 @' q6 n( ^% z5 t" D% \
        gd->ram_size = get_ram_size(
3 N/ Y7 `! ?5 m% m, Q. r                        (void *)CONFIG_SYS_SDRAM_BASE,
0 f3 V  R: s6 b: c                        CONFIG_MAX_RAM_BANK_SIZE);# S  I: U3 U$ q5 y# k2 I
        return 0;* n! e! J! k$ X8 Y' ]
}
' M4 t- ?% b7 f. @+ @+ r& ~5 U8 T- x! \! M+ S+ v
- n' u. X' n; s" e7 w6 G( ~
# j6 B' x/ |2 v

2 `. \5 h  l$ o2 MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 X( x! Y( o- v5 M1 Z

  O. H, B$ U7 {* C! t$ w
3 R9 a# p' k1 Q
. t5 i, @+ t+ m





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