嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 c7 d3 n0 X7 g& q  L5 ?+ V1 l' ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- m% d% R- {2 m+ S1 \# g7 F  C这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( x, d* s. u0 u) ?; p! i3 }5 ~. o4 f6 k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. s0 c( n& h8 w" r; K; S
% ^, \% A4 n  k. \7 _2 O9 b

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 v4 S, {2 v" C+ u) D/*& c& M$ Z) Q. V! x0 X3 |
* Check memory range for valid RAM. A simple memory test determines
) E% M6 J. }% E* j. `* the actually available RAM size between addresses `base' and( D, j$ J1 Z1 |& `! ]3 x
* `base + maxsize'.
4 z  P, M) a, K. P*/
; _1 o0 o2 |4 b) N/ D, xlong get_ram_size(long *base, long maxsize)
8 ~6 w" d1 z( N; }{+ d  E# n6 e/ D7 @4 L
        volatile long *addr;
& w6 d- t, T0 q5 C        long           save[32];
( e- Y# I" ^. p& e        long           cnt;7 S- D! a1 i4 U4 |$ M" F: Q. H
        long           val;
. h5 ^/ \8 S  P2 M/ ~& w% G5 \        long           size;3 B4 [8 W* R) e, U8 C* ?. v
        int            i = 0;; ^* O, B' u1 K1 R

3 M& D( y2 f: C! k; `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  N2 ]. V' a' U0 y' x$ t; J
                addr = base + cnt;        /* pointer arith! */. p  U( \# s1 T4 S) |$ x# y, F( a
                sync ();
# [2 G, a6 O# o6 k5 E- T" {$ W                save[i++] = *addr;
# r" i1 v0 U3 E, X( \                sync ();" W3 Q$ C2 _5 [, B; f3 {
                *addr = ~cnt;
" m! T( t2 W* s4 J$ R( f" u$ y, b        }
1 P# r: V- H, k0 Z. }
0 W2 _7 y' z+ S' K: c        addr = base;
% u0 r! J: f3 U! ?. O, R        sync ();
# ]1 _! H  i( ]) }/ j        save = *addr;% s; I/ Q& Y4 f  y& X) V
        sync ();
4 ^8 r! D4 o) y5 B        *addr = 0;
, }  R2 K5 s$ T8 [3 h' ]! a
: s* i$ E! K* H, W) u" H7 u% W8 Y1 `        sync ();( M; d; H& k# k
        if ((val = *addr) != 0) {
, U" Z# @7 m5 I) J: n                /* Restore the original data before leaving the function.
2 J1 Z- i2 [4 |! i' N2 ^                 */, W' M  u3 t) v% u6 r* L
                sync ();
% i+ a" \9 w" o% d6 i                *addr = save;
2 c/ }" \' X% E% O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- X) y$ {4 C3 W- x  S                        addr  = base + cnt;, H$ x4 l. J: r1 a9 N
                        sync ();
! G  p* T0 l5 R; P, U2 M" z& A                        *addr = save[--i];6 W! _5 Z6 a; r  t: n; L; ]% L& g% A
                }
2 P! C4 Q& X* s3 D/ G                return (0);
, h* K8 r6 e2 H1 y        }6 {! w+ c. Z- t7 x8 K. z
& O3 }9 }3 @. _+ `7 m  q: N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 B. ?8 d& }) L+ Z( ?9 S: w
                addr = base + cnt;        /* pointer arith! */
8 P$ E* r# N3 ?; e" e+ ^                val = *addr;% ]: d, i) e1 V, Y/ n. w$ X7 B5 w
                *addr = save[--i];! l1 N8 |/ |( u2 i7 N' c* J# \) @
                if (val != ~cnt) {4 {! q# R" g8 S3 V: M& q
                        size = cnt * sizeof (long);) o' w( B: o! i6 U4 j& {
                        /* Restore the original data before leaving the function.
5 S: q; [& R& J3 [1 M* e                         */
' B: [' ?# s1 X; k, E9 P: N                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( G9 ?3 ]* H) s; u( [                                addr  = base + cnt;. ~- k+ X) V  e8 `8 `
                                *addr = save[--i];' G9 n; M+ r  N- ^. n4 Y& B
                        }+ a! x" `9 Q1 x* D7 n. c# x
                        return (size);' x# g$ r/ a* b$ n4 E$ y0 `& N1 j
                }
/ F- R1 ~1 s: ~5 P/ u        }
6 R% e* E( `" t: c% {" [, B, ~4 z, N. q. }/ f0 X( l. u
        return (maxsize);
: e# O! t( U- N  O( P( W( S}
. U5 N$ O/ T+ Rint dram_init(void)- i$ w! v4 N7 F% R. F
{
/ k. c& }' X4 ]! |' b) u* R; k        /* dram_init must store complete ramsize in gd->ram_size */' t$ m. p, x- ~0 W
        gd->ram_size = get_ram_size(: d2 h* U1 l7 q+ T
                        (void *)CONFIG_SYS_SDRAM_BASE,2 T. P! u5 B$ @% B2 H8 l2 ~( d* Q
                        CONFIG_MAX_RAM_BANK_SIZE);+ q; n: ~2 i0 i, t* G) B' O
        return 0;
8 @* W2 q2 B! B& ]}
, X7 o" S5 c5 |' ?) X
8 \& ]& |' \6 {, q: B! f4 \
, f8 _2 H, P% K' `8 e# h0 V/ ~/ ^3 ?* V- |9 ]

. J# w3 q  j& S) rFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) `5 g3 e" s- q4 |# n2 ~, a$ X) q: m0 `( t% _

, I/ B) Q' ]4 f' ~
  g% a/ |2 O2 I





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