嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ I/ I) R& \& M7 h0 m; [( r
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( K1 a6 z3 T1 s" H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. [1 \+ G  v: h2 q1 Q7 Y  k( a# M; n9 l
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% b! A) Z* m# _3 Q8 ~5 M7 y: M7 }2 ~! C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: v5 ^5 a9 }/ ?9 n
/*
3 }; P: @" c7 O" _* Check memory range for valid RAM. A simple memory test determines* S/ X8 |6 e+ F% l
* the actually available RAM size between addresses `base' and
7 M& X; u3 N( z# u/ f# X) x' N* `base + maxsize'.& r7 j/ z& J7 r" B5 b
*/% z0 x5 z) C2 m$ Z) Z
long get_ram_size(long *base, long maxsize). [7 p! @. ?2 d4 e+ K+ Q8 ^- A
{, ?* l- @  l# X1 B5 H
        volatile long *addr;
2 \+ f5 E) m+ t% \1 M" G  D        long           save[32];
6 G5 P, s8 \) F4 g4 d2 b        long           cnt;  R$ _9 `; r% B; A& @
        long           val;/ n, {1 H3 ]/ F0 `) Z1 D* D
        long           size;$ a- O6 y0 n) K. {- c
        int            i = 0;
8 ^3 T& F) P7 y2 T! ^' i) P+ `# u, i8 I4 b1 B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 s# {) F/ v/ n# v% \                addr = base + cnt;        /* pointer arith! */& H4 _' o& |5 y( F% w4 R
                sync ();
" G; Q- R+ q; v8 B- f                save[i++] = *addr;
) e! ]  G0 H" i' i/ i: m                sync ();( {/ ~* g' K* P0 a0 F
                *addr = ~cnt;
9 K1 H8 D) |2 u" g        }4 ~' Z4 j( E' A# b. P( K
, d7 E$ A7 {9 _3 q  C) r' ^
        addr = base;
' @) W! c" \1 m7 g, {$ O        sync ();+ ^! ?' |0 v, I6 `2 N% ]' E" f
        save = *addr;$ V. z1 ]  ]8 m' M
        sync ();
1 Y  I& e3 u1 A3 |4 i        *addr = 0;* L2 s* \" h, \/ C" D" L) a5 d1 @

6 O3 c3 [9 n9 a" n8 w3 ]" r- ^        sync ();& C4 a7 w) W8 g1 ]: q* K
        if ((val = *addr) != 0) {. x% Z" F  n: L: o9 U! n
                /* Restore the original data before leaving the function.; b" B) R* ], ]
                 *// o, j. y1 N) j
                sync ();
9 l/ m( D9 {9 M. q/ }. K                *addr = save;3 ~/ t# S: X- v# W
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 h9 `4 ?' \, Y- ~* f* g! d0 L& `                        addr  = base + cnt;
9 |/ S5 B7 w# T6 \" ]                        sync ();
3 S2 S4 E6 d/ @% D- _' i9 B9 C                        *addr = save[--i];
2 z8 {# o8 z! M& d9 v0 O5 X2 n. H                }1 o4 d' g2 T, s' [+ [
                return (0);
4 m; Y4 k5 j5 N& A        }7 I* G$ G0 t: [+ g

) {) e8 W# {* l, ~' L        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  Q  Q3 ~# _( m* \                addr = base + cnt;        /* pointer arith! */5 E" t4 J6 d7 ], _4 X) x
                val = *addr;
& p* H' c8 D4 n3 O" j7 w                *addr = save[--i];+ f+ [/ ?$ [: P% ?5 R& C
                if (val != ~cnt) {
* K, f1 B) |, z                        size = cnt * sizeof (long);# x/ h3 l  f5 c& B. y
                        /* Restore the original data before leaving the function., ^# W2 ?$ j; W$ R7 K$ {
                         */
5 Z4 J6 ?) [* |) J6 q  t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) Q9 E* P7 }. Q                                addr  = base + cnt;0 k4 N2 `8 I$ {4 O4 j# [
                                *addr = save[--i];6 L( X  `8 F  i0 \2 ~
                        }, f, @, Y& X! g* J
                        return (size);' u* w$ o  [5 i" R) D. E# s
                }
& p7 r+ `# B: X! u, w        }6 ^/ w- N- T+ l+ ?

2 d# @7 b' t. N/ H8 r        return (maxsize);9 B( @- ^* s: M+ J
}
( w. z5 W% `( R  X$ j& E3 tint dram_init(void)
; p4 V2 {- c: q+ w{9 I  n7 \8 h( R4 z/ |3 C- ^
        /* dram_init must store complete ramsize in gd->ram_size */
( G: ^- R% t$ d& B        gd->ram_size = get_ram_size(/ b1 W* Q& [! M
                        (void *)CONFIG_SYS_SDRAM_BASE,
. J9 w* k( n8 R& [, Z                        CONFIG_MAX_RAM_BANK_SIZE);
  }, D# ]2 c2 _, [: i        return 0;9 q9 y! h) s5 l' n
}
3 G  ~. q- s6 s7 |- E2 j  V& o, z( ]
4 G- Y" Q" I" K1 b5 O. y% I0 i# o
0 `- U3 O9 \! J4 }

. I" N9 c/ O. Z% `FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% Q( }7 \' v6 l
; o$ l# [$ V; T0 N$ _
" Q* T( o% X1 E3 f* ^" P* Y

' @& Y1 G9 T0 _. V+ a7 y1 W' u% O




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