嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ ?# n6 s' L) H核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 X& r+ X6 c3 c2 d+ l* j3 d这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  w% U: H5 m0 c9 S2 S' ^
5 t/ ~* g$ H8 d( r$ v, g7 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! }; K0 u" Z4 _5 |# @2 ^0 U' g* ^( i% @, [- \7 v3 B

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" c1 C$ U/ I! o) [+ ~/ j
/*4 u0 c9 M8 {; K9 N8 W+ y1 s1 |
* Check memory range for valid RAM. A simple memory test determines
+ ~% |% t* ~* H* the actually available RAM size between addresses `base' and
$ b  \" ^) x  w# b$ y+ S! {/ [* `base + maxsize'.
3 G+ K0 I' V: \: K4 \7 U*/
- O4 x5 S# ?& M) H) elong get_ram_size(long *base, long maxsize)
0 W/ z" o$ I8 o- j# N, [4 `5 x{" _8 y- k* Q2 a' e' ~+ t- j
        volatile long *addr;+ A+ ]$ q* Y- Z/ w+ e( l$ f
        long           save[32];
  k3 a1 ?# }" u+ y  d        long           cnt;
5 G' c* @, t& o# X& h0 e        long           val;
$ `( t: `% {: v' N4 w( r        long           size;
) L. N, U+ y2 V, [        int            i = 0;$ S2 q# M9 h* x# M* ^
+ O, }% g; Z- g. S+ F5 R/ a) T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. K7 v% \8 S" ?; E" K- p$ l                addr = base + cnt;        /* pointer arith! */
* O) w# f( @* E3 J/ t7 o3 G6 d; m' o                sync ();8 r$ k# s. `7 @$ l
                save[i++] = *addr;
% ~* [+ H, ?- t5 @" @, r                sync ();
' v0 p* p. `9 z$ q9 a' Z                *addr = ~cnt;
; X: h4 X) q. w1 }/ ^; @5 I, s        }1 B: W6 u" g/ W6 ?1 v

1 d$ @0 P1 W5 }7 l9 k: h' n        addr = base;6 K. k4 d* Y( P: M  @$ S
        sync ();- `) _* F* l) m$ R
        save = *addr;
, t9 ]1 a0 ~$ E: r5 Y4 V        sync ();
; _- e1 V  j% {0 h2 n# E        *addr = 0;
) [3 d( f, _1 w" L5 N) _5 e! S! @
; c/ o; O$ L  Y7 V% E        sync ();- Y8 M) y% @& s
        if ((val = *addr) != 0) {
& ^. M6 G1 w0 v; S1 W$ Z                /* Restore the original data before leaving the function.( g( P3 `: x$ K" w% _
                 */! V2 K3 f* ^3 W% w% v3 s# _
                sync ();
# z" ]$ S' ?- ~/ S9 Y                *addr = save;: w- H; r, J2 F! \% D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 ?3 A6 W3 V( Z8 o2 L1 ]3 K* m# E                        addr  = base + cnt;
2 w! k  M+ y( W1 O# j0 n                        sync ();
8 ?8 z- J- {& y4 U1 h# m4 C8 e0 B! |& [; W, o                        *addr = save[--i];
; e+ M" m* e- {# d# f+ Q                }6 F7 w% W; S9 V9 H6 N: @9 D
                return (0);
5 z# N* W: M1 P  R+ y. B        }
5 A  X8 \! J' v9 X' |- D' @  |
4 B, e! A0 }2 U" x9 [& ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 C3 N8 Z  ^; W
                addr = base + cnt;        /* pointer arith! */0 V* t* E! w$ Q
                val = *addr;$ {: W" a% L; e9 O) e
                *addr = save[--i];
7 r7 z! A4 f% T) ?                if (val != ~cnt) {
/ {! e' \- W" w& h$ D  A0 w" A( V                        size = cnt * sizeof (long);
9 F# f% T& ~7 r                        /* Restore the original data before leaving the function.
6 J0 M) v+ U% i5 C8 d0 P                         */9 s7 V/ L1 w; s# Z2 t5 @3 K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: e6 x! v4 x' }! t) E; P5 P
                                addr  = base + cnt;
& |9 I& |& J% b                                *addr = save[--i];4 Y/ s( u6 A7 e5 c# w
                        }5 o+ a6 b3 O7 t5 k+ b2 K
                        return (size);
. ~: L0 h4 ^# A7 ]/ o; f                }
$ D9 i: U! H5 _$ }1 t        }9 t7 H7 S( U0 T+ \! x0 d

* V0 \. @4 K' S) s1 }9 Y        return (maxsize);3 [) |+ Z/ y: [
}9 p3 x7 u1 S$ l7 [/ O) e0 Q
int dram_init(void)# w, n; J9 p4 d6 H
{. n8 u. ^9 g7 Z
        /* dram_init must store complete ramsize in gd->ram_size */, C3 h$ t) h6 ~" i
        gd->ram_size = get_ram_size(
# K; r$ I/ b5 a& B                        (void *)CONFIG_SYS_SDRAM_BASE,9 ?: I0 w1 E; b# d- G
                        CONFIG_MAX_RAM_BANK_SIZE);9 n# a  b7 T6 z* h+ R) |
        return 0;' F# Y' n) a. M6 w
}7 o# ~' ]" v) k6 }& [
$ [% |. d0 z( j: {" p% s- O

1 T& Z$ `( d$ N8 b* O0 @) V2 ?' s6 Q2 C6 d0 ]& a

- h5 t  Q  {4 H8 s$ {  |* WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, Q+ t& s; H% o+ N

5 a) a: e4 n% D/ b8 A# v, G% ?$ O$ V- |, Z

  q! f7 ]" d0 h9 O




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