嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. e( g! w/ [/ s; j* W% p  x! L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ W. i2 S2 D  `1 @5 ]' _) a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. }; y) K9 E, ?$ {' s+ Q$ Y
3 x# d, i. d) Y2 q( q& @7 ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 Q( {1 d  q9 N5 F
8 C9 ]: A7 F# L
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  e  N3 T3 r# c! D  o
/*
) Y5 m+ v8 O) P0 K+ k* Check memory range for valid RAM. A simple memory test determines  y3 A0 V% q9 e
* the actually available RAM size between addresses `base' and
; @4 W! U" L- t4 |- D7 r" M' ]* `base + maxsize'.
: Y9 J) i7 z. C/ U1 Q4 @*/
: N/ [# I  L6 a* m8 L0 j- t% b% jlong get_ram_size(long *base, long maxsize): E6 S- I( |% \$ `. r
{. n+ f5 L# a& L8 [* M4 _
        volatile long *addr;2 E) Z8 B3 g8 P
        long           save[32];0 B8 ^6 C+ f! F
        long           cnt;
4 R- s! ?7 w  o3 [! M: n( A        long           val;
/ \* A% m9 |+ X) ]        long           size;
* K3 {# u4 O& x' w0 H1 o" d        int            i = 0;
/ G! X9 o7 E$ Q7 O8 H& k6 K1 E5 [/ F, b5 z5 m, N. I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 s2 g6 r, ]; `! K9 }                addr = base + cnt;        /* pointer arith! */; m8 k" a  e. J  K$ h/ W
                sync ();& o8 ]2 Z- K) l4 ^
                save[i++] = *addr;
9 W- G2 b# k3 d3 y6 G                sync ();
: V: y" y; S$ t$ H0 d7 x                *addr = ~cnt;' N" f$ @$ y, @5 H. T
        }
$ r0 O8 M1 s8 |) m& j" x0 u) ]0 }3 ~0 a5 z  z
        addr = base;
/ s; h" V% @; S# `& D( u  L        sync ();' ^8 y, o5 z- p: Y( ]5 h' [' B/ G
        save = *addr;' r8 o/ {/ b0 x# e4 a0 m3 \
        sync ();$ I- m$ {$ F' `1 o3 v7 U) [" A
        *addr = 0;$ _# t6 S$ r/ B7 H6 q. g, j6 U0 l
: C" t: y& ~9 P; y
        sync ();! M0 L, W7 O9 G7 T" D
        if ((val = *addr) != 0) {6 o$ t0 _# V6 c
                /* Restore the original data before leaving the function.- o' p3 g$ z+ d' C# H. m" j( V
                 */. i* C- f! D4 z* Z  n: c# U
                sync ();: X% A% [/ q  ~% t6 I( |
                *addr = save;& y- _& v+ {. z5 P2 w6 q' ^7 N6 B  `3 r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 ?/ _) Q" u4 ]% @                        addr  = base + cnt;4 [0 x' p: X3 G) l5 i5 \/ ~, L
                        sync ();
+ @. X) x$ J5 @1 x& v$ r                        *addr = save[--i];0 X9 _/ o% f4 g7 X* _6 R$ x
                }2 s4 ~& b, v+ ~% e9 h- f; v
                return (0);
7 P+ J% ~. ~; w; U        }
% B, X/ d0 v: u6 g
( J3 {. C( A7 m# B7 }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' `$ V* K/ I: Z. A$ O: o& t
                addr = base + cnt;        /* pointer arith! */
+ L. X6 j! q/ [! a                val = *addr;
! R0 X% G: l% h) n0 q                *addr = save[--i];
8 j, d! b2 W  Q/ n                if (val != ~cnt) {& J- x9 l( H$ B. N+ Z
                        size = cnt * sizeof (long);2 E/ L6 \; m' s2 c' `
                        /* Restore the original data before leaving the function.
2 l( Q  U9 U" p                         */
- U+ J: A1 H4 z8 S                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& {2 O, E9 e. V6 ~# s                                addr  = base + cnt;/ n; j, W4 j6 T% n" H, ]$ ^$ a
                                *addr = save[--i];# e. S, _2 L& G
                        }
1 \, J. j5 \% M1 B7 _                        return (size);
, |; i7 @7 |9 A                }
. n2 }, i+ ?; U% A8 T0 _        }% Z3 N* s1 G+ t4 x  H, {2 |, f( D

( {! Z3 `: v# v/ B* w# w" H$ @        return (maxsize);- W1 D2 ]7 _5 k& M" a, g
}/ q0 x# R( h7 a; x
int dram_init(void)7 i1 n  h7 \( j; K, g  k0 U; [
{
  I' G$ n1 i+ y& c5 U        /* dram_init must store complete ramsize in gd->ram_size */
' J% @, y$ T* |2 D5 Y7 u! P) L        gd->ram_size = get_ram_size(3 N8 K3 \4 v7 X8 e2 ]* K
                        (void *)CONFIG_SYS_SDRAM_BASE,. g2 A. e; m- a; P! J' i
                        CONFIG_MAX_RAM_BANK_SIZE);
# ^" y2 @. Q* N2 p1 f0 A& p7 u! t        return 0;
( v9 @+ P1 `& L0 V( u}
* |5 J- i# V2 ~7 N% v
5 M2 ]4 m5 j% P+ _! R* W1 ^( K/ K) J0 M, m4 F* V

( Q4 @7 V9 v* d+ P( w, w' ?
3 d  g; \2 R1 F& tFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" M8 m1 X" u% h
" D" C7 a: E; N; w* Q2 ?2 W9 }

, D7 j  M" j! X1 H4 ?9 ^6 i




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