嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) H" r+ o; _( ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 z% \! S1 ?7 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! z& N* l" M- V$ v) o- }9 O6 Q. L1 d
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, {8 ^1 [$ Z& E) Q3 K+ ?
( D' |, G6 |2 s, R
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. |. y( B$ j, F$ _
/*
/ J1 ~5 P6 ]7 V* k9 h# K* Check memory range for valid RAM. A simple memory test determines
2 J- H% P# [8 f* the actually available RAM size between addresses `base' and* `) h0 |3 P- x' K% |7 f3 i. n
* `base + maxsize'.
8 F  i: A0 g/ ]/ }( Q*/
( W6 y; l$ M: ilong get_ram_size(long *base, long maxsize)
4 [: O" k0 K3 _4 y  j2 J{1 X* m1 x$ i% K) S
        volatile long *addr;
' m5 G1 U, V8 y- s3 A8 F% f        long           save[32];6 E/ F5 p/ q8 k) s1 v/ q) L" e: b
        long           cnt;
) [6 Z& i6 Y) |" L+ n9 p: {        long           val;
6 h  b$ h4 [! Y, a        long           size;
( K. l1 k2 o, D# F5 I& r8 f- Y        int            i = 0;
+ Y( y' Y% F2 U* |* c, B
2 B, H1 e& I3 T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' p+ z0 p6 X. w% V5 g
                addr = base + cnt;        /* pointer arith! */1 r* b% Z" u6 k* E: F. L
                sync ();9 ]! d/ H, t" C7 ^) B' [
                save[i++] = *addr;
# k: j% G' i4 t( O% R3 q& D+ q                sync ();5 r5 o; w/ E" H6 z0 s3 a; l  e
                *addr = ~cnt;5 h0 `- m! B8 B2 y) U  v( K
        }
7 E+ J7 C. ^( V% y
' ^5 d) {: G8 S2 s        addr = base;) R* i* d( j0 n. V
        sync ();
" ^, R  r1 p7 z( |7 W5 ^+ A        save = *addr;2 Q6 F, |7 ?7 }! |3 g* q, W, P+ Q
        sync ();
7 f2 t: B7 P. w6 U        *addr = 0;
* ~; K0 j- u) |* i7 @7 k$ u) ?4 f5 V1 k; a# M! K# p0 ]" e
        sync ();- ~0 H1 [9 N  Q) ]% n: L
        if ((val = *addr) != 0) {  ~7 g, ?0 I1 V0 Q' q! N! _
                /* Restore the original data before leaving the function.
1 @6 ^  I  m$ u, }7 E9 [                 */
  S+ i7 g% P5 C0 @6 N3 R) E4 R- P                sync ();" [9 K) f" b8 U; u) u( w  |
                *addr = save;3 j2 [3 g4 G: H& l+ u6 W& K* }! r& |2 D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 `2 T5 G* v% v2 {  d' w/ t: b
                        addr  = base + cnt;
! H# o3 m3 g& q$ h2 z                        sync ();
. o- U+ M9 Q- X6 T/ O( ]                        *addr = save[--i];) |' w$ S* I* M
                }9 P: O/ }. x' @3 f9 }
                return (0);6 O- |8 l1 e0 m: h: v/ D2 w& c
        }) N/ Q8 F( A, e6 g

: }5 t9 J, M& |% H/ {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' m5 ]0 B9 o6 A' F% S7 D                addr = base + cnt;        /* pointer arith! */
# ~" U  `+ K0 B. B( c                val = *addr;, w: X2 C4 w) B9 J' ^1 f
                *addr = save[--i];
9 m$ m8 n4 b8 e/ l7 G& b- g: e4 S7 g+ \                if (val != ~cnt) {
& o( D# w/ p# [3 V) h1 D$ k7 Y                        size = cnt * sizeof (long);9 W- V! o3 H) j& k, Q8 }8 \
                        /* Restore the original data before leaving the function.) O5 o3 N2 a2 Y+ x3 P
                         */& n4 }4 |) V; M; R1 n$ }! h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 b4 v0 \1 y' i. `+ N+ E5 z/ J                                addr  = base + cnt;; X) k  O5 X' R1 J& D+ w) i
                                *addr = save[--i];
4 a/ T# {0 Y$ O9 _# G( d7 s                        }
: j; p$ z7 i& |* p3 F# g; I                        return (size);
  @2 v) W1 q6 n- l( Y* L                }
2 f/ F4 _* Q7 a$ a        }1 H. M9 x+ B$ }4 x4 c  [
& a! L  e2 D0 k& s
        return (maxsize);  a" S7 N6 Q2 e2 e
}. z6 G# w4 G5 b4 \  Z* ?$ J
int dram_init(void)! N' H0 n5 N6 v& W0 q" A& C
{1 _% G8 Q3 S& R  \0 g8 d1 U+ N
        /* dram_init must store complete ramsize in gd->ram_size */2 M& ?5 `2 g* l; O3 v( v
        gd->ram_size = get_ram_size(( ?2 |% c# |: D$ g" W2 ^
                        (void *)CONFIG_SYS_SDRAM_BASE,
# l1 d0 a$ a, m/ A                        CONFIG_MAX_RAM_BANK_SIZE);2 j  {. Q& ]1 U) {& O  }
        return 0;2 T" A6 t1 X! S4 y7 ~
}3 V$ D* n3 j2 K8 @5 Y- k& f1 }

' Z) w5 B, W8 ^+ j* M3 N+ \: j$ Y& J8 A
3 k- B  v4 X9 r! }2 E2 z6 `7 D# b

; W/ _+ ?7 s/ y! W+ y8 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ \" [. x) U1 }9 M8 b/ Y( X% E9 e2 T' p
& V8 D' H5 a# P! b, R0 }& D! O
" C$ E2 G8 j4 R( `, b4 @





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