嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ ?0 v3 @/ z  E; c& z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 C: @: s" _! q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 b% B7 N/ l" t" o7 J" w
5 k' j% G2 ?$ t% t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, _9 ?* W# _& z4 t% e
" g* g: Q) l& r, ?7 |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 L7 R0 o; i% U( h/** v# i5 `; q( J
* Check memory range for valid RAM. A simple memory test determines" E: ~, D! d/ T/ p, y8 n
* the actually available RAM size between addresses `base' and
9 l5 |4 d# w, I: f, D' l* `base + maxsize'.
% f4 r9 q7 {8 w" b2 m' E7 ~1 O*/
" |- a  j. O  o% d0 q3 |long get_ram_size(long *base, long maxsize)
/ Z6 e. @2 [! ?% x% L$ S{
/ Z. Z, _" c7 Y$ ?5 n  Z. _6 F$ H        volatile long *addr;# m7 \+ \4 l2 C2 Y
        long           save[32];
4 }3 z; X; H- ]        long           cnt;4 S( F, x6 C& f& I8 [" n
        long           val;
3 S+ |  h- d( x. q  i3 u        long           size;
7 d4 J9 `; M; ~; v5 _' w        int            i = 0;
# @1 s) R, B+ j
2 u1 b, Z# H# W' t7 p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; Z1 K4 X- f) U                addr = base + cnt;        /* pointer arith! */6 \! ~# l" r, l. \
                sync ();
6 {0 G4 t) f) M6 _: k/ |, j                save[i++] = *addr;
2 K  g4 O8 J1 f                sync ();
5 o3 v7 z9 W& z, B6 G$ S. S* Y7 s                *addr = ~cnt;7 N+ M' ?6 h- |: B
        }; ~0 r) U1 p0 ~5 K$ o4 E0 }  l
+ f9 ~" Q  l' X+ `* c- p3 i" j
        addr = base;
& U# g9 d4 Q+ B8 E        sync ();; \1 H4 f8 K3 w
        save = *addr;
6 |/ b1 K2 v* _3 _+ ~/ a( ]        sync ();
. x# N$ b- s5 M$ ~* V        *addr = 0;, C$ y% o- J- v/ z( A  w$ N' C
5 u+ M( |  B* C8 M
        sync ();8 R# Z8 p& B+ h! q
        if ((val = *addr) != 0) {
  O% Z, E  e' ~4 ~; ^                /* Restore the original data before leaving the function.
8 T' y9 ?8 @" c4 y+ m* x+ [                 */, c) ^! ?6 r) d6 s+ ^9 k
                sync ();
  u+ J9 i0 V# {                *addr = save;0 N. }" N" D+ H& f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* R+ r, _8 Q9 U. M* V) p1 u                        addr  = base + cnt;
( D0 J( `& V! s) E& h                        sync ();/ ^8 l6 K( H1 o, o
                        *addr = save[--i];: C# ^! X* ]0 l7 N, g# \
                }6 i4 X- [. O$ n/ F
                return (0);8 Y5 w" i1 g5 N
        }
# W; t3 x* b; N. @1 B' K2 C" D' e& Y! |
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 K3 K5 J% u7 X6 Q2 Y+ R                addr = base + cnt;        /* pointer arith! */2 V* x! B2 [! \+ D
                val = *addr;4 U% I, V# J8 e8 n, R) |
                *addr = save[--i];  h( t) q, l8 D6 \5 W& [/ ?2 w4 n
                if (val != ~cnt) {
2 b# `2 i$ |$ {) }2 a/ @  E                        size = cnt * sizeof (long);
7 m, x0 i# w; j* Q) F' m8 e) ]                        /* Restore the original data before leaving the function.. ?! E* W+ o4 y& I3 N' k
                         */
% a) m7 X( g% ?! \0 j; F7 w; J% ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  R; }; |) I5 w/ I  i$ w9 D$ U* @1 I
                                addr  = base + cnt;
6 F+ F9 _( D, E0 E, j  z. ]" x& e                                *addr = save[--i];/ ~. @4 E% D) [
                        }
6 J9 x/ x$ Q* X; r+ Z1 c2 m' X. L                        return (size);6 E( Q, |9 M9 j6 w
                }% e! E5 S3 [+ ]. x
        }& \4 O8 R/ l( r
& z9 P; W$ O9 X3 |" J
        return (maxsize);% t, W/ R  Z+ @6 n2 g0 K. }
}% i3 L. |# `! X  e
int dram_init(void)
" C+ C% U' l8 B2 u9 g{
# w- J% I& W  c, ~1 ?        /* dram_init must store complete ramsize in gd->ram_size */" O5 x4 \' q6 \2 y8 I3 q  ?
        gd->ram_size = get_ram_size(
7 |8 j! ]  _2 r1 {9 [( ?8 Q                        (void *)CONFIG_SYS_SDRAM_BASE,
& H! }# A4 T* t* ~/ Y1 M- h* N4 \                        CONFIG_MAX_RAM_BANK_SIZE);: {5 f7 @( l" o1 f( }
        return 0;
* T! [. N# J/ ~, u* F, k9 N- S  s}
1 h: e7 [7 P  ^. `$ z* D
* N( ~2 C1 [# a8 n1 Z8 ?& p* i9 j) i9 ]- X

7 r# z, o: Y/ Z! h/ N4 T- e3 Y$ h6 X& L) O2 m, H2 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 r" y; W! v! N$ B. A0 E" B: T! }! L
) {+ Q' x9 u6 b6 l+ H
$ q4 ?) a+ Z$ m  m





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