嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* L4 P  f4 Z: b
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 L% U, ~* }7 V) Y6 q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) o1 Y1 y( E2 V# d

; \0 e* _1 U6 D- M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ y6 b- D( t5 h
/ u9 T' G2 W/ \: x0 |

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& F& q) ~; o% W9 `( S3 z
/*. s9 L/ ?1 y' y) P' f
* Check memory range for valid RAM. A simple memory test determines
6 ~7 p" D  p$ W, P* the actually available RAM size between addresses `base' and  Q$ A' U( l2 ]' c! ?
* `base + maxsize'.
- V  U5 h% t% v( r8 L- D2 K; C& m*/& O) ]# p. V( @$ Z7 T2 Z7 o
long get_ram_size(long *base, long maxsize)
* H/ n2 X: y& D6 u+ \{4 b. P' m# Z' `2 S1 c3 _
        volatile long *addr;) _/ @! f$ b3 u7 m( O: A- i
        long           save[32];$ g# ?! w0 x2 @, Z
        long           cnt;+ b$ x) D4 e' p* l; Q8 T+ L7 B/ k4 ]
        long           val;' B' I4 N: U5 f0 ^% B
        long           size;, }; a' t5 E' o/ b2 Z8 `3 X
        int            i = 0;
3 n9 w! [/ O/ Y3 b- a. l& N! m8 |% E, ]1 _! S
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 W5 A3 C% T" q" X$ Y$ M5 Q                addr = base + cnt;        /* pointer arith! */" y2 |1 o9 t# Z" t+ ]1 }, \) C+ P# B
                sync ();# E7 ]$ ^8 W* J- Q7 z2 H& T& r
                save[i++] = *addr;8 I& K" ^$ t; [  l3 v1 W* {3 F
                sync ();
: M& ^( V0 Z: U/ E5 |. N$ ~                *addr = ~cnt;
$ L. q& P$ w- [        }
+ @' z9 r# B- a7 P
; {2 k% k3 Z% w4 o1 G3 a# h        addr = base;* e! A2 e' c$ X' V3 M3 U" f" C
        sync ();2 @8 u) x# A# a5 ]: @6 N4 Q& X+ r: X3 \
        save = *addr;0 k; @8 s/ m  O; F
        sync ();
4 ~# ]" p9 M$ W( s% s" h. d        *addr = 0;2 Q+ P$ W: r+ u* @" @( f3 ^

5 M0 f5 r) e5 H        sync ();1 l) ~8 D& c2 O$ t9 b
        if ((val = *addr) != 0) {
9 `: k$ Q  z, L& Y# A& e  C( A" D                /* Restore the original data before leaving the function.
$ N- F( c: f' Y4 H7 U6 c                 */
5 w2 o4 t, E" ]3 q5 L6 ~1 w                sync ();) k$ E  b: m- K. T/ _2 x9 _
                *addr = save;% n/ {: @/ m4 N5 x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! Y6 b: b/ J/ g# r% d3 c, P' o0 |                        addr  = base + cnt;
* q0 Y+ f$ n  N6 e+ _                        sync ();
7 P2 u) E" \) A1 _. ]' n( o' s! o  f0 j                        *addr = save[--i];1 F$ C# P. [9 `8 m/ @5 T' B
                }# t7 N& A8 i; p# b8 C2 b9 h  j
                return (0);
" F+ k% J/ ?/ G9 Q( ^7 u. E        }
' H' f) W8 L& x2 o: C
; U, x4 p' ], @- C; B0 I. y( |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 w" ?/ }( n% p                addr = base + cnt;        /* pointer arith! */2 R9 Z2 G9 s- y
                val = *addr;
# C3 L/ C9 G' u$ k' n/ u8 \                *addr = save[--i];+ ]; q3 z2 C6 d1 E* |
                if (val != ~cnt) {1 Q" O5 w8 h0 `& R2 M
                        size = cnt * sizeof (long);
* T3 J1 |: b7 M: W  Z                        /* Restore the original data before leaving the function.+ n/ T' D- h4 H: N, r
                         */! `* Q! Z8 s+ J. W3 \# k' |/ R
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. l; L- ~( h8 ]- \6 V& r                                addr  = base + cnt;2 g' s7 d  r7 p. V, N8 F) a
                                *addr = save[--i];
. b7 g$ z* O$ c                        }6 [+ `& q- D7 N' A4 F, |
                        return (size);5 f' y3 ?# s" r1 q1 K. i0 I
                }. M+ B+ {5 W; X( e6 E* E
        }
9 j( m% k' O: T8 D0 e" t) o1 ]3 U6 ^! k
        return (maxsize);
  E" }, K# z  |# C7 _}
) h1 i1 B! N6 fint dram_init(void)
: `9 K+ l5 U. z( C# N: d7 ~; g0 ]{
6 _& W( [6 P  ~; |! F3 _        /* dram_init must store complete ramsize in gd->ram_size */
  _( d2 }# {$ z; g& w        gd->ram_size = get_ram_size(
, h+ ?8 T6 ^2 o' i                        (void *)CONFIG_SYS_SDRAM_BASE,. |- |8 Y# R3 B
                        CONFIG_MAX_RAM_BANK_SIZE);
* @6 b4 C$ p( v, D/ u4 t; K        return 0;
+ ]" v1 k! y6 c( ?6 t}  X5 p) v- H2 Q
' }8 K1 y; u8 _! L
: Z, w* ~9 ~5 o8 M

, F7 p" V: v% L1 [* p( J+ c, P
7 R' s8 J' Z5 K( k, t# zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% q- u6 K0 a2 z$ y
0 m" J5 \2 B8 a+ h; U6 I3 a% N

2 x- o( ~4 I) K7 K3 b% D
! k. g% O9 W9 t% Y6 T' S





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