嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ s& C0 u9 _" ~0 X% N6 S( |; L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  c/ o5 t& C. L! T8 S) k, y' T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& _7 q& `, c! k2 j# x) g9 N
4 M# k" l7 R4 N* T- C& }  f是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 x0 p8 N5 c: Y/ C- l* Z
' _9 t$ U$ I' l0 z  o5 D: X) F
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:' ^$ b( P: g# |( U- \: p+ P& Z( G
/*
) ]6 T/ H. o4 [* Check memory range for valid RAM. A simple memory test determines
6 k& p" @$ p, {2 [2 S: B* the actually available RAM size between addresses `base' and
. _0 e9 }& p' L# q' H) g0 P* `base + maxsize'.
* ~/ t' ?- ^6 y( ^$ f' G% l*/: \9 e8 k: J/ E- I! F
long get_ram_size(long *base, long maxsize)
! f) t3 g, h/ z( S, B{% k  R; N+ k. E1 B5 E; \$ V: x9 k) V
        volatile long *addr;
6 [* F1 p! K* w3 q8 t2 d# U        long           save[32];1 Z8 d" m; w+ e6 q- b
        long           cnt;
5 ^) x' V, T; m7 b8 H        long           val;
/ @( Z3 z7 x5 Z        long           size;( J9 t# k  X) c! m
        int            i = 0;
4 q& P& {3 x) `: Z# E4 x. A6 W
3 G/ W4 W4 z8 i' n8 g/ y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) ?9 J) d; O, p/ T0 `
                addr = base + cnt;        /* pointer arith! */( Q1 g6 |) f! {! p
                sync ();
5 A$ E+ ]# Z* Y5 F. @                save[i++] = *addr;
' m% e4 M% Z) e& A" C+ Z                sync ();# g7 ?/ ~' ^  i
                *addr = ~cnt;
/ K- U1 F3 E% }        }
* m1 y  D3 |/ Q' T" t, w  Q( s+ V$ Y# R7 l7 X7 Y9 e* ^
        addr = base;
! h' i( Q2 B% U% U7 _) a        sync ();2 i+ {' m& `: o: v) q% s3 P: x3 N
        save = *addr;+ {( \: Z/ W# e
        sync ();4 i* M; j( Q" W; N
        *addr = 0;
* r3 q3 s# h7 N  d5 s2 `6 @- Y" d( @3 y4 Q. B% G
        sync ();
9 p1 z, ]4 x, G        if ((val = *addr) != 0) {
. A6 H% x3 Z# a0 ~, \  N3 X                /* Restore the original data before leaving the function.
5 T% h  r4 w; ^+ E( |% O                 */+ v4 G: U* }9 c; p9 i" u
                sync ();
' W/ M% O. |- K- J& u                *addr = save;
0 W: r! t. k, I                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 @2 q8 y6 V, y7 ^                        addr  = base + cnt;6 |& B) |( s& I3 F0 J6 a. y
                        sync ();) b9 G" ]4 }; r6 j+ q5 C
                        *addr = save[--i];
4 u2 m2 Q( N$ r& v3 ^+ z                }7 }: N' R4 a5 ^1 h4 l+ A
                return (0);/ U  {* D+ ^( }' e
        }: e1 f9 O& @, w9 H, {6 D

5 J- Z/ n5 v7 c5 r# l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 f  e+ ?# a1 W$ ~
                addr = base + cnt;        /* pointer arith! */2 j5 o5 B% L, f+ x) C0 F+ v" w
                val = *addr;3 I3 u6 F& T  N7 Q8 ~; N
                *addr = save[--i];+ V4 M+ G3 R' G( H' O3 j
                if (val != ~cnt) {2 l: u( x6 q' V$ _3 h
                        size = cnt * sizeof (long);
- l9 R) \" l: y) t                        /* Restore the original data before leaving the function.2 ^0 c$ `# @2 \0 O) _* u: p- k( k
                         */
" x* \$ o- T! l3 ~! ^  y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 O. C. h+ e, x# C) \$ y2 L& M
                                addr  = base + cnt;2 A' o9 n! n( V4 x8 t0 K+ E7 V
                                *addr = save[--i];/ j4 T1 k5 ^6 C9 x3 H# b7 Z, H
                        }+ z0 u9 a7 p. f" ]
                        return (size);! J: k8 w# D! \7 F8 T6 m
                }2 o3 R  [" I: x" V- P% W
        }- c! L8 i  g% [3 y

- w1 _) J; b& E" g& W5 Q        return (maxsize);
. v4 k6 e5 ?6 B0 Y}
% x3 h: u4 j7 P9 nint dram_init(void)$ Z9 w$ w) Q7 `1 h% m( X3 P8 s
{
) P1 z$ A; ]0 F        /* dram_init must store complete ramsize in gd->ram_size */9 s7 `! L" i  [
        gd->ram_size = get_ram_size(3 h1 q0 J2 v( U/ I3 j6 z3 X
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 n6 Z/ o9 y3 @; z                        CONFIG_MAX_RAM_BANK_SIZE);: A; Y  m2 T. Z- E- \0 N
        return 0;: V: G+ r) H5 b5 O! k
}4 L) Z/ b( M4 ]# |
* D& E# }. _5 j0 X0 }

* k; ]0 r& G5 Y, Q. _* }
" ?. I( r# z% |! A5 M: S5 X
$ a: w& w  [3 C" m& y5 Y5 pFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ N$ e1 S8 W* y8 ?8 A( ~

8 U7 A, A) m; _
- M+ K' J' b* n+ d' T8 n6 s' q
% p" Y3 S) p# P/ h3 J





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