嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ J! `" J9 e- j' e/ p核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 d5 U' |5 K5 H3 W9 J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. ?% ?! M7 A5 k0 t4 t; T* ^  o1 N1 Y$ g; }6 u! W" u  R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ F. Q8 @, @+ E& O

# S" x; f) a! g! s2 c  T2 O' v
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 S5 N) x: z) D3 c3 a! |/*3 y& u- C6 \" Z% N% b( ^
* Check memory range for valid RAM. A simple memory test determines1 L; Z' T/ T2 ?; p
* the actually available RAM size between addresses `base' and" d# s# H+ z- u" r
* `base + maxsize'.
, m1 Z- g2 k& o3 U" b+ W0 p  h*/
1 S6 }6 {7 C4 o% \3 zlong get_ram_size(long *base, long maxsize)' q$ I. S# ^2 M9 s  F
{
6 ?6 |  s" J/ t4 }; @        volatile long *addr;* k! y4 H- p$ \0 A* W, p, ^6 r
        long           save[32];4 D  L$ s- n1 a# y& q
        long           cnt;
/ f2 J; X6 }' T6 J" ?8 w$ O9 R        long           val;
' R7 o# b" M; s        long           size;& A4 G6 S+ i6 X0 c$ s
        int            i = 0;9 t- V0 `! A0 }1 k' Z2 e* J
' s/ I/ k4 U7 j7 ], \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: Z7 q/ [0 w- v" @3 r, N
                addr = base + cnt;        /* pointer arith! */$ t1 ^: J6 J' P) R6 c/ ]
                sync ();
# G' q) f8 o8 }                save[i++] = *addr;
/ i7 B4 j( Z. P* v1 Y0 O3 \, R                sync ();% R- r/ w" j( B1 k* W2 S
                *addr = ~cnt;
6 J$ y1 @7 }5 N) X        }
0 k, l% u( @6 I5 C
9 A) T6 N3 F: L        addr = base;% [' T/ d6 t: H/ Y# Z
        sync ();
) I( Z$ g$ p# M        save = *addr;% F+ P3 ^  R) s, @% \, r
        sync ();5 V4 d8 u" S) e  z  L% V5 R4 z- t& e' S
        *addr = 0;- ]& b+ c5 J7 z

3 O0 Y% J* v8 s, g7 q        sync ();
2 W9 l1 L6 _8 A. c: ^, y4 G' @        if ((val = *addr) != 0) {
4 c# g8 x1 U/ W5 M7 s! u8 W                /* Restore the original data before leaving the function.+ W" n( D4 t- w1 h0 y
                 */
# w9 e1 b% |5 T! c$ B- i                sync ();+ i8 R. f1 E, f' R, T6 E
                *addr = save;
" X$ }& l  g; s+ m) h                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) U$ o$ z# \; ]% [, ?
                        addr  = base + cnt;
) \$ }4 }9 z, A+ L5 R$ [                        sync ();/ x1 y0 i4 m8 S! T0 ]$ @' k
                        *addr = save[--i];
6 C4 c$ l6 f' b. \2 `% j6 X( u$ a4 R                }! a  l# E8 q; z+ P
                return (0);6 ?) j+ ]( C% Q9 f" O
        }7 F8 r6 F! ]: L/ L/ f/ c

  _7 o9 u( ?6 Z0 \2 x. O$ \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! ^3 H) l0 ~' m                addr = base + cnt;        /* pointer arith! */
" S0 h: |/ W3 n- G% D3 _1 l                val = *addr;7 x( I6 e; P% ^
                *addr = save[--i];+ n( A; f. Z" \, F% Y- z9 p' n
                if (val != ~cnt) {
8 C  R$ [# k6 o3 `4 j6 s$ a                        size = cnt * sizeof (long);
4 Q. @; K# k: d7 ]9 L' g                        /* Restore the original data before leaving the function.# _6 s. g$ Q) k! S$ _
                         */3 [4 _. V9 z9 a( L- ]1 x* \, \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" K) H& x3 G6 I* {5 f: O' P& ]0 }
                                addr  = base + cnt;$ k$ W4 x: M) p2 l! G+ ?  S
                                *addr = save[--i];" s0 C# l& Q$ o: ]- t
                        }
1 b# {) I1 B' _7 U% {                        return (size);
6 W$ i! g2 }% C4 b0 ]& M8 i6 c6 e                }0 B, O0 O* v4 o0 n
        }: ~3 U8 l. Y/ o) W# t& ~

7 m4 x: n/ I1 ?6 n$ n        return (maxsize);
" B$ k9 @' `) h9 U. ?}
, \3 p8 P9 l1 \  l1 [int dram_init(void)
  @8 Q% a" I) z" n{& d, d& H2 {6 M
        /* dram_init must store complete ramsize in gd->ram_size */
" G! b2 ?( R5 A6 D5 z( U        gd->ram_size = get_ram_size(1 Z7 B: l% P1 S+ W: }
                        (void *)CONFIG_SYS_SDRAM_BASE,; h  n: [4 W/ e! q) p+ t  G
                        CONFIG_MAX_RAM_BANK_SIZE);
! h. I. Z7 ~. n) A5 [        return 0;
$ v4 g% ]* }# B& b! c4 t. }* C: S}
' Y6 U& K5 w. m$ `; D( m
7 G- p! {/ ]0 W& u' V, z* \
) B# S9 u+ A: X  C. S* R, a+ ~# U# G, n
+ x! C2 T# E: P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 @/ u. U2 ^8 Z6 ]2 X
# k( W5 I% q4 L" N. D
  ]8 b7 ^7 E$ t- f; F

' q9 G' C0 A, o) n' U8 i  D, D- D




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