嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  j4 e0 R+ s. P3 Q6 i. \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. v* v4 \3 K' w7 q* C3 _这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' |0 w. n1 v) H1 n) u$ x$ |3 D! h$ |: l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 S. l. X7 Q5 R# x. u" n& B
/ V1 R' F" S4 ?2 s5 N7 g9 _
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, }- q* O2 ~1 P1 `: Q; F9 u/*8 |8 H* S, f% [8 W0 L0 o
* Check memory range for valid RAM. A simple memory test determines$ d7 z9 p- y0 P! n5 Q2 D/ \
* the actually available RAM size between addresses `base' and8 d& x( x6 D- b# P& J7 e
* `base + maxsize'.
# ^1 x/ \; X6 M: R- k2 k*/; |& j/ q8 w' o# H# c1 u
long get_ram_size(long *base, long maxsize)* I: h  P. G% V* g8 j  U% v
{; B. Y8 t$ I. y7 o2 t& ]/ V" x
        volatile long *addr;; F& u; a& w- T  S, J
        long           save[32];
1 Y, r) q' k( M. w/ Q        long           cnt;
2 t3 k) g8 v0 j7 [; Y        long           val;! S0 `1 D6 e, z
        long           size;4 W. m# P% b1 l& I4 |) X
        int            i = 0;6 v( A7 p; h; m2 Y

0 Y# ^+ ]& L  n8 Q4 V' O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# Y9 O: K, V0 T. P% R0 j
                addr = base + cnt;        /* pointer arith! */; b4 V  ]8 j3 Z. k0 _
                sync ();3 O% p8 t. {' k+ }- D! h, B) ~/ a
                save[i++] = *addr;$ c: y; u8 ~" t* U# E- U5 u2 }
                sync ();
1 v: E, n. c2 l4 y# p                *addr = ~cnt;7 m- x, l5 Z3 Z, @: j9 ]. F
        }
& v; b! [0 Y) ?0 O- ^; a& U+ h0 I6 D
; l. B8 m2 s+ X9 H, T        addr = base;- g" _) |2 y0 {$ d4 U
        sync ();
$ u9 p. S5 M+ H) L& q        save = *addr;2 A2 d! y: D. j% i" M  l
        sync ();  L7 J6 y' P9 M% s7 q3 o$ ]# e
        *addr = 0;5 Y% L: p! R, P# q3 P0 }: u

, \% X/ |9 o. O6 E7 z        sync ();
; a( _7 h  ]5 E4 T" ?        if ((val = *addr) != 0) {6 Y5 ~; A2 O6 @
                /* Restore the original data before leaving the function.3 F( O& ~7 M1 V+ w- u9 |
                 */
1 X% G" o/ I+ T, X+ M( m# P                sync ();: X5 p+ W# Q$ x7 w- ?9 M, i$ ^2 Y/ r
                *addr = save;) b* T9 X1 b% J/ O; B
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& s# @" U( W% q                        addr  = base + cnt;* J+ u5 i& r0 b, I2 g
                        sync ();
# L. F0 p, K2 s" Y& S) O0 ?1 q                        *addr = save[--i];
+ D& h) _# X: n. s                }
0 W' }; b  z2 `7 ~! b                return (0);6 C9 t& ~9 N0 w7 `( K: n
        }
$ l1 C3 k: b  u7 o% I" q: t4 q3 t) V
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 p4 r' @- f% t' O' t3 w                addr = base + cnt;        /* pointer arith! */
4 k' t, j# z0 s4 n7 ?                val = *addr;' K- O. ]) r$ t" R) I( j
                *addr = save[--i];# v$ B3 \! U3 w) \( M. Q! K' k
                if (val != ~cnt) {+ A9 R, O: G$ v1 M+ U* C* b7 P
                        size = cnt * sizeof (long);
# T& Z3 [, P+ V. y: e4 r( U1 B* X                        /* Restore the original data before leaving the function.
: K4 o$ Q. @) p$ x/ Q8 A. |/ Q                         */: P/ R" l% G( {$ J* `/ j( r( ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! G9 E$ ^8 `3 M! X/ t                                addr  = base + cnt;
( Y, y4 x* y6 _+ R$ G" V! v                                *addr = save[--i];( {* N: H' |  x( t
                        }* }" W, e5 R* B$ F) Q
                        return (size);9 g3 x: n5 J4 E
                }
* U& `3 J) H. f! L  n        }
8 [: G/ b7 w7 R8 H7 T$ L# @+ n! h0 |6 h1 n( U7 W# e
        return (maxsize);+ C1 F0 C- q' Y8 |2 A' _8 U
}; G8 K4 d' X6 h5 i8 t) L+ f& [6 {
int dram_init(void)% R! g9 z/ m6 }/ w  s3 T
{
0 F' I5 i( V, X1 C, I* s        /* dram_init must store complete ramsize in gd->ram_size */' z$ z1 v( g- Y; J
        gd->ram_size = get_ram_size(( X3 {0 i" u3 {3 Z/ j- |9 g
                        (void *)CONFIG_SYS_SDRAM_BASE,7 s; T1 }+ T9 A" |3 O
                        CONFIG_MAX_RAM_BANK_SIZE);( N* f0 M, M* F
        return 0;4 R$ P  I) y: }7 C3 G2 b/ t/ x
}! B  _; c8 H/ M7 w  G; G+ Y

. {6 R- S# w! G; G9 `" D' v. M* l- p7 T7 K; O; e' d
. k  Z7 h4 N& d# D6 [: k

/ d7 a9 @9 \' N5 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& y/ U9 A7 w2 y1 u+ u  e1 [+ k2 B

; a+ |; F- L/ I4 K& ^
- o5 U. H3 N! ^' c. I) P" \

  w& @& b$ l+ g+ V8 J6 z; L




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