嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 A: `  E/ r) F- K0 ^2 B6 b7 t7 ]
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 G6 E# C8 h  ^0 u4 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# s( l$ P% @3 o  k& Q5 k. @( v2 X* X& Y$ P. M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" S$ Z' p' Q% c9 U0 D3 V' a% U
0 a5 m2 D$ Q3 F9 F4 }3 C' G
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  g9 H% b2 z. _5 B1 d, S# x
/*& d7 m! w) w" _! R& v6 K) {
* Check memory range for valid RAM. A simple memory test determines* q  |( g  O" b6 c& d" e) V: r
* the actually available RAM size between addresses `base' and5 P1 G7 c2 C0 `
* `base + maxsize'.4 o$ X2 X) t' ^5 I
*/
  d6 `! G% e1 k& ~$ xlong get_ram_size(long *base, long maxsize)% I% r2 I" v* H, R0 ]
{
3 A- y' K: _" ?        volatile long *addr;. d* ~. h3 J8 m- S4 r) V: b
        long           save[32];
2 U4 e: ?7 z3 d* ~3 O        long           cnt;
( N- t; T4 l9 X! P5 J: X  y        long           val;% ]; Y! a5 y) r9 m% F
        long           size;
/ b3 H2 E1 T% ~6 Y9 H$ A" P! g        int            i = 0;
0 ~* M7 S. @9 X, @. G: u& W1 t
5 Z' {% f8 R% o5 R. z3 s5 m( Z8 ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" S4 E! v3 Z. l
                addr = base + cnt;        /* pointer arith! */
) C( ?& w0 T- h7 J                sync ();
/ U3 q/ Q* N4 i/ D; {4 t                save[i++] = *addr;/ I* ^$ D. R' U8 a) ^  g
                sync ();
# G, s5 x" T  d) R; {                *addr = ~cnt;. z" u: D  R' N& x# k: |1 o% b
        }
: X* W0 v. V; S# U- h
4 G" B, A; F" b& t1 C5 j: u        addr = base;
6 v$ [% O- v$ Y+ W        sync ();
$ ]! F; u! z$ h7 {3 y2 C- }; k( V" Z        save = *addr;+ p; |; y/ v! t. f
        sync ();
+ B: Z# C% V8 g        *addr = 0;
- g+ X( c: R# p( o- ^
6 o& ^' {  I; v2 S+ f: e8 q        sync ();& x6 h, E7 U1 e: e" A2 t8 C
        if ((val = *addr) != 0) {# u: E# U1 k6 X$ z% t
                /* Restore the original data before leaving the function.0 v1 c! S; G  Y, I
                 */2 `% N0 R; g9 R* r: H+ _3 u# n
                sync ();( _' |& [2 q% z+ V
                *addr = save;) d1 m" T, |$ }. A$ v" O! ?& E0 E! V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- C8 `# B' F1 {7 R: {
                        addr  = base + cnt;( a# c6 n4 d, H/ W/ u( Z( Z& `& L
                        sync ();
5 K0 l, A% {' g8 _4 E# B& [% Q3 x                        *addr = save[--i];
( h5 N* w4 y' A8 \- s$ s1 ?1 d; }                }2 C! x) |4 P; ~- N
                return (0);
3 i! b$ E- C/ a# G) Z4 `  _        }
7 j# d* M8 h$ x. D, c8 O* B
  b! z0 }1 ^9 |9 p4 Z' ^6 v        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 b& D& Y: K) H! l, k9 [: F
                addr = base + cnt;        /* pointer arith! */
1 y6 y; ]. M+ X7 {0 ~" ~                val = *addr;& E2 o2 [: p2 e9 }! d& w8 N
                *addr = save[--i];- R7 V! G4 W4 F: O  F+ S$ c
                if (val != ~cnt) {
. C' I3 \; L9 m  w9 I: a                        size = cnt * sizeof (long);5 l2 e5 z6 w) \4 G& \5 F& f9 q7 R
                        /* Restore the original data before leaving the function.% n4 R: ?% M7 g
                         */
4 k$ Y1 D9 v0 i: T8 y/ D; D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 c' e% u0 v* p3 W( E7 p, a( S
                                addr  = base + cnt;  s+ L! a+ A3 U' T0 L
                                *addr = save[--i];
+ \6 [( l. o$ b& P, E. [                        }% E# T& ?! _3 J( r& Y5 d
                        return (size);
/ k. Y9 G( ]' q                }
# I* L" S) D: l) d9 p2 d8 O' E        }+ P/ z7 |; D7 D! |6 R

; N* @4 k; u0 m# K# V        return (maxsize);' S2 v9 l5 a. A2 T
}) V, q7 e, D# y+ i& T  r3 Z7 w
int dram_init(void)2 Q& D$ c$ ?& n4 K+ w5 m% W
{
& Z& z- e5 J3 h! y& N6 W9 \8 ~        /* dram_init must store complete ramsize in gd->ram_size */
; j( P  N+ ^, x! F7 z& q        gd->ram_size = get_ram_size(
6 e0 n2 V7 Q" i+ C6 H5 t                        (void *)CONFIG_SYS_SDRAM_BASE,+ |, w$ G' i3 C* k
                        CONFIG_MAX_RAM_BANK_SIZE);
3 y+ l5 Q9 N0 ]  o        return 0;+ B. v2 a0 V3 k; a! o; T* i
}
  s5 |$ o7 f, D4 ^" c0 V! o: R4 I  V
& z* Q& p" y! N! V1 P; C* h( ~6 Y4 j

0 Z4 |1 B- J* w+ f! A
% {/ q) a6 [8 mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" v  y- w9 H5 w9 Q

: j7 C  C# j/ w4 a+ }/ H2 E$ c9 H2 h  y( P  P8 H. E0 a7 B
' i' c) c0 I5 ?; A$ M4 }- Z1 U& z





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