嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; p( H# C3 V; l' p1 q$ @$ d核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 r5 w. @  l) }4 b这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# a8 a, e! o5 E: Y! F
+ M( ?  x: F+ u* H" J1 i# q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 e# V5 R! n- k) [) N! S) X
! R* b* ~4 f% B; h# O$ c3 e
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 R8 a# V+ H3 x& `& L
/*$ f1 T+ X/ |' _- G0 g( }7 }2 u
* Check memory range for valid RAM. A simple memory test determines
- G* S. {7 B, A8 L* r* the actually available RAM size between addresses `base' and5 |1 A; q; Q9 ^% D
* `base + maxsize'.
* g6 J4 s6 i3 u( ?& T*/
' ?0 ~# k  w) r) Z2 mlong get_ram_size(long *base, long maxsize)
- x# ~# e& w. r. e+ r2 U3 m{- F1 x' p) h$ Y- L  M) ~/ ]: m
        volatile long *addr;
# c2 X! o% M# v        long           save[32];+ C; Y6 }( \+ }2 Q  f
        long           cnt;
$ W6 Q; c' s) k( u# l        long           val;/ X3 M4 q+ U& j
        long           size;. T  O# K. a7 s; y% T9 s
        int            i = 0;
% A9 P; R7 W% ]3 y9 H8 u, W
( x- @2 ?0 Q9 p6 W9 [1 u. J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ \% \- S- i! h8 k, i8 W, P4 }7 e
                addr = base + cnt;        /* pointer arith! */
1 H0 y: Y' _% ^                sync ();
/ P. h8 \4 q: f$ q# j2 _: |1 f. w                save[i++] = *addr;6 E' S' ?+ S. i3 G. [* Q$ ]8 @& T
                sync ();
0 d  R2 S& I: G                *addr = ~cnt;( F: s: J3 h6 y( y1 W
        }
% T' f" O) ]8 ?6 A  R& q0 B  B9 r+ o: f: v  p
        addr = base;
( t0 P% r& v" y5 p        sync ();
+ c* \7 T# \" {% M9 j        save = *addr;
9 ~9 h, C# J+ R$ P2 K! ^        sync ();4 c8 S7 l# E5 Q0 t5 }
        *addr = 0;8 _, z2 [" ]4 a, Z( w! @8 F

- H& Y  s" N- @& S        sync ();  R" ^6 ]/ E- M* K  W
        if ((val = *addr) != 0) {: F$ w$ L  [* J; M
                /* Restore the original data before leaving the function.
& z7 Y) z9 k4 b* o0 c                 */
2 u! q) N- P6 G, `' _                sync ();
. ?1 A* l# Z/ ~) ?( O2 |7 G% g                *addr = save;4 j) u' {% I( p$ b$ L
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  ~( Q9 w+ F' ?5 ~# L$ \: O7 m                        addr  = base + cnt;
; P7 u8 I/ I. H8 e% L                        sync ();* a5 X/ y' ^# Y4 v
                        *addr = save[--i];9 V$ U7 [+ j( S3 w
                }
7 t7 k. t- J) G1 s6 F: h2 s( ~. \                return (0);5 U3 j& L% ~' q) F2 X
        }
$ Q0 i" K' t& t8 b! b" D, i
" `: D1 P  P& V- U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. n/ c6 d! @+ n- t/ }+ I) Z! q                addr = base + cnt;        /* pointer arith! */0 K3 {9 m7 u. B
                val = *addr;; Y1 ~3 d1 p4 z6 U8 ~
                *addr = save[--i];. \9 ?6 K9 b; o1 R
                if (val != ~cnt) {
8 v. o+ t4 `& ?& C, ^( z                        size = cnt * sizeof (long);
% x8 H5 |5 R" }- P                        /* Restore the original data before leaving the function.
2 t5 r: o0 r; i9 z4 r                         */
* d& G4 ^# l$ Y$ n                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* z" @, S! k. S. t
                                addr  = base + cnt;- @- n1 p" L7 V$ u# [
                                *addr = save[--i];
. Q7 L# C# G$ W+ e) ]" Y& a                        }1 U- P8 O; X/ M2 k+ w& o- G) o
                        return (size);( s, W, m/ ]9 P! q0 Q4 `& t6 p
                }$ x! T1 I$ u& O5 _, x- D3 y
        }
$ ~, n  [' s4 f9 h6 t7 r9 Y* u% W
* m+ H7 A+ _& H% C' Z        return (maxsize);* z! H2 j. J' B& b% K5 W8 a/ ^
}
% d. A  G% E' u8 vint dram_init(void)0 G- N% `8 R3 Y  u' {, r. \' T
{
1 W/ S( ]' g2 O. I- R        /* dram_init must store complete ramsize in gd->ram_size */& }8 X5 Y$ f- @( f! B4 t
        gd->ram_size = get_ram_size() p: O0 c& E5 U( p
                        (void *)CONFIG_SYS_SDRAM_BASE,
6 x- T7 v* r6 |                        CONFIG_MAX_RAM_BANK_SIZE);& _; u8 |% r+ K1 F$ ?" {
        return 0;, R" c) v: B; \" r. `
}3 C6 o. P! \# r5 N- w9 v" Q% \

: s3 \2 Y9 p- m. T& Q
$ O# J; ?6 L+ P$ A
! G$ z0 Z; _, \2 B
7 ]1 t* |) G9 f; D. Y3 w0 SFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 t0 H  h/ K, X1 y  F, s+ ~  n# X# n& v, G) f0 p
) p# m& I3 g# s, a! |  u3 `! U. P8 E# l

) k+ ^# W+ W1 ^9 j" l




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