嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 N4 b" v. ~# g  F" d核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 f3 ]' t* W2 c8 Q) m* X5 R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ Z! i, d# F0 a8 |, m/ J
8 T4 U' M3 A7 V+ U. w
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, W! ^0 r5 }. S6 p: G0 Z

$ I, y& V4 n  E
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& m2 G$ @2 a  t/ w; q
/*8 ^7 h: I5 y6 }. y
* Check memory range for valid RAM. A simple memory test determines& F# b$ I5 C$ T  G; H7 G
* the actually available RAM size between addresses `base' and/ J. b; E- p  v
* `base + maxsize'.: F0 \! ?, `% l" _2 Z& Z
*/' q2 s3 e, C3 n- I! _' w
long get_ram_size(long *base, long maxsize)
; k: p  e( W% X) c2 h) h{% c  V  o6 ]# a# `( ?; P* P
        volatile long *addr;/ O' E& {0 g% T9 ]
        long           save[32];
- d8 L+ R0 v4 A  n        long           cnt;" p/ K8 ]" c: q3 A  ~9 z
        long           val;
/ n+ o. c; b! K$ w: |1 @0 g: s' _, ]$ ?        long           size;
& Q. y% h3 f: \, I* K        int            i = 0;
: v* P' T! F2 I  j1 ~4 T+ S  u9 z, y+ q" F: y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# u3 g, b6 p/ M, a+ `  m                addr = base + cnt;        /* pointer arith! */
9 _1 Z2 G  ]3 e, g* B6 ^# O                sync ();8 {. ?" l. Y- b" D7 ^
                save[i++] = *addr;5 X# Q+ ^0 y$ T( t( c3 \$ S
                sync ();, m/ [9 ]' J. d) j: g
                *addr = ~cnt;" W' b0 H) i: K% ?
        }8 r) @# G+ F" v1 j  @9 o

& m/ |& L6 r6 y) d        addr = base;2 d" J6 n7 P- a8 q$ [
        sync ();3 x. E2 T( \- w5 |/ O4 f0 {
        save = *addr;
$ i* r. N* h. p, {! `1 M7 H* v        sync ();
4 v* m- \  O2 W& C7 ?        *addr = 0;
+ G' m* w- H+ i* O! k0 B- R
8 X8 k7 d4 }& ]7 d3 j: Y        sync ();
5 P& @/ b: `  `% R1 k9 _0 o! k        if ((val = *addr) != 0) {1 T8 E! b( u- ]2 F# x+ e
                /* Restore the original data before leaving the function.+ `6 y7 Q3 z9 P0 r7 Q% ?
                 */
) e- F- |8 T" Z) V$ x9 S# s; @                sync ();
/ e$ d% H7 r/ I" u" D4 ]( P& x+ }                *addr = save;
# Z0 N& c" N/ v) C# S3 P& a                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 D) _  w" z' m2 T9 V                        addr  = base + cnt;
7 |4 P' ~$ D/ M                        sync ();- e; L4 u/ u# S$ m7 g
                        *addr = save[--i];7 N. x0 \$ ]& v) h$ m) j5 ?, o
                }
3 Z# }, A$ d# V" A7 n                return (0);0 \5 u, O2 @* i. }9 p
        }
; j" b+ u: U; v  x% H. j
4 q; R9 _+ N! o2 i/ I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 _' q) E5 c" k0 G; ?                addr = base + cnt;        /* pointer arith! */6 k$ e2 e- O6 \& f
                val = *addr;
8 a( q# e& d: M* T8 H                *addr = save[--i];& _/ ?  U- p4 E) m& r
                if (val != ~cnt) {) w' d9 Z: f1 a4 I
                        size = cnt * sizeof (long);3 S7 c' A' ?) u- Y% L
                        /* Restore the original data before leaving the function.
- T: f2 b' r/ \9 f! t* C/ a                         */" `' k2 _8 @- O7 G/ C  \' A
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. ^/ X" V$ _! K, F. U" {& J* P                                addr  = base + cnt;
( o3 R& T& B7 f, P3 Y  Q, f                                *addr = save[--i];
4 g% S$ R) f3 C                        }
6 F% {2 ~& J6 y* s. K: _9 i                        return (size);
4 t4 J. P! H+ U  W3 v* g, V  _                }8 _1 c! \) k) M# v7 |
        }
% T" J! ^' e/ v/ H. e4 Z, Y# a3 e* I+ f
        return (maxsize);
& l. u* w* ^" t" S' R}& E3 t+ V9 s. c% I/ G) U
int dram_init(void)7 p# g& w7 y# x* A& Q8 P
{9 b1 p4 m! B( @" a# |
        /* dram_init must store complete ramsize in gd->ram_size */2 \0 v$ i0 [* E; a4 _
        gd->ram_size = get_ram_size(, w- c" n% X6 |' ^8 S
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 R2 x& ^* P5 ?+ U* `& Q                        CONFIG_MAX_RAM_BANK_SIZE);) ^- }7 \) b) F
        return 0;
: v- e2 l! ~2 \7 L4 I: P- J}
# H2 P- _/ K/ L7 J  ~2 E7 U$ z& A3 B
6 q0 _" ^, C8 J& y0 f; U- G4 I- |5 V% ^. @
# }) k' v* T6 y6 m

$ u& V) u! Q8 Z/ fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& J4 H1 z6 D. o! h! M: _6 G
5 G/ P7 q+ P: Z# X
! l# w/ D; k8 E4 E% E" f! p, [5 l' i
; V7 l4 s7 g7 b5 T3 d) M





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