嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 z6 H( W' ]- A  @1 @$ R) W' B
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( k: C5 h! s# E( q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- o2 h$ |  {! Q/ E6 c. n

; K" Z' s' G5 O! `# {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. i" ~7 N; R( O
& Y! i2 H1 @: s5 e6 q; @- }

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% n# ?' i! s6 d4 c  R/*# ^$ ?+ O2 C# y$ |& f  X
* Check memory range for valid RAM. A simple memory test determines
+ T/ @* `4 ~5 _6 n* a2 T* the actually available RAM size between addresses `base' and
/ r7 g2 H: P/ E& |* `base + maxsize'.& P7 [. k5 q" J  j
*/
5 D  n' I% k) @7 qlong get_ram_size(long *base, long maxsize)
) R/ Q, d  O* s% J# Z- h{3 j+ A! ~  z8 Q  X
        volatile long *addr;: J# l$ k2 v) [! ~4 g
        long           save[32];
5 q$ W" u4 U1 s( e        long           cnt;
* h+ O2 v$ u: t( x! q) w: b        long           val;4 Y0 S& i  T8 B% u& X0 P
        long           size;5 C+ L) ^5 a" w0 |
        int            i = 0;- `3 x8 I# M6 A2 W. O# U
- s6 E6 ?7 _" u3 Z
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ F( m. `8 t$ o. `9 ]8 j                addr = base + cnt;        /* pointer arith! */
  B3 _2 w' Y$ A4 c                sync ();+ G/ W2 M. O, H  l! X: M
                save[i++] = *addr;' e2 b. T. }. W. s+ X9 C& x1 V
                sync ();
# X9 q! W- ?3 \+ S9 {% T/ h) _8 ~& y                *addr = ~cnt;. Z3 e9 P* ]! b% W
        }$ X; v# [7 n' S: V- p) M' H

9 j: i# y5 B( N* P        addr = base;
8 v; h) w  l7 t" W; K7 E, w9 g        sync ();9 b. e  l5 {8 c# T1 Z. @
        save = *addr;
3 e# _. V, m8 ]0 H; w        sync ();/ J2 W2 \1 |; l7 c1 U
        *addr = 0;( N' o7 O8 e$ X7 e/ d+ y
  F0 ]% @+ R4 R) @. {! c
        sync ();
- t' f- _6 ~; o# t: m6 [  b        if ((val = *addr) != 0) {! ^5 h0 L. k! J9 Z, _8 Z
                /* Restore the original data before leaving the function.
7 N# u" p- F5 J                 */; X0 ]& C9 `8 I4 i) f
                sync ();) U5 i/ ~) [2 T' n
                *addr = save;
  [. T% g0 Y5 C: F* R4 t4 L                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ g9 |8 S4 z1 D7 @                        addr  = base + cnt;3 ^. k! O) X* u+ N: Q$ _
                        sync ();4 Z3 t- y' x, J% z) d
                        *addr = save[--i];
- S( v. g: V- j                }, p9 `7 ~) Y2 _) d
                return (0);# i7 v; \1 I. K8 M# i. g
        }
0 m# \) u% P$ [! ~; [; R" [( M- q5 C/ M7 z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# a2 B3 A3 H) k7 R                addr = base + cnt;        /* pointer arith! */
: l3 N7 v- C( Q) J$ E                val = *addr;5 P  a6 \" R+ {5 x' c# N$ g
                *addr = save[--i];8 z3 g4 i$ f, m/ ?; p' N7 {
                if (val != ~cnt) {7 z3 o+ R2 n3 y& U/ ^( U# T( \! f
                        size = cnt * sizeof (long);
5 g/ I" p: e# Z0 D                        /* Restore the original data before leaving the function.5 ~6 W; P3 k( Y8 \
                         */
6 k* g- k1 m) J2 w9 e  c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ c* k5 z  w9 z8 t0 v1 O6 ~: b( d# H) I                                addr  = base + cnt;
5 T  ]# {* D' X( w$ b/ D                                *addr = save[--i];) V' C" U2 W# e
                        }% O4 R+ R  T+ p# e; d
                        return (size);( c4 }  h  E" S9 U5 M; D3 W, i
                }
- `9 l6 ]3 L* N9 j        }" [4 [+ }9 B! v; t. M  [

; J  L' j( F9 I( t        return (maxsize);
$ ^4 e1 @6 b( L5 |; J5 h}
& r4 b3 N) X4 I* H0 b  B+ {2 [int dram_init(void). q  G, {9 c1 `7 c1 \% _
{9 T; c) C% i: S
        /* dram_init must store complete ramsize in gd->ram_size */
' t7 }5 R+ d+ V- r        gd->ram_size = get_ram_size(; b5 C, y2 q: W% u5 {% }7 j
                        (void *)CONFIG_SYS_SDRAM_BASE,
; k" t8 F8 p2 `4 S( b6 E8 u                        CONFIG_MAX_RAM_BANK_SIZE);' v! l: t' {1 y* b; `3 w- w
        return 0;
0 T/ O  F6 U  k+ n9 ~: I}
2 S5 X% J  j; e' l% [5 g, y1 z* N
- w9 {. L# x. ~% {3 y
2 d% k0 {+ o6 {( B  U  `% K$ b9 v4 q+ p6 k' U# @, E

, S' ]9 M9 c/ p! ?( E& nFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. c8 O" l& v; r$ j. v- B
+ R+ {9 ?4 p2 E' e, b

! n- P2 O5 {4 q8 F6 B. S8 }9 E
" y  n3 C- f0 Q2 b& f8 b: Q





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