嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" T# V6 i1 @3 V, t. X5 V2 O' T核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# F/ i' J1 Z7 r5 q, o/ Q  A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 h2 c$ A) J& ~

2 J* {$ L( o5 d- }! o, [+ F0 n是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- G9 z/ h. J% Y9 F
3 ^* Y7 e% I- R" a6 L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# Z/ \0 X0 U- }- L3 |, u
/** ^" P5 h4 D/ x2 W1 r
* Check memory range for valid RAM. A simple memory test determines
" A& v8 d4 k+ @' |* the actually available RAM size between addresses `base' and. L0 g- I+ n! k. P  T
* `base + maxsize'.# A4 \8 s( u$ v% x. c
*/0 ?" F/ R5 X/ C5 {1 O4 q
long get_ram_size(long *base, long maxsize)% t" Q0 L3 A2 K6 H: y
{
  w* t, @( p' r! }% ]) B        volatile long *addr;
6 H# _( O2 n+ m! z, {        long           save[32];7 t3 A, w/ w! x* Q8 ^
        long           cnt;
" {0 ?- g3 b* C5 X5 N7 j        long           val;5 i/ i8 z/ t3 h
        long           size;
3 U( r4 I1 ]1 O/ N, u        int            i = 0;) a4 x$ j5 J. F9 v3 k

* a; d$ }0 t8 g2 p7 K! ?        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 H5 u# s2 V% `
                addr = base + cnt;        /* pointer arith! */
" G0 u+ D3 O; m( V                sync ();1 p* |8 b0 N9 g! j8 b
                save[i++] = *addr;
0 a$ `$ z- s" D7 ~3 Q( J- y% _                sync ();9 i$ ~+ j4 R! y  v: t8 p
                *addr = ~cnt;
! W0 N4 x: d9 Y3 @% v& T        }
' g5 J2 ]( Z& S% G5 V
9 P+ Z9 N$ ^0 T' k        addr = base;3 d, m. ~! T( c* ], \, \1 ?- d
        sync ();5 N* r8 t  d# O# o, l3 H
        save = *addr;$ w7 r, Z5 \' b8 [4 O; i! D" y5 H- y
        sync ();
5 k6 [( T; j! o% J8 c/ `2 o6 t% D        *addr = 0;3 K1 e: M2 ~$ c9 Q/ f/ M1 n0 t

! x3 F! {( @5 v2 r        sync ();
5 M) R5 Q. F( J4 u        if ((val = *addr) != 0) {0 l% ?8 E5 ]" ]! Q, o
                /* Restore the original data before leaving the function.
  H8 @6 D) N* @6 |9 ?: r2 \: _                 */
9 W' p6 p1 T- J0 c                sync ();) b% H: b. u0 d5 w. d
                *addr = save;* d5 D9 k# d2 |+ ]4 \+ ]' Y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) ~& n* m( O5 ~7 C  M) n                        addr  = base + cnt;) w0 S4 b! [: L" Z# m  p; O0 J
                        sync ();1 n; r" l7 X! i
                        *addr = save[--i];
- q1 A5 n8 ^3 u                }9 B' y  i: p' W) Y
                return (0);
( d+ t0 M& e1 D: s        }
  @$ E) F/ S& d/ v5 {4 q( l- K( A8 A; r9 Q7 B; M6 ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  w! a  t2 k) C8 Y; d                addr = base + cnt;        /* pointer arith! */
  `( Q9 U6 N4 T0 m; S                val = *addr;
% e% g$ g0 z1 N( z+ x                *addr = save[--i];
% ~$ D8 g1 e1 y! w8 z9 ?                if (val != ~cnt) {- Y7 Y4 P1 U8 }& B( J
                        size = cnt * sizeof (long);; s+ _9 O8 T6 C1 z& ?5 F+ l
                        /* Restore the original data before leaving the function.
; b# N% u/ U; f: |, z" L2 C- ]                         */
) ^" K' h# Q2 h; w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 d8 F+ O! ]5 G  ~9 O9 ]                                addr  = base + cnt;
5 m7 n) @; D3 F: _8 [0 m% ]% i# `4 p                                *addr = save[--i];
# X" e, V8 x, I  L% O; w, m  L                        }
3 R0 m/ o( X5 p7 W4 d                        return (size);
: u5 o6 @; G8 m3 O                }
* y; S8 i6 W- W" @0 c        }
: B/ B& [# n8 F  [: D; W: M( M; G+ E/ E
3 T5 w2 ]) K6 a" ?- [        return (maxsize);$ W( f' l3 a$ b/ I& D
}" Q' q; s) H( A; _
int dram_init(void); w3 j/ j% t3 C6 I9 k
{0 p; F5 A) A* U9 z' n% |" |: b
        /* dram_init must store complete ramsize in gd->ram_size */
& a! I) Z5 p2 t        gd->ram_size = get_ram_size(+ }- i9 ^9 c! j5 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,
$ y; b0 L" r; a9 }$ |1 o                        CONFIG_MAX_RAM_BANK_SIZE);
0 Z) P& b- W, v7 Y1 u1 X7 ?9 s        return 0;7 |8 u1 d5 h8 L7 ~" H# v7 d
}
( N  n( U; f! X. Q& Y9 E8 j# ]2 W+ d5 ~8 L! l" \
9 K/ ]/ |6 y6 W  J) Z. Q

) |! T, K' y! h2 R8 F) [, T7 o) s1 @4 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 A0 e# o2 l/ m4 s3 k5 _- L7 D
. b: Q! U3 r6 `  U( u; Q# R

! b- \( e& u/ E1 M/ R$ M
2 x# f  J4 s. g6 K





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