嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. R% Q2 v. r* A1 x/ w, m% N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; @+ T& S5 R4 ~7 t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 z5 }$ c- n$ M6 Z6 \- B5 @8 l
6 o5 [/ S3 k8 k4 t3 M) L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  ~' B) R% g& e6 Z
% q/ [: C6 r9 P( K2 K$ C/ T) i. T4 [: ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 `6 Q4 b' s6 O1 f$ w3 t& Z) D/*
: e" L5 i1 T2 e! g0 `0 J* Check memory range for valid RAM. A simple memory test determines
0 O; c2 Z  L) j/ N8 q8 l: c9 p* the actually available RAM size between addresses `base' and
  }. Y6 n- D, H* `base + maxsize'.
6 l/ c: `& g1 K* }' a*/
+ B. G: U$ U" w1 x# z& rlong get_ram_size(long *base, long maxsize)5 ~  Q8 \' E# @# j
{8 X/ u4 |# U% [4 |9 |5 U5 S0 n# T
        volatile long *addr;! x4 |; f& m/ `* Y! N8 R
        long           save[32];
+ r& |3 ]* {+ h  E7 k) w. Z0 J        long           cnt;6 A+ O% y7 o+ g4 ?
        long           val;" V- W/ `8 o+ R; e2 t
        long           size;
& o" ?# L5 \! z" Q1 A        int            i = 0;
0 c# v0 N7 Z% m3 K% U  O* ~( v4 n" U3 F9 s; d  Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  ~$ j* Z& {* p* w9 o
                addr = base + cnt;        /* pointer arith! */; j- k' n% w  w+ |
                sync ();: a  ]& Y  G: B0 x5 ]
                save[i++] = *addr;9 C4 o- j- ?, l; {! r0 u6 U" h
                sync ();
( p  A2 C' t) I                *addr = ~cnt;
: K1 }5 O! a; U0 c; d' b        }
( W) O/ e: X6 W1 T+ D
9 K. i- p4 S. {6 X. j, j        addr = base;; @1 g2 N, {; C6 V! q
        sync ();( z* a/ z/ L# T- k9 W& z
        save = *addr;* c$ {) v% S9 {8 k. d% ?
        sync ();
! j$ f2 U" P: U5 I2 M9 V        *addr = 0;+ [  K6 l7 m) O5 T0 v4 Y4 A

; d9 j/ Z- j- R7 d' A6 N% v        sync ();+ \) w9 z+ R+ K7 O# Z
        if ((val = *addr) != 0) {& p9 ?( ^  n9 P5 q) w. k, s
                /* Restore the original data before leaving the function.- I1 d7 n( A7 h& J
                 */
/ `! s: d' f, ?' X7 \                sync ();
( A8 l9 W. u+ E' G' n  E                *addr = save;2 H% o  l7 M3 N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) I9 y/ m# v1 o; p  L  P                        addr  = base + cnt;# j) a6 ]8 W% u( K
                        sync ();7 q) j) b7 r+ Y/ ?: f/ P
                        *addr = save[--i];' z5 U$ n4 t9 B
                }5 L3 o+ [4 h8 S7 G  r
                return (0);; j) }8 I. h2 g; z
        }
2 U" D( i# u! K, v5 p4 ?! y2 c/ i5 ^$ Y2 Q
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ L; A' U8 }) T; d( k, [1 V
                addr = base + cnt;        /* pointer arith! */: V+ O) f! d% N% L' D3 S: n9 M
                val = *addr;
+ b4 ~! I7 J- E5 F7 @. I                *addr = save[--i];
" ^1 d  Y& V0 {+ N, [( ~3 I                if (val != ~cnt) {
+ q% f# \8 e/ w" k                        size = cnt * sizeof (long);% g, M/ {% T8 Y2 w; O' [
                        /* Restore the original data before leaving the function.
5 q7 P! @1 Z6 p9 ^                         */* j' v, J5 h2 q+ q- o! |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- G3 J2 q! a! r  E$ ~' d                                addr  = base + cnt;* K, H/ i6 D# g& L0 W$ G% S
                                *addr = save[--i];
$ X0 G* z. ~' E# \! T1 }3 Y5 x6 B                        }, Z5 w0 b5 a% B4 f
                        return (size);
5 Y  n$ M" N2 e$ i                }
5 N6 |- d! q" f6 q; k/ }+ r* T/ h        }
, _& v! X! a2 ^1 G7 X
) ]0 Y# |7 G1 _6 q" p) ?        return (maxsize);4 |# T, W( S7 `( q
}5 _8 G9 x9 p1 c! I% ]2 K/ E0 t
int dram_init(void)  w$ @1 k' P7 Y/ a* X' H
{! j, u* B) R6 W' x
        /* dram_init must store complete ramsize in gd->ram_size */
/ S' o5 M  V& c9 \# u        gd->ram_size = get_ram_size(" o3 K; }% z5 \+ _4 R; p
                        (void *)CONFIG_SYS_SDRAM_BASE,
" n4 ^9 B5 H/ N% ~9 M& S                        CONFIG_MAX_RAM_BANK_SIZE);
* v. ?/ n  @+ Z        return 0;6 X! t  w5 N, `) L) z: u* s
}
- r1 X! ]6 l1 [9 w
( S% |& }; c# ?2 _  [/ x$ z" G0 `5 C; D+ x# [5 Z
. z8 m( V2 a1 Y( @4 P& d

# x3 t- y. X8 X& {+ E9 Z# JFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  Q) q; i. D3 x

& X! v8 T! Z3 j4 d2 `0 J' q
. ^4 R4 U% |9 C+ K+ a4 g5 {; a. K
8 }  o5 ]: j2 Y1 _% K





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