嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 P: N4 N  T2 C  K4 ^9 R* c$ @核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ z+ R- \+ X% I1 N$ J  {. T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; m" e2 _6 w7 c! v0 d9 A0 L
' R1 e. |4 s7 C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# C7 |9 G$ T# m% f
( V7 b6 L! X. M& U5 t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. y- p. N0 h  z! T
/*& N/ K" \7 o( b. x6 f1 H
* Check memory range for valid RAM. A simple memory test determines
# I8 }- o. k$ J7 m1 j! q$ C3 \  F* the actually available RAM size between addresses `base' and
; @7 F8 B7 Q, @3 V4 D  |9 ?% `* `base + maxsize'./ R- Q0 J" B; e
*/  J) E. t. u! h9 V9 g
long get_ram_size(long *base, long maxsize). W& y5 R; b# m# z: I
{( |, x0 h5 w1 A. ?+ g1 h
        volatile long *addr;
+ ~' {- j7 z; _  D+ _# Y4 N        long           save[32];
  f" J! K! f- T. @- M        long           cnt;
9 x- C5 A+ h  C* M: W2 ]        long           val;
% x: e$ l6 `  g7 s8 p! p. s, g& k        long           size;
) C% z+ e* C/ f; f* w        int            i = 0;# Y' V3 Y; j- L7 A" z
8 h0 M" H: B2 M
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) g. S: s1 B- G                addr = base + cnt;        /* pointer arith! */- D5 r0 a6 o4 @) f
                sync ();
' i% z3 S3 Q  r4 E- J8 x* j                save[i++] = *addr;
- Y" N8 I2 C' g  T2 }                sync ();
: W7 t) j" E" B5 r/ s8 r                *addr = ~cnt;
. B1 m* i/ z) G; V1 U; H1 g        }
( B) o6 o  J6 Y1 |% X' N$ x- T6 [6 W9 S4 `2 o
        addr = base;* [, T+ {, }" ]
        sync ();
# o6 t8 n- Z" |3 b9 Y        save = *addr;1 j# r8 W! A* K) L( x+ b; U
        sync ();( x) l( z, s0 w; O& j" v6 o1 d
        *addr = 0;
! {7 {. L) ]& Q( d! f0 F  j" K3 ]8 J! m, }
        sync ();8 j  c! `$ t3 V; M2 ?
        if ((val = *addr) != 0) {" }0 L6 u7 ]& J) _+ i$ b1 M
                /* Restore the original data before leaving the function.7 d6 ]0 V$ S1 W% l" p
                 */
- ?; z  n7 Q% c& a0 h4 [0 V                sync ();" ?: B; x: I6 I
                *addr = save;2 U+ S5 Z0 u2 a: t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; [6 Q/ @2 c1 s/ Q+ [0 L5 u
                        addr  = base + cnt;
9 M& j( Y+ E" ?% ]0 r) @! @                        sync ();
6 Z5 I+ A7 i, F/ E- E& {5 {: i                        *addr = save[--i];
& @1 h6 ?- Y1 I6 O* V                }( |7 w8 L5 v6 z3 q
                return (0);
4 A2 H0 i/ x6 ?9 A# N4 e0 I        }
6 T/ l( J5 M9 g4 W: h+ z
9 a) W' A2 T& H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ j2 M& z' C8 E: y
                addr = base + cnt;        /* pointer arith! */
: X# c) X% T2 j4 i# R3 {                val = *addr;& P  {* d( O4 t% m& D9 O) a
                *addr = save[--i];
  g1 b0 T" R: ~6 _. n% @4 C4 ~( B                if (val != ~cnt) {6 Q5 c, ~4 c& l& _5 }3 H
                        size = cnt * sizeof (long);* `1 ]* U9 f# f* G* P" n; Q- `
                        /* Restore the original data before leaving the function.: Z4 i+ ^' }, I' v$ `5 M% s# Q& u
                         */: |' C% l- f* i6 n0 X( I- ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& V1 x5 I# _$ {                                addr  = base + cnt;
7 G5 F; u3 x! M                                *addr = save[--i];
% f7 u/ \. B6 z5 N% k                        }( q& k& @0 [8 w' Q- k6 k
                        return (size);2 }# \- e* K6 |/ m- Z
                }9 R8 j! b% s; B5 L. C
        }
% \8 T" J" F% s$ J' h9 @
' J& _5 b3 |/ W        return (maxsize);) H2 A" I9 O$ i, P
}) g4 ^5 }8 g1 o6 f
int dram_init(void)
3 ~) ?6 X. v: M& d{
& K. d/ R% O8 {5 \- B( b) `        /* dram_init must store complete ramsize in gd->ram_size */0 c5 a6 O# @7 y' \
        gd->ram_size = get_ram_size(5 o& w/ e5 z/ E; _$ K
                        (void *)CONFIG_SYS_SDRAM_BASE,
- i/ f. a( g( c3 j                        CONFIG_MAX_RAM_BANK_SIZE);/ Y/ e. [* u- o
        return 0;
4 w# O$ n8 u2 Y, h. l# u6 r}
$ J. K) L3 W9 ]3 w9 i: r7 P% a( l& H, }, \5 a
* v1 e, k# G# I6 Q% O
) X3 F; l/ `9 g& P" B5 k
" A" ^3 O' U/ p) ^/ c: |$ f7 N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 h3 y* x+ W& ]) c
0 E8 N& ~9 k5 `+ o+ t! c$ `1 e2 P8 i

% B, T3 e5 l; M; A9 _! w




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