嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ X, j) H2 R2 C1 q' t: Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ N: a. z, s+ x* A! i# ~& T, B这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 |4 `. f/ Z- M: [

& M# k7 g2 J3 T- L" z7 ~: x+ K+ Q是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% R/ ~6 }5 r& d" d) e. Y4 P7 X/ L+ p+ G! C0 o) y7 @4 k# [

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 S0 q/ R: b# W$ X/ B8 C/ [
/** _- |" {. H$ ?6 [
* Check memory range for valid RAM. A simple memory test determines) r; d$ J- u8 f$ L8 ^$ h
* the actually available RAM size between addresses `base' and+ h, o8 G& u0 C/ W
* `base + maxsize'.
0 r+ E6 ^- p' y) V4 U*/
4 h1 O7 B8 y& l- t0 e/ Elong get_ram_size(long *base, long maxsize)
6 `; H' @' u1 r( V2 z# j" z{
0 e- c1 J# \! O% i        volatile long *addr;
# I0 {0 F/ B- f) E        long           save[32];
* Q1 K' K8 t7 B& e  B; Y+ N2 y  i        long           cnt;
8 }/ @5 {& |! y; H8 Y6 l2 L        long           val;
% v" q" t. W+ t2 F6 L  W! F        long           size;2 D  }9 Y% j- W- w8 j4 P+ ^% c
        int            i = 0;
- @# j; ]1 y% p% H  j' L, i  A, f/ N* c8 _: f8 N3 R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* D' [" h. H9 N/ {- x
                addr = base + cnt;        /* pointer arith! */
( _  ]+ m2 m. X+ `                sync ();% V9 B  i: I5 ^+ q3 ]* ^+ G6 t
                save[i++] = *addr;
' a' x1 W9 e& g5 ~) z' l- z+ z. t                sync ();) E$ @/ b. K1 M# n7 `2 q4 e; _3 g7 S
                *addr = ~cnt;: d( C0 l, z2 _! \8 \, k
        }
0 G1 N- Q# l' a0 b. b. z/ l
1 h- k+ P8 X  s0 C4 A, }        addr = base;- ]5 [+ g, T! t
        sync ();
" H* z7 T# P* r: R& v        save = *addr;
$ c, F+ Z9 I8 @5 i3 \% B8 r& n        sync ();
- ~# P0 h7 w, G# M2 `: a' M" o        *addr = 0;
8 h2 M& z- B6 x' i1 ?" o, d. M6 }! R9 [' r  p$ k& X; |9 B" L! ~: h
        sync ();9 J9 n4 R5 O6 p& U9 M2 J: V
        if ((val = *addr) != 0) {; K: k5 j* E' [0 I6 O
                /* Restore the original data before leaving the function.* |) n8 j( l+ E$ ~
                 */: }3 q# C' u3 \  Z* f8 A+ B6 _% l
                sync ();
/ ^: f9 A# F& E# Z3 u$ W& n                *addr = save;
# A* D9 d  c8 m1 d% H( ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  @; G% i3 |1 b, q, i                        addr  = base + cnt;
) f' m  m: z- H. S                        sync ();
  T  u1 n# i5 E, J8 `) G6 a  R                        *addr = save[--i];
2 F' e" e5 c; I2 [" p5 z! S                }
# ~4 G, V1 E% o# O9 h                return (0);
( D5 M. m: k* W7 B        }7 Z& }  d8 g4 ~2 h
, ~# ^: x; X2 r8 |+ g8 S* o5 g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 w( p# \0 G+ k- n                addr = base + cnt;        /* pointer arith! */2 E2 f5 z. A/ ?; L
                val = *addr;$ f7 `: n- ?/ F: Z1 ~
                *addr = save[--i];- w5 x. m+ h- e. _/ S
                if (val != ~cnt) {
2 S6 {! p! O7 i" t7 H* J2 V                        size = cnt * sizeof (long);
; [3 \9 k# T# `* }* l' L8 x3 V" p                        /* Restore the original data before leaving the function.
- Y, [. J" {; O% h! x                         */0 q5 M" Z( B" N
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& U& H; M7 e& P$ u- t                                addr  = base + cnt;; U. {. U' T1 Y' J/ B9 s6 r
                                *addr = save[--i];
3 F' }- I& f0 Q% P' {                        }
. \) I$ c/ \3 S  I& e7 t                        return (size);
4 W: M& E: p' O                }, _( O5 c- G1 V7 `
        }
/ `4 m0 }3 Y6 t# K8 K
) h" e5 I- E$ t& l        return (maxsize);
2 X1 r7 J$ W- |  ^8 P5 [! [& r/ c}
0 h6 y7 t0 G( D* k, Oint dram_init(void)# z4 |. [! |' D" V+ Z+ n
{  I$ M& k' t/ Y/ {; X
        /* dram_init must store complete ramsize in gd->ram_size */6 a, u; m0 N- B" x
        gd->ram_size = get_ram_size(
* o( G. X& M4 P- d& B  i. v. `" B9 R                        (void *)CONFIG_SYS_SDRAM_BASE,
) j) K" c% S  }  W8 F                        CONFIG_MAX_RAM_BANK_SIZE);9 [4 K# N) z8 V5 _/ w
        return 0;! k+ q! y  D" Y# C2 U* J- y0 L3 B
}& ]5 o( l" Y2 Y$ _6 k% ~6 b
5 g2 b# ^4 u4 }" V9 _
8 d, _1 W: [, [* c
- w. d9 M% f; r. F6 b

: ~& ~0 u" ^6 H1 H* KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 r: d5 r& e  G2 u# Y
  {; m1 R5 O; b, b
( N- J8 t9 b. S

) E& N7 V) ~$ q2 T




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