嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 J& Z8 T) r' F2 o% }/ w核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 C* Q$ n2 J  I2 w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- E' o8 I4 ~) `7 Z9 ]1 y
1 g& Q5 S6 H# W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% o8 s; Y$ u: S! I: w. T
) l7 X0 H6 j( I8 \7 x3 E" Q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* Y" I8 a1 ?: h/*. C+ d/ B; F: F' u
* Check memory range for valid RAM. A simple memory test determines
; q: y# R4 X  c5 x, |2 @+ b* the actually available RAM size between addresses `base' and" |; W1 ?! S6 Y' M. [. F
* `base + maxsize'.
! W$ c3 E6 J1 g0 y4 K) M3 Z; j*/- J8 d9 t0 W, i/ a2 G- ~
long get_ram_size(long *base, long maxsize)
: e8 _0 Y, y# u1 x' B- [{
- G3 E$ z. E4 ?' }, g        volatile long *addr;
* A9 [2 c/ f5 v' }) s; v0 P9 y) B% x        long           save[32];+ u$ B# C% W8 z. Y( @$ U; r* ]$ i8 c
        long           cnt;- c& M4 H/ v& ]1 y' L+ P  B
        long           val;
4 t! u+ I0 |  J8 X- _4 Y& x        long           size;
$ Q9 H+ m3 |2 h9 ^0 ?9 G4 [. K        int            i = 0;$ }' g" a1 R$ ]3 d

3 E1 }) w9 V8 Y( S& k+ q- E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* A$ d% t' ^: J0 z$ D
                addr = base + cnt;        /* pointer arith! */( ]# c4 ^4 W6 m: j6 j9 D
                sync ();
3 A5 v/ |' t: q) ~7 ]$ V; h                save[i++] = *addr;# [' ?( s* J# l, S
                sync ();- {& x* v2 t) _, o
                *addr = ~cnt;
4 k) l5 N, [$ Q  E        }
" Q/ M' _) G0 F- `, X- i" k
* `, O% Y, S( t) j$ i        addr = base;2 T" D$ t5 w9 b: F: C5 _5 Q" y
        sync ();  I: u" ?! N; u. Q( E- \
        save = *addr;
( y' @1 m; B/ v# v( o& q+ ?* c        sync ();
" t6 l7 L, ~6 L        *addr = 0;
& V" l) {% z. O7 Y( h: l# u* O& q7 d3 \6 f1 M
        sync ();
, b0 G% t* i% w! X4 |  p( t        if ((val = *addr) != 0) {
, \/ u2 ^: u% S( p: m$ ^0 L8 n                /* Restore the original data before leaving the function./ s  e6 _& L0 z  @1 T) c
                 */2 |1 a$ D" g/ r. g- D$ F8 ]# |& o
                sync ();
3 d6 Y  t( v; k                *addr = save;: k4 r4 x5 ]1 t+ _
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' a$ ]( t8 M( q* z
                        addr  = base + cnt;0 [3 A- A2 ^7 N# x. W7 L
                        sync ();
% N8 R3 a* i* p" L1 w& f# e                        *addr = save[--i];
3 C2 v2 X7 e* r# a  u5 x                }
* s' z: T' E* I* o& F3 z! c  D                return (0);
* G/ C8 Q1 |# u4 G, N1 z        }8 I& w  m+ r" L6 }3 F: i" B

; n  L* x+ y  }* b+ N5 V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; T: O: Y5 K# g/ ~# e                addr = base + cnt;        /* pointer arith! */
: B8 a- F7 a) K                val = *addr;4 k2 p1 H6 i- P& [
                *addr = save[--i];1 Q* a, _! y6 z
                if (val != ~cnt) {
8 N4 d" ?& ]8 x' ~5 o$ D                        size = cnt * sizeof (long);$ s4 Q8 ^# }0 s& A
                        /* Restore the original data before leaving the function.& A; y% M' H# z. k  j
                         */
6 `' J4 O- b- e- Q+ o                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ w- n! L' _+ o# E6 ^+ @                                addr  = base + cnt;- _6 ^# P( A8 l5 _6 J. ]" n6 D2 Q8 b
                                *addr = save[--i];
! y8 R; ?# \$ N                        }* u1 N! z" b/ g* e
                        return (size);3 j5 d* Z  ^  R9 s
                }
. {4 _) j  a; z( _' i        }: Z" u2 e8 U! u: S3 u6 [
0 i" y" e4 J2 G6 c3 y$ z
        return (maxsize);4 v# Y8 b( Q; y' l
}
* `8 J- ]2 G7 N' fint dram_init(void)4 ?: |  G* o9 P9 G3 s# l
{: G3 V; \0 r- G" k2 f
        /* dram_init must store complete ramsize in gd->ram_size */
* ?% a7 y: L% I1 X4 i        gd->ram_size = get_ram_size(" y& R' I% h1 N
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 F+ l! e1 c" j1 A7 \( G- x                        CONFIG_MAX_RAM_BANK_SIZE);
' |, x+ z6 x  e  G+ ~. [/ c        return 0;
6 D& ?* j8 Q7 g( H/ r}3 R1 N' Q8 F) q. G# S0 ~8 y; N

; {( b2 m3 }4 Z7 z3 [5 A" ?! d" R8 [6 f# F: }
) O3 ?3 d  a6 n0 \
! @2 \* A5 y) q: [; z8 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( J9 t4 X  P3 v8 A& F; ]( Y
! h% u3 U$ V2 q+ g$ I1 z* s  \1 c; j5 A& O
9 b$ d& f# B! X, |; a





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