嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, ?; k! X/ u+ u) l; |
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& a+ {3 c! p/ r/ o" _这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' W# t  J+ B# W* H1 J7 ^0 `, E
' b% L5 x' v0 J) H/ Y+ y- X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! h% A9 N* g, J6 m9 x; P1 D' z
, f( z2 k( m9 D7 F

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) n1 O3 A1 m3 n; V7 w/** {$ r4 t( H7 R
* Check memory range for valid RAM. A simple memory test determines
5 n+ E, X% c( m1 U. L' N$ G* the actually available RAM size between addresses `base' and
* Z3 K: ]% O8 g0 e, f9 j* `base + maxsize'.! r. i6 _0 a" j2 x
*/! T7 N. y* W+ Z# U9 A+ _8 t
long get_ram_size(long *base, long maxsize)
  O0 J$ R( d& D0 ~{* Z2 Q& C; w% X' f! _
        volatile long *addr;
# o8 x0 \3 i) {6 r( r$ W        long           save[32];
/ r1 x3 l+ Q. Y* Q        long           cnt;
. I1 C" _5 b4 A* j6 X  D        long           val;
4 `$ |8 M1 A, A, B' U/ W        long           size;. ~1 \1 L7 w6 y* @  }
        int            i = 0;& n' V/ A! C9 ?4 @1 D

! l& l4 s& a/ \( z3 c; r9 `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 x  h6 e! C6 l0 W. W% h                addr = base + cnt;        /* pointer arith! */) g* ^9 F+ }2 K- j
                sync ();' n8 P8 A+ i& U1 S# N3 D' s
                save[i++] = *addr;9 \3 b" s  B) \$ y
                sync ();
! x5 ^* c- a$ R5 |- p                *addr = ~cnt;
' R. n' b/ r! Y; w; B        }7 a; J/ p- a$ k. ]- @9 c& M" P& U

; V# S0 B2 k! b6 B% y! N& A        addr = base;
( m" ]* n" \9 {) U2 F        sync ();& ]5 D# p: j/ O- t% D4 F
        save = *addr;! t# O. d/ o! p9 c
        sync ();- ]0 d2 B# P* o, T1 y) y( x* K9 S
        *addr = 0;) W: x% i: r& d# r6 {
9 K6 u7 D: j$ U
        sync ();
5 O  o* B5 L; Q2 i) z% C' k- _        if ((val = *addr) != 0) {
- y2 r. l- c- ]3 L" m                /* Restore the original data before leaving the function.8 Z" c- c- M4 D. }; O; c# d& t  M
                 */3 |% B6 h1 j9 q
                sync ();
! v& }0 l+ T' u4 R7 Y) f' J+ @7 q                *addr = save;
% w8 b/ {# @1 b8 X' B, m                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) {! @3 ^" i" R' z% J; }1 v
                        addr  = base + cnt;' j* `- O& N. r. W2 K; a6 B8 W2 O7 f+ x3 C
                        sync ();
4 ?9 v, P2 ]; n3 U7 n  e                        *addr = save[--i];8 o& l6 K7 V- \" Y
                }
* r; Q4 L6 C& C8 D" w                return (0);1 j! N7 K6 _" q; r/ o) g
        }
0 W5 C6 X' U7 @
. S" \3 h, E. M! \, O        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' Y' F, D$ i# _& G2 M4 |$ k                addr = base + cnt;        /* pointer arith! */( Y% A& i" r" X# Y* z5 P
                val = *addr;/ |) ?6 o( H& ]0 \5 t
                *addr = save[--i];
, Z$ d( v- n! [                if (val != ~cnt) {
) R+ v8 d, x' R# R                        size = cnt * sizeof (long);$ E* w: ?% u/ M% Z9 P5 s5 f/ \
                        /* Restore the original data before leaving the function.
& M! H4 y( m! U/ ^/ J8 M                         */7 y' k- Z% h) l% W; H6 E
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, z& j2 J; ~" v! v                                addr  = base + cnt;' i9 b7 o+ Z* B! }
                                *addr = save[--i];
0 Q  r! c* A3 B0 h, s                        }. x0 _" t8 W3 R4 c, ?, D* U. X
                        return (size);
( }0 ~4 [2 z0 v+ `                }5 m! S! L" d0 g' ^3 A$ ]) s
        }
4 A& `1 z0 Q- ]2 X1 b
! C( e0 v" |& z* a        return (maxsize);7 q" l  \$ }3 h" o5 S# b/ t
}" t5 A2 s  b* |
int dram_init(void)
9 y3 M' D' P: i{8 s* _8 L" m+ k8 p; }+ D# i7 P
        /* dram_init must store complete ramsize in gd->ram_size */
0 ~& q5 r& X" O$ h) C+ c        gd->ram_size = get_ram_size(
- H% i. }6 f& e. T8 {4 n. H8 }                        (void *)CONFIG_SYS_SDRAM_BASE,: N6 W; o6 e6 N- n! Q: D
                        CONFIG_MAX_RAM_BANK_SIZE);2 ]2 R- B1 U' b+ v
        return 0;: l8 `$ w- Q& p8 R. t$ ?9 B
}
: M! t0 R/ S# T3 b5 U9 H# F4 J. e* Z  S5 b0 G2 J7 W; Y
  G$ W5 D' O6 M, A0 l, R9 A
3 T3 o: i8 M/ V1 y$ h

) v/ j! m: Q/ A) a" W' x) v+ EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" c2 d* a. l/ g7 O$ P
% w8 P+ {& c8 C. z

. ~: C6 }1 d% @9 \4 w* ?' s8 l

$ G$ l8 w7 H. I2 A5 U, \




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