嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- D) g# t/ n- [% M& I# s, ^
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 I- x% v, R( k6 K' c+ {5 b  L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* e6 n. U6 ^: N" b! g9 ~9 Q4 ]
0 B/ }2 ~; b7 ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; M" x& n/ [1 T" y; a5 w9 H5 _

0 D0 F, c0 Z- Y, N! L$ c4 I) H
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 ?0 ?, ^5 g- q: |* t2 @/*
5 y" w/ a5 L& Z% B6 `  f6 v* Check memory range for valid RAM. A simple memory test determines
2 g! E+ Y% \5 [) K' O' R: ]" d* the actually available RAM size between addresses `base' and' D( c9 J. x# v) \0 Q
* `base + maxsize'.# r* G  Z: U1 g5 f& H* u
*/# D; J/ h8 q* Y! j6 e3 N. D% c
long get_ram_size(long *base, long maxsize)
) Z8 r3 C" B4 V8 \; O{
$ Y. l1 {( Y! ]& Y( n9 c, {        volatile long *addr;
. i) w- L( N4 }* u& j4 K8 A1 w/ N! y2 i        long           save[32];  ^3 y3 r+ e8 C/ q, c
        long           cnt;
! F* j! P' F0 h: N0 Q        long           val;2 S: X0 a% T) b% z
        long           size;$ h7 w. _2 u+ m0 D/ J
        int            i = 0;4 C' @" C2 F" P: E5 k" h0 W' L+ Q
7 i* D% @5 M" a9 B/ }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 N6 f& O+ N- @
                addr = base + cnt;        /* pointer arith! */
- @1 A9 @8 O# I2 b4 u                sync ();: f7 F% g8 z6 Y. T* Z
                save[i++] = *addr;( S% F6 @) M# w& }  m
                sync ();
( V: A, M; v8 A' E1 F4 ^                *addr = ~cnt;/ {3 ]* F0 o, V/ U; B! {
        }
( r0 X& q7 B; a* F
" D' G9 D0 X3 ~: W6 n) L        addr = base;
  D7 k4 o7 Y; T$ i        sync ();
5 g6 N# \* G+ V4 W# e        save = *addr;
1 N& v% g0 W1 n6 C/ ?; u3 H, q        sync ();2 P" q2 F2 |' s, [
        *addr = 0;8 ]2 X, f' s5 v1 x( V5 ~0 R

5 D/ O/ x/ P; j. \  n        sync ();7 E5 \& e  I, o* e0 E0 N. E# ^
        if ((val = *addr) != 0) {6 p/ H6 q, c8 @+ ~4 h* X7 U, u7 I! Y3 |
                /* Restore the original data before leaving the function.5 ]' g( q0 ^! k& q6 O
                 */
( x/ ?, o5 m1 a$ R; I7 {1 r1 t9 L                sync ();
6 b# d5 M" `, H5 Q- @' f                *addr = save;% |7 w6 D9 ]- M) W" r7 T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 s/ y: R4 R; R+ p+ |- L, i                        addr  = base + cnt;# \, F) [8 ?# s
                        sync ();
& S  y: L# Q: `' O# W, b                        *addr = save[--i];- d6 t: D+ ]+ {# U1 x$ n/ Y
                }
+ B8 Z, c% b8 j! D  S6 D) S: [                return (0);
* s, @( x8 @8 _. @2 n0 L        }0 f, d/ p4 [1 E& g! b$ S+ L9 Q

) u; ]! S! y7 m' ?! L& Y. t        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m4 B0 q8 i' {1 c) Q% X                addr = base + cnt;        /* pointer arith! */
6 f- ^- G5 _( k) T. ~" O- M                val = *addr;
* r9 v! I( ^4 X3 [; _/ P' @                *addr = save[--i];# r/ g3 c0 P# o7 Y$ ]5 y2 U
                if (val != ~cnt) {
/ t8 p8 L( X' _  _                        size = cnt * sizeof (long);0 w3 E* K/ a1 l0 r% Q' F& y3 s
                        /* Restore the original data before leaving the function.
$ I, z" L" p7 j$ m, Y. f2 o                         */
4 K. c) b# Q! }! g/ B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: P9 D0 h0 _; |- [: G% J: x/ }1 L                                addr  = base + cnt;
6 k2 A1 W( h/ W* K, {                                *addr = save[--i];, M, T" Z3 B  k+ ^
                        }
1 l. ^' }+ x; ?7 |; S$ P                        return (size);" N" M& O9 K% \/ T
                }
4 Z% g3 R( M6 r9 b( N3 B        }" ?: x: X8 z! V6 s- s; ?8 o
1 V; @* ]: r0 b: S6 q
        return (maxsize);
" e+ i+ ~7 z/ b7 d. v" y( w4 d8 @}4 `6 R2 z+ q8 O/ U8 `& q
int dram_init(void)3 ~& i1 U: `, M0 F2 L8 ^
{& Q2 h3 f' w* h2 Y  P5 `5 u
        /* dram_init must store complete ramsize in gd->ram_size */8 |  k  @2 X6 B+ S8 i
        gd->ram_size = get_ram_size() T  b' @. c8 Q7 T& R9 I
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 r* w/ }# @( y                        CONFIG_MAX_RAM_BANK_SIZE);
8 F# P( u' C( q4 H        return 0;
: l9 V; p' Q1 E1 }1 Z}9 s- g+ J) M  `9 ^8 Y# S2 U

8 ]1 q% e) ]4 p% ~4 i5 b- `6 ]" t/ {! y* f  K* Z# h' f3 H

; I5 C# `* r# ?7 ]" o/ p4 K' {$ h5 i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 {( A/ W6 }( T- [  m4 |

. L1 y; k5 Z0 {
% Z8 Y2 S6 i. g2 }+ O9 n3 k

# A' V6 u  `# H. d5 I




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