嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 Z, g: F  y5 _. k" z  a+ G6 y) o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( _6 g# [3 A0 Y0 g; j% ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 g- f9 T; P. J! O5 Q

3 d4 ]; u. x" n" T: v/ P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  F- H# n4 P! g' F/ d

- ^: K2 d4 `; y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 N, x- q4 U+ `3 ~# W
/*
5 ^* F* F6 t$ j* [9 `) u$ c* Check memory range for valid RAM. A simple memory test determines# v; T. {  J" z# X% d1 i7 C
* the actually available RAM size between addresses `base' and
+ e2 b  ]6 Q  f* `base + maxsize'.
. R- @; |( H, i+ E*/
  O. D: W9 T3 ilong get_ram_size(long *base, long maxsize)
3 z! h/ ?# ^; J  ~$ L" E{1 Q& @0 M2 I) x9 L4 c( T; S- h
        volatile long *addr;# ~& ]# Z6 _) i$ O% z+ y
        long           save[32];
( f# E6 ?7 v6 M5 a0 H- \# i! z        long           cnt;5 R; k' l; u: N( o0 J
        long           val;
; M4 Q) E% x) \" X+ I6 X# Q/ y        long           size;8 g5 z7 V! M6 I( u
        int            i = 0;
* U' b& D% p. |: T- D0 l# V
0 W( L7 p- E/ e* `' V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( T4 M+ P4 o, Z# s( A
                addr = base + cnt;        /* pointer arith! */
! q& h$ q2 t& _) w                sync ();& Q+ W9 Z2 ~# H7 A8 M0 X' t% C: J
                save[i++] = *addr;9 Y: }; E* o$ C
                sync ();
& ]7 s* @- G' {, n                *addr = ~cnt;4 C/ c; n3 h  F# U  G5 o6 L
        }+ S3 A8 [3 `* v3 \! ~9 L5 l

3 P) I* K; G, k3 P        addr = base;
, P% b! O# V+ [3 p        sync ();4 _& K. o7 y+ p0 U0 R
        save = *addr;# ^) ~7 u+ T, r5 q
        sync ();( E* [/ [/ a2 B; g7 m
        *addr = 0;$ @: R& M) [: O+ O, X4 @0 O

! c- }. ?9 z: h+ k        sync ();
/ d# |7 v1 \, Z1 f; w6 I; s4 G        if ((val = *addr) != 0) {% @+ {& G' y1 k7 ~  }( x
                /* Restore the original data before leaving the function.; E; X: r/ r8 z, |
                 */; k3 H/ a( v- |5 b4 j' B
                sync ();
) d' ?; l3 G$ r* I; |                *addr = save;7 V- ^( C! K, q: k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' C1 y/ R! L6 M; R
                        addr  = base + cnt;4 }9 z8 w! s1 X# o: z3 _
                        sync ();  r) j0 |1 F8 g0 s  {0 }
                        *addr = save[--i];
) {7 z9 B  ^0 I- S# x5 l" v: M1 [                }; M+ J' ~: @$ [: X6 u
                return (0);
) P- |: |8 B0 C& h5 M1 Y1 P        }
) k7 j1 F, l1 W* k0 k$ @
" G, B- Q& R- V/ u8 ^; T- T        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 g& w. B% \: W  \" T! @                addr = base + cnt;        /* pointer arith! */
' w+ c) Y/ [- W! ]2 e  D; T- t                val = *addr;) B  [$ Q) i' E& S' O' \
                *addr = save[--i];! h* t( q' [) p! [) q% ?- f
                if (val != ~cnt) {- B5 F* {: s5 q! @! E( K  _! Q5 |
                        size = cnt * sizeof (long);: q2 ^: e# B, r( }
                        /* Restore the original data before leaving the function.# }+ Y# d6 @& t' s) g( ~. ~
                         */
; T# h* r0 o& L+ t3 P8 n6 E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' J1 P1 g5 h$ o$ D' D5 ]5 |3 |; ^
                                addr  = base + cnt;
* M' s! {$ v2 }, @                                *addr = save[--i];
. D( \" |) M! D- k( q                        }
2 N% W: P& d1 p) q# r  y& V  K- v                        return (size);
& z/ o; U& J' C/ d4 V" q3 r. `$ J; X                }) W/ H, C) k, N0 q/ P" @
        }
7 v% S) ^; \% n( s2 [4 z% x- b2 m& y2 V. f: c8 Y3 i
        return (maxsize);* O0 w3 V. D1 E: G) K6 Z4 J. }
}
2 q& U; c, ?" L; Eint dram_init(void)
( \8 g0 T; U9 @" f{
3 t! ?& }3 o1 p7 U* _. R; T        /* dram_init must store complete ramsize in gd->ram_size */
( `$ @/ L  r( J! w0 y9 F; f4 B        gd->ram_size = get_ram_size(
4 H5 I5 f9 z- _; X& _/ u                        (void *)CONFIG_SYS_SDRAM_BASE,% i% _  U) a  i
                        CONFIG_MAX_RAM_BANK_SIZE);9 X9 N& m. f" t' i
        return 0;' H: I# W. t: M0 m* C7 X
}5 t9 N0 K. d: ?. r
/ |! X" ?4 K9 O1 l' ~1 `$ z% w
/ Q, b3 R/ M  L7 E2 [6 W+ F

* b3 |. G* K- c; T( V3 j$ E1 I9 I) Z9 M3 n4 l! t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 L3 d" {6 w$ I
9 U0 ]) d5 R! x" b+ N6 C: O& X! J9 P: P9 K4 v

/ S0 C: y: i, e' b




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