嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ }& Y, f! y3 e' `& p+ y" O3 t6 {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 u3 Q' z( y$ e3 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ c! k8 q) c* X! I/ o5 C
9 O. {( r7 t3 T" _# G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! H, `2 w" c/ e* m: V" O/ P
7 |+ i& k) H9 A7 _* U
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: N7 E" E4 x) i: a" E
/*% G; d% c1 A" [1 e$ i5 z
* Check memory range for valid RAM. A simple memory test determines
9 X  [  @3 U) ?* the actually available RAM size between addresses `base' and
! d0 \3 V  }/ I6 g* `base + maxsize'.
: K2 b7 `6 |# E*/, p, R8 W: X; j( S
long get_ram_size(long *base, long maxsize)% R" t& i4 ~0 Y  A* ~3 h, h0 n
{
% P: z- d. {; `5 l        volatile long *addr;' e( c- G+ Q  {$ v) t
        long           save[32];
( S( W9 E; S: o% k% N        long           cnt;" |* `8 d0 j3 N* c* e: x1 h) b
        long           val;* N! M: V. E, `0 N. ]0 m
        long           size;
% X- z/ k# v$ b  p  M1 s        int            i = 0;+ {" o. O) b. o+ x' @( w
( {4 }! p8 Q' ~# p# Z1 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 I6 |+ ^* w$ Z* {+ A9 z
                addr = base + cnt;        /* pointer arith! */
- L! C! w  ~8 e8 l  ]$ ~! U0 c! a                sync ();5 X7 z1 O" H/ U3 Y- g+ ]
                save[i++] = *addr;
1 S) k) g& o( @: z1 a                sync ();" H9 v' v% U' }4 a' D9 o8 ?$ U
                *addr = ~cnt;5 X1 G1 S0 U* X. b/ i* V2 o
        }
' b5 h$ t( e+ q8 _7 Y. ~
0 Q1 n1 T$ ]. c        addr = base;' ?, @& i9 G% h- i) G, Z
        sync ();
+ a" j) e8 y; B9 M8 \3 ?        save = *addr;& K7 y8 j( e9 |0 _1 z
        sync ();* `: ~4 h' q0 b. h
        *addr = 0;- m( E8 A4 Q% O0 c" v
' g/ Q3 T5 n, ?) C' t' j
        sync ();7 {7 |: e3 T- F
        if ((val = *addr) != 0) {
. q0 ~6 `, g: T4 h% |) q: z4 U                /* Restore the original data before leaving the function.7 ^5 U3 {) z; H' p
                 */
" |6 e/ v1 B& |' i  {( I                sync ();
9 |6 D3 E$ |$ N. ~4 t9 v% C* d                *addr = save;9 i! N% R& F8 x- g1 H
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; |( W! m( J+ d, U: z. q                        addr  = base + cnt;6 X. ?1 x+ m; J+ W- _
                        sync ();# e3 v1 w/ r6 X- p# b; J, U4 Z
                        *addr = save[--i];" n2 n/ ^8 u* u# _' C8 t% M, L
                }
  g; j4 Q% p, x( f& d0 C0 V                return (0);
- X9 G! t0 q) @+ ]        }5 V+ J: i/ @$ B' C7 Z  N9 R1 W

7 M" D) G  f! n7 c+ e        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 c) R( R+ q8 X- d, c
                addr = base + cnt;        /* pointer arith! */
0 l7 l/ Q% h; j                val = *addr;
+ ?. g' u" d% R& E. ], C1 h                *addr = save[--i];: y  j! [8 b" d1 }# l! d! ~
                if (val != ~cnt) {
1 [, X1 `0 t" H5 W7 f, K- Q                        size = cnt * sizeof (long);2 C  _5 j* J% k) p) e
                        /* Restore the original data before leaving the function.8 z2 z8 U8 k! Q, g* c4 W
                         */2 v& u9 l/ V" o4 v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  ?- B# ]* q, J# S. e2 K$ C                                addr  = base + cnt;! q( C6 G3 P  ^" b7 g3 J' Z
                                *addr = save[--i];) `% x5 \; q; {* O7 a9 T# |
                        }' ?) y: b# v  G: _! j$ d
                        return (size);8 C3 }7 N6 S* S" @
                }! T2 N$ n$ [2 m$ [0 ^
        }7 L0 o/ S. p8 t  y9 S- W( ]5 R

5 g5 P( T$ h5 l        return (maxsize);
/ l% s* _& I2 Z1 n* e) Q4 G0 K}, I( h) l& Q% j, v# D
int dram_init(void)9 n* }* R" h1 X
{
8 m* w- G/ n0 N, y$ |        /* dram_init must store complete ramsize in gd->ram_size */
- s2 t/ ?- i/ O* r( Q+ b! S0 H        gd->ram_size = get_ram_size(
# ~. `; k' Q( `, _2 Z! ^- Y+ m+ @- b6 E                        (void *)CONFIG_SYS_SDRAM_BASE,+ D6 A# Q3 j2 f
                        CONFIG_MAX_RAM_BANK_SIZE);
8 U2 V$ ]. X) w3 T3 Z% ~8 }        return 0;' {6 E* u9 [0 g4 N
}
" n6 c' r6 ]0 G, ^3 M
' P1 g8 n7 {; n& m3 J) P& n
7 c/ ?4 R  k4 U! \; _- l1 C
8 B: d: t  l* f% ~. C
& B9 R- }* O  v3 _/ k% IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" H+ s" \8 x  C7 o- ?# ^

/ m: o# D# ?# N8 ]
7 z0 a# A( q: ~8 \! y) s. l

$ l, |) m1 e! v% _




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