嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% N$ ?( Z7 e3 o5 R  ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit: g% V9 q2 G6 s7 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: _& k( D. f/ P5 [' N
  Z5 F. Y$ [2 A  `) l是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. r& O$ D7 J8 P! ~9 h- P' Z. L: }  B0 w: s( |; S) d$ w: l3 R, Q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  a- A: i) d+ ^/*8 R# \0 z: A5 Y$ H3 }
* Check memory range for valid RAM. A simple memory test determines) n% Y  z! k' B# X9 O7 G+ f
* the actually available RAM size between addresses `base' and9 m% {$ B/ r( L
* `base + maxsize'.0 R# P# h: f$ `" l8 v# |" R) S# J
*/5 `" v2 u2 G" h9 \
long get_ram_size(long *base, long maxsize)
6 ^, b/ m+ b# d{  ~) u( E( \8 P$ s7 q# Y$ a
        volatile long *addr;, f. b1 l: v: a7 V  E7 q3 G
        long           save[32];( v) S6 j0 w" L
        long           cnt;9 ?! }. N/ D4 X1 Y% l4 o3 V
        long           val;
) j5 v. u8 M8 j& k% B$ U        long           size;) p( f$ g+ ^$ H' d0 f% z! m: D
        int            i = 0;' B1 R- ]7 K/ W+ s) Q8 m* @

9 j- X- I8 q4 e$ N1 T6 c, k- ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ ^" u3 h+ l0 ~# B9 q$ `
                addr = base + cnt;        /* pointer arith! */( i& `6 X) h; P' k
                sync ();6 w! R" [. s: D4 R
                save[i++] = *addr;* I' T! J7 Q$ g+ W* C' F
                sync ();
4 l1 }. J2 O, |( j4 U                *addr = ~cnt;. b4 ^# W- ?4 t4 l. l
        }
) s0 l$ Q' b" a" T& Y# k% W% Y" X5 M  {- r* t* g0 h* f
        addr = base;3 Z: |# S% }: A: H
        sync ();, V6 q  |* v' X5 l
        save = *addr;8 N3 V, D0 G: r$ E- `: j1 O! N
        sync ();
& Q* S, N/ E6 ^0 V" S- _        *addr = 0;- |+ J. x7 c/ y3 k" M

: H1 Q0 l* s; b4 M6 l; k        sync ();) O7 a4 p; \2 f
        if ((val = *addr) != 0) {
2 H9 H% W# |4 K                /* Restore the original data before leaving the function.
7 g: }" S' t1 r                 */
- H* B6 N/ ]7 K) M; B! X3 d                sync ();
) C- M" B* l9 |! `+ U                *addr = save;, R) _& L+ E) T0 P# V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- C; j: P2 ]& ~* z- b  L
                        addr  = base + cnt;  w' c# c! f) l- R; @; U! i
                        sync ();% p, k7 J$ E1 v8 ?  }& W( [5 W9 C
                        *addr = save[--i];9 D' V6 t6 z7 X7 s8 k
                }& M5 K6 Q0 D4 |
                return (0);3 u% v" E+ d: e9 o1 `( P0 I
        }
+ P8 `2 _- `2 ?
1 M. \$ O5 J7 S; k) M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) N& k' o& w3 r: K/ k" y# R
                addr = base + cnt;        /* pointer arith! */% Y( T$ b' g: q; `, F1 b
                val = *addr;
( e$ f: F& ?+ V7 H                *addr = save[--i];
/ T- X* _# }! Q# d: W+ s' |) u9 _4 ?                if (val != ~cnt) {: B' w3 ]+ ~3 e0 S3 E+ U! I
                        size = cnt * sizeof (long);
1 i5 p/ w; j) b% M2 u                        /* Restore the original data before leaving the function.
2 C* Q$ c) O+ e# u! \7 J                         */
! w' E3 G* Q1 X& b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 o. w& `: a1 T8 e/ s
                                addr  = base + cnt;; r# [- L/ B6 z6 T9 a9 O7 z$ D
                                *addr = save[--i];
9 R  T% C6 I7 K" w- P                        }0 w# }5 [2 k6 J% g0 T! P" x9 {
                        return (size);5 ^; T: p8 }( Q" `: c: P+ t
                }0 L" M- L9 F! ]) h5 G+ s7 M( z
        }2 J* k, T/ a1 V$ q. Y; X* F" b
% u4 ]5 J) G3 F  P( Q
        return (maxsize);7 H$ A( z3 B% d* l
}
  s1 ^& S2 \5 S. o: Gint dram_init(void)8 c4 P7 o( W: ]7 n
{
; R) r% T' Y/ e        /* dram_init must store complete ramsize in gd->ram_size */
; S, [! ~+ d. R( b( c        gd->ram_size = get_ram_size(  x, B% e, c; q- K
                        (void *)CONFIG_SYS_SDRAM_BASE,
9 k( d# c9 t( V( b  J4 _& h* o4 T0 T( i" o                        CONFIG_MAX_RAM_BANK_SIZE);
+ \7 ]( f) \$ m4 D; L        return 0;6 G! x( r& _4 G3 g$ w
}
8 {- r% C6 ?: J+ D: G
$ G; \  q7 w' Z, B* b4 G6 O3 a. K+ j; Z$ h. j3 H

- R" Y- U/ v( C6 u: d2 h# P& _$ c; A0 q" {2 |1 C* {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  I1 b! n. E' y8 e! t# u
  z  d4 J; ^7 z! L

& |; R5 r/ T# n; K
) k: n: x' C" h& T0 I& o





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