嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 h4 e2 P6 ?: s核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 P! D" A% d) k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# _4 x: v+ `! T2 F- j3 n% f1 o( S+ c( V! s. \+ W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 G3 G% T! O2 W/ G' M$ C9 v3 R7 w6 J  w. w8 I# E) e! p; m: r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ I9 i) }& l9 V" ~
/*4 O  n6 H" [" @& `; u
* Check memory range for valid RAM. A simple memory test determines
! w( z" z1 O0 o* the actually available RAM size between addresses `base' and
) C+ ^% {& J) ]; n4 y- f$ M* `base + maxsize'.# I1 N# L( K1 B& Q  q- I/ r2 d4 w: ?
*/
4 l. }$ q$ a5 z; A  ]long get_ram_size(long *base, long maxsize)+ e- f1 I# L$ V! F; B2 k7 G1 a
{
% z9 `4 I: o8 I4 a1 X        volatile long *addr;" @8 i$ a5 O  m0 V. [
        long           save[32];0 Q- t' A  O4 Y, c
        long           cnt;
7 w2 p$ E& N% W+ P. w. {  @        long           val;* k; G7 p& x7 V# y
        long           size;# `0 R* G6 L' v9 X. |. |
        int            i = 0;7 n2 a. a" E( ?
  {/ h! K8 r( j" I& @8 g
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' Q8 P2 [4 h8 \: R                addr = base + cnt;        /* pointer arith! */( I; `+ H$ K3 S
                sync ();; L$ i* p/ K( `6 V) i1 }
                save[i++] = *addr;
9 k3 ^; P* ]* v9 a                sync ();- q# a8 F6 Q; z- c
                *addr = ~cnt;/ t5 B/ W0 T& e2 g
        }
0 M* D% ]) |$ r3 y7 i* d. s6 ^9 K1 C4 Y
        addr = base;
5 j8 |4 c9 s+ ]4 s        sync ();
' ^1 C  h* Q( I2 ^7 ^/ u        save = *addr;7 I9 z/ P0 O) x% N) ^5 T. u
        sync ();" u$ \% Y% T  |1 l6 J8 ]9 O6 f
        *addr = 0;. d0 J, \; a1 M: ~7 u0 D
  z7 k4 v) M# z
        sync ();
1 ^1 z$ |: H- ^) v        if ((val = *addr) != 0) {( j% e  s1 ^8 _8 [( J
                /* Restore the original data before leaving the function.' T8 g8 Q  T$ m, l4 ^
                 */
) u; \( x+ W& H+ S. f% [- y                sync ();
6 o8 m1 D5 D1 B* d+ Q. C4 \; N                *addr = save;
& \/ p$ m" t& L0 F+ _( G: Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: b- J# S& N2 k                        addr  = base + cnt;
+ ^  j: D8 o8 K# M' a0 h4 W                        sync ();
/ ?6 [) ?" l$ `& P3 n* x                        *addr = save[--i];
6 w4 p' z7 G: W                }( b  \! |! q% @" r8 ~2 J
                return (0);: c9 r1 v' n# u  n
        }4 l+ u  ~3 k. U& @) z8 Q. b8 L
3 t! L- k9 k3 \# Z9 ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: ~& G1 B$ g8 ^
                addr = base + cnt;        /* pointer arith! */
3 h5 @* [, `1 k& ^8 m2 W                val = *addr;' l$ T3 o7 m2 ?. l2 ^- G
                *addr = save[--i];1 O/ [8 g) N+ y3 t- Y
                if (val != ~cnt) {. k; ~8 d: ?/ o7 I2 S, ?. c
                        size = cnt * sizeof (long);
4 H8 m  M' \! i: J                        /* Restore the original data before leaving the function.: g( L( q6 _7 x) W1 m4 c$ }" `3 Z
                         */
9 g, N& `5 f9 J  j4 N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" e4 |/ e2 s3 u                                addr  = base + cnt;
' U# q3 f5 y- Y                                *addr = save[--i];  w( X- _- y% O5 v6 J
                        }
- E! T9 F0 t3 x+ S* z                        return (size);1 t; E, h/ ^3 L  ]6 E* P& c- v4 o
                }  \  {5 M/ v" \$ a$ s
        }  f# _( ?) \7 ^3 m" e+ x0 c

" f' F2 c* P# L$ ]        return (maxsize);
) _: q; r( W# E& U6 f- o}$ x  B# H% @( f  e. q8 q
int dram_init(void)
! G6 ^/ p0 X  s  h  d/ [) v' w{% T3 ~7 w, F9 t
        /* dram_init must store complete ramsize in gd->ram_size */
% b4 |$ Q1 V: ?4 Q/ R        gd->ram_size = get_ram_size(
. }/ q) m! _0 l+ P8 y, ]; C                        (void *)CONFIG_SYS_SDRAM_BASE,
+ f' ~" l" c5 C. ~6 A                        CONFIG_MAX_RAM_BANK_SIZE);0 ]/ R# a+ B9 R" s$ g! B- |
        return 0;
7 z& U1 G) y  d# X% }% D}8 f* `# ?- X4 X$ r: m7 g* _9 T

9 O9 U/ k4 o9 ~$ i9 s- T
* t) q* D! M2 o; z4 F# S/ i) e
& i0 s& `# l, l" j8 b. P; a$ J4 g2 F3 {' a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; {" r: A) O4 M( q7 V  K9 I0 s
* e+ X, w+ T/ H4 |

) z: Z0 p' V) }( \, |# Y




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