嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) w# s% y0 V& c' ^) }核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 t+ ~+ @' A" s. B: |1 Q1 Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% H4 J# z7 D! w* S% H4 p

) p* }9 Z0 P1 n是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# N# f& H9 ?! w3 m3 f  C) _- A- D" O1 @) x+ k" H. p* o! A( a, ^0 X

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 x- L( [) l8 B
/*- g7 @3 z, u/ B8 a# L
* Check memory range for valid RAM. A simple memory test determines9 ^+ g( n' T& Q! Q# X
* the actually available RAM size between addresses `base' and
8 C: I" K! D# o0 V* `base + maxsize'.
7 M" l  F( `+ b5 P9 w* M! e*/. K, t9 q7 {$ s5 w
long get_ram_size(long *base, long maxsize)+ O4 H/ x' k0 a7 ]' ?; q' V; t
{
# Y5 L2 Z6 P- M  f5 c3 K/ T        volatile long *addr;
' s! M( D7 N9 m# ^! s' J        long           save[32];
- U; W# D# v. ]0 e5 Z% q        long           cnt;
$ R9 J3 q# G4 d* R2 I% _+ G7 X        long           val;
' r6 M. M* s, j! g        long           size;* e% ?9 F3 z/ T+ a
        int            i = 0;
" {+ `* \. e- [# F: D; k* k* o) f9 X* B) i  \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 A/ G* @% X( Z+ p6 Q) Y                addr = base + cnt;        /* pointer arith! */
, ~, L9 E: l( G. E                sync ();
4 K1 a7 q/ W/ ^) a                save[i++] = *addr;
. B) i5 p$ }9 ^" ?# E                sync ();
6 n, @: `# k# Y9 Y                *addr = ~cnt;
. k7 B2 s" L) r' \7 f        }4 q" c% m7 C. G$ C9 ], b
/ b) X8 k/ q+ l3 ]! W# y' u9 E  q
        addr = base;
0 q. y% r4 Q4 d! c+ D        sync ();
7 R# f( J: z5 n$ ~! P        save = *addr;1 ]1 t; R8 [9 ^( o' C
        sync ();0 u2 z  _5 x$ S0 @% V. D
        *addr = 0;
/ [( u8 a1 A, u7 q: d4 h) p/ u) R- |6 M
        sync ();
, k/ D, c1 L% O" ~: R        if ((val = *addr) != 0) {/ j8 r, Q; ?2 ?# B3 {/ U5 a% \1 R
                /* Restore the original data before leaving the function.4 r! ^, l  G& ]- O: t0 y; W
                 */
  W9 ^1 ^( ^% a9 [* N/ ^                sync ();
* H7 d% I. @: N                *addr = save;
$ z* \. B2 ^( ]# ]8 c2 P5 o                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 S- Q/ S4 d  K3 {# Y! }/ K2 ^                        addr  = base + cnt;" {( c5 x7 p1 ~( h: ?
                        sync ();! \# ]) D7 q6 J. ]% p
                        *addr = save[--i];
" R: o- X* I/ A7 ^6 \/ g                }
* X* a$ I0 J) J3 P7 v                return (0);2 J; g+ h$ g/ N7 v' {1 y
        }
6 s7 z# W7 m" c
& K0 v. t0 O  H5 l0 q! H: C        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 k4 U% |$ J' K
                addr = base + cnt;        /* pointer arith! */
; ?- |* [5 W  I" C                val = *addr;
4 h- X; a7 H* w1 N. C) Q; B' {' Q                *addr = save[--i];
" a9 c* A2 O+ n8 L. X8 w" M; V- \- i                if (val != ~cnt) {
  j, J4 z3 r5 ]5 V  I& k- e                        size = cnt * sizeof (long);
' T" u. U0 {7 l* c6 p                        /* Restore the original data before leaving the function.
9 L8 ~' z) S+ K: W' A- J/ ~0 x6 a                         */' L0 {2 Q, t( @: R" k2 G
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 z# m2 p& [* N+ @( {                                addr  = base + cnt;( }: J6 F- A1 @+ G- y: T9 d8 |
                                *addr = save[--i];
* N; p2 E/ ?% ~/ n                        }; I2 b9 j; m4 z1 V+ z0 [
                        return (size);) `. Y1 D: o1 [' v
                }9 g8 q1 s/ x6 m* v: B: P5 V
        }! R+ A+ e! |: _4 Q# D7 K+ e

5 n' }7 ~: A1 Y" j5 {8 T+ c        return (maxsize);
* w7 m% i5 v* b9 `* X}
' F/ O  m$ ^) aint dram_init(void)# H* |" W) h& G- x% ?
{) I1 }. z& p2 Y$ H/ s6 c
        /* dram_init must store complete ramsize in gd->ram_size */; e1 E$ x1 R) \# t
        gd->ram_size = get_ram_size(2 I3 D) T6 w# [1 I( J3 i
                        (void *)CONFIG_SYS_SDRAM_BASE,
& O# E' |( ]/ j# P- l- ?" M1 S                        CONFIG_MAX_RAM_BANK_SIZE);
+ @4 L0 w) i4 i5 Y        return 0;
! }, x, b! _) [2 M0 P}% ~' b' j6 I' t

7 G$ v6 D* j8 y) n7 q% z; g9 N3 C. C! |& Z, r9 Y0 S( z
$ m4 u% Z0 v0 o$ E( @4 v" i

! u$ l2 c# \* d1 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 k9 D% L: O4 L$ n- [9 W/ E- T' w3 W' ]

6 x, T! P/ q, O% C( X4 q1 w
1 ?2 R5 z0 n0 k" s" S7 `





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