嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 n; z1 \6 P* s9 i& l- I8 E
核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 v0 \6 M* |8 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ p7 Y. G! F( l, o7 W# ^
# S3 u4 z* Z, k6 s5 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ Q: G% S' k9 d; K9 [3 |2 N3 i# k& S
( S! N$ S3 g4 Y# t4 u5 e, C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 |6 c# c. |5 x. u) K% l4 u6 T
/*3 l4 f& }/ ]3 M, A  r
* Check memory range for valid RAM. A simple memory test determines% a: o$ P2 z! }/ x& R' h1 H: G! P
* the actually available RAM size between addresses `base' and
2 G+ _/ [+ n$ O- u* `base + maxsize'.
0 A4 S1 N' Y, ^3 N* ~2 p- C+ `*/
+ R, q! i. V  `long get_ram_size(long *base, long maxsize)
  Y  z* \- z7 n- d0 b' }# w2 E{
2 @- t/ w6 x% W+ j        volatile long *addr;7 g  y- a5 s5 V' X
        long           save[32];
8 ?  y1 V# g. L  F( K/ y        long           cnt;- y; {, i2 L& o
        long           val;$ g6 q0 I" U/ S4 v$ L1 l* |# x6 g
        long           size;* M: G+ I: w+ O6 ?8 J
        int            i = 0;
5 W. }% b- y! Y1 m: n: ]6 H& g1 t! Y' N: Q* |9 n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" ^6 m* e! F7 S  U
                addr = base + cnt;        /* pointer arith! */2 {5 z1 _: N6 ^0 G2 M
                sync ();
! ^$ s2 `) H$ D) I* t/ o. X. t6 x& R                save[i++] = *addr;
7 g2 t+ V- i1 S6 }                sync ();' f( y/ \5 ?9 N: m9 z! X/ \1 |% X
                *addr = ~cnt;
" u7 e+ D+ Z# q/ n4 X9 @, A/ _4 j        }
3 ~& ^2 u5 }1 ?/ E) d& C( ^. h/ K
        addr = base;1 d+ {- [) G5 v
        sync ();
# \4 N- Y+ m/ L& Y9 n% i6 K        save = *addr;" K& p) Z, f2 }% C3 c2 D( {
        sync ();0 g# k* Q0 N9 K8 w6 P' j* p
        *addr = 0;
  j$ L, _$ P1 }4 y: j4 [2 j: A
! F: k% r: |" S$ P& Z# z4 I# I% r        sync ();% D- ^6 ^& q" j6 m6 e
        if ((val = *addr) != 0) {3 F$ v% [# f% \9 N) Q
                /* Restore the original data before leaving the function.
) s" o5 d4 p! F( k6 K4 e                 */' Z; k0 `- n+ _% M
                sync ();$ z2 z& u6 J6 n. J; c% w# _7 Y) u
                *addr = save;+ x: ]7 m# v* ?1 \# v0 h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, _- ]# C+ y  k                        addr  = base + cnt;2 t% P. Z6 h5 K; u
                        sync ();$ u7 y$ L: b9 s, _! ]
                        *addr = save[--i];
" P' i0 S' ~! B# V0 `                }0 u! c' c$ Y7 k( x6 S) B' z0 \# U
                return (0);
4 ~; f+ m7 a% p        }8 r* m  j( V' |, B  ~/ C

& e, F7 ?7 N* ^8 a2 B        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& L( ?1 ^4 L9 p- i+ `8 L
                addr = base + cnt;        /* pointer arith! */
/ B0 o# g( M0 f9 h% K! k                val = *addr;
! n8 k5 v  n0 ~1 O/ c: @                *addr = save[--i];/ {4 U0 [* ~1 F0 v7 D) Z
                if (val != ~cnt) {9 h: D. ~3 W6 a, w
                        size = cnt * sizeof (long);! t9 u/ `2 h: T3 ^  k/ h2 T( z8 ^
                        /* Restore the original data before leaving the function.
1 S- q' g+ \& [7 |) o6 R                         */& O# K! ^0 X' }8 J& t
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ q" Z! F! Y* X4 Z: [- ~
                                addr  = base + cnt;* s6 e, k/ @$ H( I+ ~( r
                                *addr = save[--i];
5 M# K/ {% X* [7 Z                        }
/ y; Q  ]& ~3 S4 O. n( ^' b                        return (size);
; K+ a9 ^% E- J8 f7 t$ G% F                }1 }+ f, V, l2 Z
        }* F# Q, J% h- Q1 R" y) x
. H5 x! y3 o* o9 A
        return (maxsize);
+ r" X8 M& M' Z4 Y2 z}
/ N+ Z" ^3 @+ j$ }int dram_init(void)
1 ]6 N4 J5 b) m2 w8 K4 c9 G+ d{
9 ?: m% K% s6 c) ~/ J4 y  Z, b3 t        /* dram_init must store complete ramsize in gd->ram_size */$ b8 ~9 l# v4 ~8 Y5 S
        gd->ram_size = get_ram_size(
( o4 G) s  e4 @6 D+ K5 s% t, }. P                        (void *)CONFIG_SYS_SDRAM_BASE,
5 X- n5 y1 ~/ g2 p, Q2 S                        CONFIG_MAX_RAM_BANK_SIZE);3 `& H! e. b6 }1 _- J  u  p
        return 0;
* b) r, \& V7 T8 Y% T}
1 C2 z# b/ d- N$ W2 J6 Z+ _* ]* r. U" d1 P/ @

( T" g  N) s1 ?0 l, c# i& `4 A. `3 b4 o! M, C+ T" N
' a- \6 z- G) s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 W$ D/ }2 Q4 V1 c$ {
; t  I/ K% T1 G8 Y/ W$ Q& q& q
! b8 h. B  u) z
& D, s5 j& q/ s' C+ G# ~





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