嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  u: v& v6 g; L: z: ^
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. R& ]" D  {0 u! e5 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. O3 u% O3 D, N! v9 J* `. L. T0 T
  n8 {; O* g2 U; }8 r/ a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 w( e+ N! P2 y  ~$ Y9 ~5 P
9 _: Q4 b8 y8 _. H" E
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! e6 ~& j8 Q* ^' j/*# Y3 p4 Y/ b7 `# ]) t' X
* Check memory range for valid RAM. A simple memory test determines# a& T$ [  G' Q5 B8 p3 S
* the actually available RAM size between addresses `base' and5 ^1 t* w& r1 ~  ^% o
* `base + maxsize'.0 G/ s3 J0 R1 j7 D: I8 H
*/
, Y5 x0 k" e: K: Xlong get_ram_size(long *base, long maxsize)
1 J$ O" u; y! [; C+ X{
5 [( `( D# G" S+ }3 _/ R* r& V        volatile long *addr;
8 l9 b# _5 [- j        long           save[32];4 P1 M0 Q& F/ U, A+ U" [) |9 x
        long           cnt;3 z! v9 ~. m: F/ ^- k1 W
        long           val;
$ ]' A4 R9 {3 q+ p0 M- a6 U" p: [" d" W        long           size;
& _) Y6 y3 K, Z6 d' V9 u        int            i = 0;
- e( }* ^  Y9 J1 K2 k- @3 L9 k% g& Q( f) e: e  Z6 H; ]8 T7 N
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: \9 s( B2 w. s
                addr = base + cnt;        /* pointer arith! */
- \3 D2 f! |) O+ d$ M/ [; M* M" h                sync ();% {' |: A7 F# \, Y$ R+ ^0 C
                save[i++] = *addr;
/ h# N+ d  }  ^; `" a                sync ();$ m+ q& s. E/ a7 }0 h- ]! l& c
                *addr = ~cnt;) r9 I: A& t: I2 M8 h
        }
* O( ^8 q6 H+ ^$ y" S
- @; Y; v5 O* d1 X) a- d3 @0 [        addr = base;
: i7 C4 Z+ L; L1 y# e        sync ();
6 F% ^' d% U" O8 H6 [' w& \2 ~! d        save = *addr;; [/ F3 H: H) P' J( U) g
        sync ();" w6 J) _9 O5 `' |6 s/ I/ G5 o9 z
        *addr = 0;, ^0 y7 y6 W. e' \2 L* Z4 E5 S
0 B' X# d. l' i2 A
        sync ();
. b  R8 p+ ]$ O        if ((val = *addr) != 0) {
( B: o/ J) @& z                /* Restore the original data before leaving the function.7 m# z. ?; Z5 j- B  G9 C
                 */
3 U, f, P% D. W; P, B                sync ();
/ y1 }  Y  \4 p2 K' G# j                *addr = save;( D# n# w8 q/ d7 b0 W1 b6 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; \! Y5 d5 ^# [: y3 Z' k+ u6 l8 K
                        addr  = base + cnt;
" l0 l9 |% a+ ?* q* @, X                        sync ();$ p0 v( D' |# ~" o
                        *addr = save[--i];; B/ j& Y1 J  L/ H" l! Y
                }
, [+ h/ a4 X! P% {) J                return (0);( s1 ?0 W9 \( _, A5 f. u
        }
) _9 ]% j$ ]" j6 e3 H% G- h- |6 p8 H, a2 g' W( V" A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 Q4 ~! S1 ?) G" L4 R! p                addr = base + cnt;        /* pointer arith! */
4 T1 S3 Z6 L4 F& J                val = *addr;
& o* B: k4 ~2 z8 J                *addr = save[--i];
/ a0 w9 A) K- ?/ |                if (val != ~cnt) {
$ g# f9 a; s& i/ ~& D% a0 v                        size = cnt * sizeof (long);4 O" I( [9 ^# x- ?7 X
                        /* Restore the original data before leaving the function.8 O: O. I0 e, M
                         */" _& P6 p& i, {" s0 l7 q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 x  s. t! m8 s1 k
                                addr  = base + cnt;
+ ]( Y$ k' }5 g9 i0 T                                *addr = save[--i];" \' Y  C4 C0 Y% @* e2 R" O
                        }" A: S7 ~3 d) M1 }' D
                        return (size);$ y; U4 P' s# O; D7 d# K9 x
                }
+ m) [" G; d" m5 _! q3 y0 ?# g, _        }
7 C. ]& A: L, B' T0 C% t+ Q7 P" J) ]: B# s7 d* t0 n  H: q
        return (maxsize);5 G6 R) Y$ i: r2 `( Y+ w
}* i9 p) [9 p) c! g; g! x% ?# y
int dram_init(void)/ h$ t+ N- x- H8 P/ Y/ M; M1 q( B
{
; f7 a/ C) y% i, Z        /* dram_init must store complete ramsize in gd->ram_size */* _4 b1 b/ m' A# [4 @5 q5 q3 A
        gd->ram_size = get_ram_size(
# C2 A( o7 @" y4 y0 M2 B                        (void *)CONFIG_SYS_SDRAM_BASE,
$ x1 `$ @7 A$ Z  c, |* m                        CONFIG_MAX_RAM_BANK_SIZE);
6 ~8 K  A* ]$ w) P- {3 q/ `        return 0;# i% w: G! O2 ~" R8 b' ]5 D( ]* J
}/ f& v& d! D/ \: \1 e2 W

, h) l; O6 u$ Q. l+ b
, I9 {: C1 F) R$ o
7 {: b2 ]5 ^( V- c/ P
% u* r8 z" n/ B4 yFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. u- U$ N9 c, _1 R0 l
% K9 Z7 T" ^2 M' Z- Y! \4 I, Q

3 ^. |+ R$ z. Y: P# T% c( Z+ W% ?: f

  \- p# Q" m) G- W  v! z$ R




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