嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 W- {( _/ K7 C8 O: s) h2 T8 q核心板2:DDR2 256M Byte   NAND FLASH 8G bit! ?+ B/ _0 ]3 i  E5 p2 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, W. @6 T  w0 Q) Y4 B
) c1 E9 y3 v3 g3 |2 j2 v: E% h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% K+ m- N! j1 n/ C; r5 O
9 m% \5 y; m6 p

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. [: O; V+ k5 P7 ^/*4 T4 C# @' ~3 V# L  D0 o
* Check memory range for valid RAM. A simple memory test determines
1 b$ ]3 A6 ~5 R( V, v7 o. S* the actually available RAM size between addresses `base' and
: N. U4 G1 @0 e4 {8 q* `base + maxsize'., M" o0 Q  j2 B2 Z$ \: U  @
*/2 o1 _. Y9 C! _9 |) h% s
long get_ram_size(long *base, long maxsize)- [" e# w; P+ `: p' F
{
, @1 I0 n. f, _. u9 p* }        volatile long *addr;
, _! S, g( _, D! L        long           save[32];6 H! h; M; a- n) b1 e
        long           cnt;! s, y& Z9 n$ b/ z1 g& }2 T9 D' v1 y+ ]$ ^
        long           val;* z/ B- W+ Z/ `" l0 c4 p: `
        long           size;  `' @, ?1 t# t" b& ]
        int            i = 0;
0 f9 G) L3 _8 e1 k: ?0 V+ J! m+ }" P  ]9 ]1 x* y" i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  V% l) J# X% }0 d9 p' e  d+ r) w
                addr = base + cnt;        /* pointer arith! */
3 O1 L$ b- d, I: X+ c                sync ();$ J+ s- ?( o: J4 u4 @/ M* B  E
                save[i++] = *addr;, W9 ], Z& e, g
                sync ();
. r: P# y2 z9 H( c7 z                *addr = ~cnt;0 K- Y0 l8 L( n2 s& h. r* X
        }
; t( ^0 c6 l" \' z% O7 t  [3 L# H: o
        addr = base;
. L- \% H( F' `1 i, p        sync ();8 i" J& L) _1 S$ s2 B0 X
        save = *addr;' x' O, w) F/ {: p
        sync ();
) r7 l9 Q! |+ L( N# }) C  D        *addr = 0;
1 Z5 |' t7 D0 q' i) F, K
4 E! G, [/ y9 K! O6 |2 E: J        sync ();
. U4 N  v( N2 h' t) Y) k# @        if ((val = *addr) != 0) {; }# r/ d. B* P4 ^; A* I3 D% g
                /* Restore the original data before leaving the function.+ t+ J5 ?3 @1 T# ?3 s
                 */. A, v& ^+ [9 L
                sync ();
3 |/ `& t0 ~- n9 X% c                *addr = save;
' c# ~& X+ e, y6 T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" e2 ^3 ~5 }3 F# L
                        addr  = base + cnt;
! k3 z- A4 r- _0 q4 X7 G                        sync ();
. e3 z: _" Y7 a8 e  k/ S                        *addr = save[--i];2 ]9 ~3 @' Y( v
                }
' U* c: o6 W$ V* t                return (0);
9 l  `. O4 N) h: q7 C1 c# \        }5 ^  M- p2 Y1 K! C4 |9 U; n1 j

5 Q' {, l0 P* [6 I4 p/ s+ t- {* n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' g, C  W7 G; N7 X. D                addr = base + cnt;        /* pointer arith! */
. D& _0 |# Q) Z& o  \3 N1 H                val = *addr;0 J) V. u( U, P" }! B5 |
                *addr = save[--i];
  T' A3 B  t* s: f% H  G. F                if (val != ~cnt) {4 Q: L' m4 X' W
                        size = cnt * sizeof (long);
5 W% B* v. ^; X8 l: }$ W3 `                        /* Restore the original data before leaving the function.
. p" w: M; ~4 @7 G+ N1 u                         */
9 n3 s7 V8 e) z4 {8 e9 O9 P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ U- @2 G( i& r1 c                                addr  = base + cnt;1 j. J5 @; I& L" d9 s7 n' E
                                *addr = save[--i];4 q9 O8 {7 e1 Z& X: \; t
                        }. n% N! v# S. a+ w1 h1 }5 E) e; Q2 ~
                        return (size);" R1 Q) ^! v$ Q+ i, }' ~
                }+ G; i. d! W: y  W: a
        }
% X7 l1 [3 @, \( ^7 Q
: ?8 w, }$ ?/ ^! l        return (maxsize);3 w* P0 u5 x- D9 V: `
}
; i1 q( G! ~3 {$ m0 n. `+ Yint dram_init(void)/ ~+ s4 E  V6 u" s
{0 A. }7 v* i5 I; C% h9 Q
        /* dram_init must store complete ramsize in gd->ram_size */, B+ K8 b  h: E" g  s2 m% C
        gd->ram_size = get_ram_size(( L& d- W' K9 ~/ ?
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 D- S' \2 z% D: s% C! g  ]  n+ F                        CONFIG_MAX_RAM_BANK_SIZE);/ ?3 j6 X% A1 Y0 }/ c4 z
        return 0;
" m# }' W7 g, l; a5 {6 {}
* X8 X! D5 H& s6 T- v; d* X
! ]3 O1 r4 g( }, p
$ t% G1 t3 Q: ^' I% Z
1 ^% j: [7 j2 R9 P" e( H* U) @/ t, W3 i* ?8 y" c* h# I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 M7 }% q6 m* o
& a4 v+ y, P1 X. J

/ v  a& e* S9 R0 ^. L

) H# N6 J5 e( }




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