嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! ~0 }9 K/ O: u
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) {2 e4 b8 T7 \9 `# U# o5 Y6 F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. t: q5 L* ^7 W5 k  H
0 x1 Q$ A+ e8 p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 ~+ W5 _, }! T1 q
' R3 s4 e, x) }7 G; e7 u

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" a' x8 N) {( G1 s' v$ i2 t/*7 E( u$ Y5 k+ j: c; d
* Check memory range for valid RAM. A simple memory test determines5 `( N3 u! O! R' ?
* the actually available RAM size between addresses `base' and
# j5 @* r" c' @- X* `base + maxsize'.
6 i3 m2 L; l' [$ z; ^*/
9 X7 v( f1 t5 z6 n9 blong get_ram_size(long *base, long maxsize)- Z2 ?& W! X' V* V$ C, g. x  L8 F
{  U6 |: X8 j* Q5 O. w" n' D, T
        volatile long *addr;
0 C% g( i5 k5 m0 e6 t7 @        long           save[32];
/ M8 M5 K0 N3 V: W9 a' ?        long           cnt;( J$ M& Y8 B3 h7 S1 R) _0 ?' C) }* e- j
        long           val;
+ q) B3 }- Y3 R. D! w( z        long           size;- M" o5 V3 t4 T4 ^7 _0 A/ U& @
        int            i = 0;' M9 e5 G2 L2 }" @+ l( ^2 f
5 p% h/ [- |4 ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. `4 m, U( Q0 L8 R5 F9 L                addr = base + cnt;        /* pointer arith! */
; B+ K4 p* }9 {* r4 L* D' q8 m3 x                sync ();
. Z0 t" j( s9 y, p, W( ~5 g' Z                save[i++] = *addr;
" r4 w% v: K1 U: \9 j+ }2 T                sync ();9 [; T/ u, r% r  [( U5 ^
                *addr = ~cnt;
% x* r, c5 O- W" v" O1 @        }( F0 f* `9 B6 \/ x: R1 H

5 N0 t# t6 z3 j8 K* ^) L        addr = base;. Z. O5 `9 `( c8 \4 m0 }
        sync ();1 Q! u  C- Y9 a7 {
        save = *addr;
! `$ _# O1 {" y1 ~  K) Z0 f% {* x        sync ();6 o" F' Z5 h- V: T5 H! j
        *addr = 0;4 V* M* T6 ^7 \# R
: D! K$ O- K8 E0 q' z
        sync ();" M1 @+ G) ]3 w( p& N$ |
        if ((val = *addr) != 0) {, {! [" u0 P6 t, w) |+ q1 q
                /* Restore the original data before leaving the function.7 Q. p$ B: F! ]' n: |# c
                 */- J: B8 c! L6 h
                sync ();. O" R4 X- n! S3 z  }# o
                *addr = save;) |7 X6 H+ p( F7 r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 j. ]) r0 F7 K1 W% u& E                        addr  = base + cnt;
4 H  j- y! }  O5 e7 {                        sync ();6 o. Y  d; M( _
                        *addr = save[--i];
4 Y6 s% g7 j; W/ n1 x% o; \$ L                }. g1 P/ H0 }1 V" `
                return (0);
7 w3 p! z& J# Y, N' D0 ^        }
. T. Z  v/ P# y% C- D
4 p+ ?4 {7 M8 K  `        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 {; F4 U: |6 W* t6 t                addr = base + cnt;        /* pointer arith! */+ n; [: O3 o' h, `$ P2 ^
                val = *addr;
6 M8 P0 Z9 g5 g( B; h                *addr = save[--i];9 Y# p1 l$ m  p
                if (val != ~cnt) {
* L. T6 d' ?+ V/ R6 i3 v                        size = cnt * sizeof (long);
& S) ?# A; k" f; e9 w" M- k; T                        /* Restore the original data before leaving the function.* ]' q1 B. z$ ?
                         */: Q1 V; M6 G" r! U9 @, S3 M& a
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 R0 ^- r( X; C% \                                addr  = base + cnt;" i7 m; Q, \: b0 G( L+ ^
                                *addr = save[--i];
1 L3 `* N/ t  z" o0 G                        }, Z2 I, q3 O- _
                        return (size);0 s$ s, H9 N0 a  ~: P
                }7 r5 Q/ ^8 t- n, P$ Y8 a3 }5 b% Z
        }% ^' F: ]. O9 v3 ~: i! l

3 D' m. ~: \) y+ ^        return (maxsize);
3 P& r. _; L% R3 h9 o, e}8 o; B# t# `1 Z! q/ S- V' Z% g
int dram_init(void): h6 y8 n& e8 d. u
{5 a* c& P7 B/ Q8 T
        /* dram_init must store complete ramsize in gd->ram_size */* g8 G$ R. G& p/ I
        gd->ram_size = get_ram_size(
; R6 x/ v2 j8 Z; y& ?! ^& _                        (void *)CONFIG_SYS_SDRAM_BASE,
$ ?- B$ R- c/ \+ S1 p, L4 h. F* K                        CONFIG_MAX_RAM_BANK_SIZE);3 [' o  s" z: }- p
        return 0;( H, D2 c" v; J. K7 c
}
2 T# `1 u1 q( s1 L8 h: X
9 u. c& `6 F  |3 ^5 j8 v0 w+ \: @+ T+ b  S  [1 v3 Z, p

8 X0 o9 _6 z( `) d4 }! `& E( _* J4 H! N/ c9 r, R2 E- W* n9 \( r4 A' l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; U8 e9 z8 s& _  b' E: x
% N" f' I; V. |# s- V# ?/ h! Q! m! i! L& r" I  A9 r# n
! H# q- S: h  ?+ c- c5 ?& n: A+ b% A  }/ v





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