嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  ~7 k7 Y6 l! |% ^/ g: i4 D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; N8 f6 A  |' i9 L% I这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 B; g7 w6 [9 ]* d9 V- T& o
# |, i+ H1 @+ b# @) M, ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 Z. X9 r7 h% v1 n  k4 _& B6 Q* k$ g' H) Z: ]7 u! r. r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' \( `% S% g) z/*0 G7 Y  J  W: W
* Check memory range for valid RAM. A simple memory test determines
9 o9 [; D5 T/ H& u. @* `* the actually available RAM size between addresses `base' and
2 b! R% S+ I8 K* y8 U) F% f* `base + maxsize'.
$ `$ Q6 u6 Z, t9 L3 Y*/
1 I* X9 p$ j' l6 j6 @6 @7 ilong get_ram_size(long *base, long maxsize)
& S: r. k/ m0 M  Q) y{
) D3 W) v# S* g: q8 d) H        volatile long *addr;
$ ]" k, d' z; i) G! h6 m# W        long           save[32];0 u9 N0 b6 M+ [& p
        long           cnt;% k7 ^% j% w7 h2 n  `) A; R
        long           val;7 n- U8 j% z$ d$ W
        long           size;
2 V5 w: K- m6 Q/ g2 f1 N/ S2 m        int            i = 0;/ T9 U: d/ O6 x: f2 }

* z4 F. l; a- |* q. C$ Y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 g2 d- @. M  Q$ ?5 @
                addr = base + cnt;        /* pointer arith! */
+ ^1 X: Z. X6 I8 k$ [# \                sync ();9 F5 b  f4 a' i$ c9 i9 |
                save[i++] = *addr;, ]$ H4 v7 f2 G
                sync ();
* C7 A. Z5 X9 \  _8 Z7 H0 d. l                *addr = ~cnt;* y- J& O  A' P4 `0 K; }/ _) w
        }% O# q2 z' C# f0 D, G
& q0 z6 ~9 t$ E, ]( b
        addr = base;# q, O* X# X, o& g/ d. C- }
        sync ();6 v; X6 g4 x1 B& S) S
        save = *addr;
& E- J2 u: n7 I1 }* O        sync ();
9 v& u3 h* b  }( Z- Z8 Q        *addr = 0;
/ H0 M' T( s0 k5 G! q/ @, L9 Y) m. K& J8 o! H
        sync ();3 \# ?4 e, x" O. ]8 i. l4 L3 U$ g; Q
        if ((val = *addr) != 0) {( v  P% A" g9 V0 Z# Y" ?- y$ Z
                /* Restore the original data before leaving the function.# H' V% ^' a3 A
                 */
7 s4 Z" {- V$ M* X                sync ();, g$ O* ?( f* p6 `$ A
                *addr = save;# h; r  u+ ~  J7 g/ ^7 `2 u6 }1 n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, N3 n% X! W1 g/ F1 \6 `                        addr  = base + cnt;
1 _6 E: n( K( l$ v+ ^4 f                        sync ();8 L7 V4 O; V6 y# B" P
                        *addr = save[--i];- o) X- S: _6 b( M! j5 L' K" w
                }
9 Z& _& x2 u3 I                return (0);  C3 x1 F8 x4 v' S0 k
        }
% |; y, z3 m; X  o% N. _% `$ \8 U$ u0 o% R& l7 H0 r& [
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ {" Y! ~, k5 ~, b4 J' g* ~  {  D" X                addr = base + cnt;        /* pointer arith! */
& U) j; R% }) |3 N: T1 \                val = *addr;% R# B) Z% L6 d& f, Q
                *addr = save[--i];
  _/ e, F/ H& w1 n& j                if (val != ~cnt) {
0 n$ Z1 l9 B$ e                        size = cnt * sizeof (long);
# u8 S# u4 X& V2 d                        /* Restore the original data before leaving the function.
4 N5 a* W$ }' r9 d5 Q                         */3 o5 {9 f7 |  G
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ _, U* y# T3 J! R# v5 x                                addr  = base + cnt;" L  c# u0 u, X/ B" @# g4 A
                                *addr = save[--i];
5 T) }. X" C% t  {$ o! G                        }( l# ^' w' [: f6 f+ f( C
                        return (size);% o1 O/ D0 b& `1 a+ M$ x' }
                }: p" f/ a( p* w% ]
        }8 I, |% x9 @6 o* k0 `+ A
8 w- ~2 X, p6 G& L3 G5 c2 M
        return (maxsize);
6 |2 }3 Y# N1 ^' f1 O}6 J( U, }8 d: \6 K
int dram_init(void)8 t7 {( E( b0 e3 q
{
# W) e1 Q( k1 [        /* dram_init must store complete ramsize in gd->ram_size */5 J+ i" ^) H; a9 x' {; ~; {
        gd->ram_size = get_ram_size(
8 V# ~  |0 E3 W) b" N' N0 K/ d0 ]$ y                        (void *)CONFIG_SYS_SDRAM_BASE,
2 J2 ^3 _9 P& t4 S4 ~' V" t, h                        CONFIG_MAX_RAM_BANK_SIZE);7 u  H' ?) |% [2 q. F4 `% X  U
        return 0;* u" }( G. S: D% }2 X6 _
}
/ |1 ?  ~" G5 Q' b7 B4 _; D) p' @
- n5 q3 s3 G" S5 F6 p, x

7 O8 v9 i, E8 T5 ]( W8 `5 d6 G, [  f$ S$ I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* T- u* u: t% O& U0 v! y5 a6 z
5 c6 `2 O3 ^0 d+ B7 ]8 f; q) ^0 c/ M) g7 y) n; h/ j

! i2 d+ h! [. K  X( l5 z7 {




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