嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ i4 H5 X& L' j& U
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ B1 B  z( h8 O/ ^& D这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& K+ C3 K# c1 y
  [2 Y/ r3 a5 x/ i# x  H+ N/ m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 h5 U4 u& s4 X- A: P0 A
8 \9 g% T+ k+ P1 d
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 |9 L/ @5 b2 X
/*2 y3 O$ I- a, @8 l# {4 k
* Check memory range for valid RAM. A simple memory test determines
3 G7 {" o/ Q# {' F* the actually available RAM size between addresses `base' and
1 u4 G4 S. m, `; P2 F7 V: p* `base + maxsize'.
1 y3 X: G- |% T8 |5 w5 ?( I% m0 z*/
( Y9 n: i9 Y# ^* O1 D' B% C; e$ I, llong get_ram_size(long *base, long maxsize)& q$ f& N+ w1 p% l9 ?* D
{
  x- W: ?6 J8 f0 l        volatile long *addr;3 _" o5 l3 Y, @
        long           save[32];8 t+ ^( r2 g9 R) F' r! i
        long           cnt;
8 U! E/ M, t, q& Q) T1 y        long           val;: ~/ u% H0 y8 r$ l/ F4 R7 L9 q5 ?/ d
        long           size;$ G. m0 L; p7 A: y5 D# T
        int            i = 0;
1 z" X( ]+ S) l% e0 Y0 {6 g
) A/ p6 t2 A$ i9 \# s8 o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 M( X6 w. v9 d
                addr = base + cnt;        /* pointer arith! */
1 v' h' Z. g9 ^2 f                sync ();
! R: A! w+ [! y9 p' a) U                save[i++] = *addr;
9 x5 {) k3 D4 e1 m  ~: w                sync ();
) Q' y! z# z6 g0 P                *addr = ~cnt;
, B; Y& C; g  R. ]. u8 Q+ P" `        }; x0 L; f6 k$ s. ]( J  E: N
2 P, k7 X2 H& y# a* d
        addr = base;- X/ r. x  B# I' t
        sync ();
& S+ [6 C( [' a9 i        save = *addr;8 O, o# W; x% m
        sync ();
( o; C9 y8 E* e  [9 W# k1 L        *addr = 0;
; w) C& R! P, q3 a- q( T8 U  [" {. V$ u8 }0 k
        sync ();
4 J' C2 G8 q7 g* H& g        if ((val = *addr) != 0) {/ x5 |* R/ J$ S6 Y/ B  O
                /* Restore the original data before leaving the function.
& @* b3 n- b9 M- g. C                 */
7 K+ ~$ [" e) Q- j% U                sync ();
' \' N+ J; K1 f2 [! N# K                *addr = save;+ \4 U. h) D% {5 Y/ k$ H& x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, K5 ^, A8 `4 y8 \/ k6 G                        addr  = base + cnt;2 j2 e! a0 N; `- k1 g
                        sync ();
  G, Z$ ^( l; k- t$ \5 K' Q7 t2 A                        *addr = save[--i];
- J, s! ^" P- f" E                }
( u( [" c. ?4 t0 z5 D' M1 ~                return (0);
8 o( u9 R7 N+ ]; ?7 y4 t        }8 A. t3 _* U! y" T/ A" L

) G; T) f4 G" a: s( k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' R: c! @  e% U# y1 t0 N5 X3 u
                addr = base + cnt;        /* pointer arith! */
( z( {' b8 [8 g3 p) M, j; ]; z1 d                val = *addr;
2 y# h2 t# `* q3 ~2 Y                *addr = save[--i];( f, G6 h) F0 z# A% o
                if (val != ~cnt) {# u+ ~. G' X; _8 `
                        size = cnt * sizeof (long);% o" \6 k" [# e9 W$ E
                        /* Restore the original data before leaving the function.
* D) m' b1 l' n$ y4 ^7 _                         */2 [# c; S' e6 w) n9 s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X. x8 X! M6 q  D2 x                                addr  = base + cnt;
3 X/ z7 |0 x1 u& O& x1 p                                *addr = save[--i];
% a/ G' w" D* t; k$ E                        }  J& S5 Y, l5 B& ^/ V
                        return (size);0 }* X& |2 o' t  i
                }: N$ F  w0 {) S# F% T
        }
' |* i% b, _: o! T% R& m
  S& C6 l, I& ^5 r        return (maxsize);
1 d: r. b9 x& Y: c4 S; t}6 K/ h; k, [9 L6 ~' M3 L
int dram_init(void)
( w1 g% H# V, h9 ~/ ?. L{& [' \3 b8 s0 u. s! q8 ?3 d6 j  n  o
        /* dram_init must store complete ramsize in gd->ram_size */
6 J/ V. V+ Y6 Y2 Y8 u8 l; F# R$ H        gd->ram_size = get_ram_size(
& o4 d3 U& O8 y                        (void *)CONFIG_SYS_SDRAM_BASE,
4 U0 }3 A/ `! q) u- r                        CONFIG_MAX_RAM_BANK_SIZE);
2 ~0 h3 J- m9 N* M3 L        return 0;$ ^4 V" }. _8 G, p3 R! F
}9 e8 V8 l; x4 }" E8 w4 Q& C+ d' M
6 ^% U% J8 Y$ {2 [& j  U
* f% {9 _5 y$ N. x7 m

* ]$ X% J4 x2 F; X- u, u
" y4 ~; c+ W+ J3 ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; l4 @2 }: l3 G) B+ U
! e; R0 v# n# J& G' I$ Y5 k9 c5 l9 g- L# ?2 k9 e; h

; D! m# c3 L* |: S




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