嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. o) i9 O5 c0 R+ b3 L* W- R+ e# Z! W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. Q- d: e3 W+ P+ y' ]$ L! U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 i. t$ i+ r, U$ m. K$ V: Q( k% G1 k
6 H! B. o9 ]1 Q( {6 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 J# a9 l- c, F3 a$ C

. ^: c( p5 g5 F! K- D) i$ r, r
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( n# H3 B' O3 L. a! S! R5 E0 [/*
% w% q2 c5 a/ C8 K0 s* Check memory range for valid RAM. A simple memory test determines+ g2 ?  I6 j1 y1 Z( k
* the actually available RAM size between addresses `base' and  {: e; w' |$ H3 ]6 M
* `base + maxsize'.& t/ c3 r; Y% a* z
*/
: ?; Y+ y. C9 Q5 e$ ylong get_ram_size(long *base, long maxsize)7 x8 _. ]' Y; y2 L: J- a
{# g) f2 B: A9 e; l. [8 j, x
        volatile long *addr;
* @! q# f2 J7 r, Y9 @  \        long           save[32];
  w$ z# P! s  J$ Y3 m5 E- h$ z0 Q        long           cnt;
% x, H) ?+ I  @# @& Y' R        long           val;) y+ b/ }/ P5 D
        long           size;
" M8 _# d- h) L) |7 o9 Y        int            i = 0;
" Y6 |) e' H# k. L6 i3 A, d. r( D4 c& Z6 ?& J7 |
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* \6 S6 D3 K3 B- V
                addr = base + cnt;        /* pointer arith! */* B5 T. E+ |( V) U
                sync ();
( {% l, t0 u+ Y, b, ?. F                save[i++] = *addr;
6 F" G* B" k" L& S7 n" s4 w                sync ();5 @+ W$ u4 M8 z8 Z' Z1 X3 {! t+ v" U
                *addr = ~cnt;0 u# o5 `3 B6 o6 i% a5 }- V. t
        }: @, {* i$ s+ n; C3 C/ d
% {  }5 U( \3 h' A# }3 f. Z
        addr = base;
0 s: t6 W1 H& b) u1 g4 I1 Q        sync ();8 ~: I4 D0 F" a3 z# l- [
        save = *addr;
. V5 z! W/ |. A6 z        sync ();
. w4 k3 ]( |3 A/ U: G        *addr = 0;- F  p# e8 b# ]) L/ b% x# {

+ O0 _1 U4 s3 {        sync ();
, a& F, c- C9 U        if ((val = *addr) != 0) {  u9 G; k& E7 L5 A# p, E1 g
                /* Restore the original data before leaving the function./ c/ |1 Z+ C+ R8 i5 f: @: K
                 */! `. h, L3 V# a! _/ U) M
                sync ();8 d- s) p( e" M' t* F
                *addr = save;
) o" F4 g, _2 m8 \. i' B                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  K# L# l" B. }5 n" b/ L
                        addr  = base + cnt;- Y/ \/ W) O3 E( W$ I9 H% F; x
                        sync ();
( Y/ O: g  N' p8 b                        *addr = save[--i];
# R0 @0 o' V. `  {                }
( M0 @7 t; C' r" b/ n                return (0);/ ]/ e1 S/ ^: s- X1 Y+ }/ Y
        }% P9 t6 c! H3 V9 ?/ y
' O9 p! X4 {7 g  C
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- D  p. e! J& _: t                addr = base + cnt;        /* pointer arith! */8 S+ g/ y3 F- K/ a7 T. s
                val = *addr;
+ M# V9 ~3 z% w' F4 p6 u; }, [* @                *addr = save[--i];4 S: z1 |3 f$ L8 e# `) `: L+ R) P, u
                if (val != ~cnt) {. h. w5 ]$ G5 i
                        size = cnt * sizeof (long);
. O+ ~% A1 _8 N0 j" y* f                        /* Restore the original data before leaving the function.$ D7 |( O; ?3 m% `1 X% N( x
                         */
0 V8 w6 b' k5 W  ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 L$ e2 J( f. C4 F) m7 b4 [5 H
                                addr  = base + cnt;
3 F! O' }/ `! J# m                                *addr = save[--i];2 _& j9 b* o- h% j1 j
                        }2 Y  g( Z- _) g" t* O$ B
                        return (size);
1 ~- K# d3 ]$ [" V6 e                }( T( u" U7 F; c; D- c5 w
        }: V5 p3 D: Q9 b* L6 i! F7 e* ]: c: I

* o  u3 P" P, x) b        return (maxsize);/ n8 |: x: o7 K8 L0 \: P6 C
}
0 Q3 i* F+ g, t/ Q& zint dram_init(void)  S. ~7 [+ h& j5 N
{5 t+ v' j- P/ v8 A4 {
        /* dram_init must store complete ramsize in gd->ram_size */
1 F+ H: U7 h* Z! M# H        gd->ram_size = get_ram_size(
9 H( S- W: N/ v, ]                        (void *)CONFIG_SYS_SDRAM_BASE,+ ?# h9 y! w! h0 I* D6 g" r( N
                        CONFIG_MAX_RAM_BANK_SIZE);3 I9 `$ |: n9 x; S
        return 0;
; Y8 ]) @( h2 v( u+ a}, q0 W  u( h$ ^& T  n
* D3 w5 v6 ]& A* B$ y& m

- r3 b* H5 y: }9 V
5 d/ |0 ?( t. m1 k
, g6 Z: v: y/ }/ T% `FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, l8 Y1 h' o! H2 u( ?/ `  w
% @5 A! _& p1 N8 V, S
/ H0 e# P5 l. O
$ Y! r: U% V9 a' B





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