嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; L  u: j6 E  A/ E  T( I. o核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- U3 W* O1 V+ z* ?  X1 ~这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 _6 r$ G+ J- V3 u0 _: S6 i- J; l
! i" O: C% f9 F' \是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 q- U7 K, c) Q. M$ r* N
* t# F  N! W% G* Z7 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- F) h" i: R, Q/ H! ~" L5 `/*7 @2 M5 U. T' I; ]# _  Y
* Check memory range for valid RAM. A simple memory test determines
0 V: v8 K$ q, z) r) t- ^. O* the actually available RAM size between addresses `base' and' f' ^, O: b# d; b7 d" o' x. o
* `base + maxsize'.
% {" }! N" N% ?! i*/" \4 V- Q! B( M2 u! _8 ^
long get_ram_size(long *base, long maxsize)
3 {+ @+ a: C5 K. g{
5 L' N0 y  M) F4 t- }        volatile long *addr;; c0 R/ Y8 s# m3 O5 i
        long           save[32];$ l5 x4 ]3 g$ r2 i; @2 G
        long           cnt;. L' @+ G4 @- }& _
        long           val;
  P' V  B$ }2 R9 b2 X        long           size;+ v6 m+ Q" n, N* V6 Y0 x
        int            i = 0;
# N( s6 R  B3 k/ n
$ h1 u. Q! F% h3 E, S& W6 D        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! U( s! B. ?1 h+ r8 r5 E- [+ F                addr = base + cnt;        /* pointer arith! */
" T5 |: C; d/ [# N8 k! a                sync ();
/ P: ~3 M2 ^1 [/ N- N                save[i++] = *addr;! U6 B3 N# V) \% d+ {! G' Y7 H
                sync ();1 w" t! L1 M; t5 A, R
                *addr = ~cnt;- s+ N8 h) O$ N3 [, \
        }
; S3 [8 L/ ?; O' v5 r. `+ S$ P, P' u& V: U, j( u
        addr = base;% P0 r' V. P& o
        sync ();
5 C" e# S# u- x        save = *addr;# W3 \8 T/ z: ]$ P+ y8 w7 F3 T
        sync ();
. g* i) [( R5 W& J. {  l        *addr = 0;
4 z( @; C; j& o# j4 p, Q. |9 w5 P1 j! |' @3 @
        sync ();- u/ c, a6 r8 n6 o
        if ((val = *addr) != 0) {$ W) h4 {& ]5 d% ]! F
                /* Restore the original data before leaving the function.
3 I: l' R  }+ M, q                 */  Q  b# O2 D/ C0 m5 Z! S
                sync ();
, ?4 l9 I3 w# W                *addr = save;4 h2 y, }# I2 w8 P* [7 `- l8 y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% h; O4 n) {9 n9 F& q* `
                        addr  = base + cnt;
  @' }* B0 r" u. a; v+ r7 C                        sync ();9 p) w* x& C& X7 O0 T  _
                        *addr = save[--i];2 }2 \% F( |& c! D% {. J
                }/ |; X" d# H+ Z! P: E. [; l
                return (0);5 d* J. P. o; t5 d6 k; O5 G. f  U7 w
        }) u7 Y# u1 N' H0 l/ V. n
( G+ G; c: {/ q$ H2 V! H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* b; H- X# q: b+ u4 p2 i
                addr = base + cnt;        /* pointer arith! */1 _: O* C' Z8 l* `- p  N4 L
                val = *addr;
$ T- Y$ B+ }' X6 o2 [7 R6 N2 }5 T                *addr = save[--i];' b1 m% x: y! [1 Q+ C
                if (val != ~cnt) {" @2 Z+ G, X0 V  e, M" _
                        size = cnt * sizeof (long);
6 E! q8 w0 Y! K0 M$ v                        /* Restore the original data before leaving the function.3 {3 }, o; P5 E4 X
                         */
  W) t1 _5 ?' ?  X' r6 l$ ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 s$ _  m. k) w) J- _1 Z; _5 I                                addr  = base + cnt;
1 Z9 j4 D5 e- B% ]# X: K                                *addr = save[--i];
& ]+ M0 v, C7 w0 ~- U                        }
% X* Z+ J5 H, k. l                        return (size);
, J5 y; I7 m, o                }# E# ?  x# d" E4 `8 j
        }8 L* n8 f3 P, a$ |" Z6 `

0 _+ ~; |) e3 _6 A        return (maxsize);2 o- O+ X* H& A
}
7 O/ n; U* A) L+ K4 X6 sint dram_init(void)
5 q: d: K+ g& A8 M2 I( J- F; c+ X{7 ?( s& k! m* s+ h
        /* dram_init must store complete ramsize in gd->ram_size */
) `) M+ \" P# t6 E$ ]& |" Y- c5 Q# g        gd->ram_size = get_ram_size(
& o) E4 _0 @9 `9 K7 j- G                        (void *)CONFIG_SYS_SDRAM_BASE,
- d, D+ l/ |9 @) Y  i  x                        CONFIG_MAX_RAM_BANK_SIZE);
9 b8 Q/ q: Q: P) B1 e" A8 f3 {        return 0;) u8 U; f$ {, |/ i. x
}
  l. S; j( O4 }6 J" j. H( Q( R# R  x& i6 m3 x+ B. l

$ u, H9 Z) T* K1 K0 u4 H: Q) R: D' b  F! n! p7 m; c5 B7 v
/ G6 u1 a; r: m0 H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ a: V9 P6 Y* Y4 V0 |& @# O( I2 `! Q

+ `/ [# z8 A. C5 z* M2 p
8 J/ Q6 r7 W7 K; ^

( O) o" P2 E3 n, e/ C  V" Q/ S




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