嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 q- J: n& l) ?  y$ n) D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 B1 P* t6 Z6 B- Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  j0 V( R6 Z; l- u3 S
* R% @6 }6 K& V* i- h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ {; M" y: q" D) c" W! F3 |, a. C

+ a( u7 h# v6 L/ F/ a( Y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 Z- F6 k: _( g/ m% Z, a$ H
/*+ \" w$ H0 d/ B. c5 `
* Check memory range for valid RAM. A simple memory test determines
9 s& |4 k% h; _; @* H$ D1 G* a* the actually available RAM size between addresses `base' and1 F4 @9 O6 Z4 Z
* `base + maxsize'.; I/ U& `6 o' ]& P2 S
*/
, G9 J8 g1 k2 ~; tlong get_ram_size(long *base, long maxsize)
$ c) U' H0 Y: _{
; u) h% k: X6 m3 w        volatile long *addr;+ i& f. N- i2 k' P6 p4 K4 u
        long           save[32];, @3 ^$ k1 M$ _$ U# B8 O" N. f# N0 B6 d
        long           cnt;
/ B7 E5 G5 e& w( K9 j        long           val;
/ e: M* }  [) Y5 U        long           size;
8 w/ T7 Y! ]* |* \        int            i = 0;
/ y" d$ \  d6 R$ _8 Z3 ?
6 ?- x% i3 Z+ @$ v# G4 A9 l6 q% U        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* R% ]& }6 _' `/ N5 v                addr = base + cnt;        /* pointer arith! */- J3 u1 x/ v1 m- X: ?
                sync ();2 v: a5 d9 d* R$ g  z
                save[i++] = *addr;4 n7 B7 d$ G9 k& T, `/ ^
                sync ();' l2 k8 Y2 ]  Y( Q  C6 P. O& M
                *addr = ~cnt;1 H, k% f& G4 N- V$ s
        }: @! q- G, O7 [& y
. Z0 R* b" K8 b
        addr = base;0 q( `" Z$ D6 G4 {& y! S& Q  ~
        sync ();
  g# y. A8 x  A' A3 k& |; D5 b        save = *addr;
- n% o0 l6 p  J0 A- K+ f# j( S        sync ();% V; l/ b+ k  P9 H2 \
        *addr = 0;
# F* v7 R; W1 F; Q. \7 ]: ]6 T! r4 P/ @4 \4 P) P# R+ K
        sync ();  j! }$ }8 j9 `& b% O, d  H, T! v
        if ((val = *addr) != 0) {
" X" G$ x. ~$ a* J0 }                /* Restore the original data before leaving the function.
; _2 V" d  O8 z, G; d1 O                 *// h8 ?9 {7 r& K  g
                sync ();
+ J7 c3 g0 H" [7 x9 Q7 n                *addr = save;
1 o7 k' o: X! ?9 s4 R                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 [0 A: Q& k/ u6 O' Q; ~3 V
                        addr  = base + cnt;
7 c8 b. F5 y# _9 |, E                        sync ();
, f7 T+ ?2 C2 A; m# k" x- [2 J7 `9 e                        *addr = save[--i];
( J% N2 h2 x. X7 v$ V2 x6 B' ?9 L                }
) T$ A& M0 m9 \' u8 J8 L                return (0);
( g- c) `+ t8 v+ O7 s0 m7 n        }& p% `$ V& t) @$ ^

+ L: L' W7 |- Q  [        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( J( M# _) g. F7 w; Q                addr = base + cnt;        /* pointer arith! */
4 U$ ^! [" R6 q" g                val = *addr;3 {* r3 B' E/ q- J; [* U
                *addr = save[--i];% [9 N# w7 q3 j4 O( q  c
                if (val != ~cnt) {
: M3 T$ F5 ?. E" `8 Z0 T7 i& g5 }/ m( M                        size = cnt * sizeof (long);% a/ D4 Y) X5 Z4 F. g0 ^& c# v# m
                        /* Restore the original data before leaving the function.
+ Q$ E) |0 J& ]8 H                         */" w( @  B1 e. e+ }" D& X; B) Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( L9 T0 W0 g9 y) D8 ~
                                addr  = base + cnt;
7 u" p# N* L8 A* W3 s/ E                                *addr = save[--i];' `5 B' e- U6 {+ f
                        }1 `0 G3 T( X; O1 U) j
                        return (size);- m  \- N8 |. w" K0 ~# c3 i
                }
- X6 A  M7 _  w" x        }
$ F* l2 F/ p) V4 j8 T/ [
  v+ ]* [( ~- N        return (maxsize);6 L8 s3 x4 w  k8 p0 Q) q
}/ z5 w# [7 {7 p6 h3 b
int dram_init(void)
# v. t, \5 x8 S) {{
! Y9 [% p4 m& h4 D        /* dram_init must store complete ramsize in gd->ram_size */
6 q& @) T6 ]; ^5 Y  S        gd->ram_size = get_ram_size(# N4 G. _; f5 e7 a
                        (void *)CONFIG_SYS_SDRAM_BASE,
. m( _( l$ K7 D2 t, c                        CONFIG_MAX_RAM_BANK_SIZE);" t  W  x/ _1 B
        return 0;
9 W2 J$ e0 |+ C( H. p9 q}
! H  G7 I9 I) P. E7 ]; E, K: C0 L) m9 Y) f0 U: O* U

# C' G9 A2 C- F. u! L5 |
9 K& O7 {+ |( \' B6 ?- o
+ f( z8 y0 r# r( ?FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  `% F' N# K! G+ Y. G+ A

4 y7 X/ y7 `8 \- D! g  C9 z4 Q: Z! T0 W) ?

' ]0 I" y7 O/ P7 i# Z# K




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