嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 b& a9 ?. g& Q# a- J# s' W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit# F, C. V5 ~& N  E. T2 j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 U  ]' q  j# O& a" T8 r( s# j7 s& p5 i% c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 ^0 }7 g9 r# ]* Y7 D$ S; K
- d) ~7 }% S) C7 W

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: v* ]% {2 d7 Z9 ?. `/*
; ?' U1 w- |( _: L/ {9 ?) X& J* Check memory range for valid RAM. A simple memory test determines
% J; @# \( y' d2 z! O. g* the actually available RAM size between addresses `base' and
1 b' ^! ?2 N* R/ C# }* `base + maxsize'.
6 ^+ D( e5 l2 [$ f*/  V7 c# {0 k5 f! @3 J
long get_ram_size(long *base, long maxsize)! j7 V# A% o. K2 a8 T  \7 p
{
- X+ e1 Y, P9 X4 z3 y        volatile long *addr;# \6 F5 r. x: |2 A) B
        long           save[32];
5 c' f: R# x  h1 Q        long           cnt;4 D, C2 a2 h: w. e7 V4 U% J1 y* p
        long           val;
6 c% T5 N4 J, G) B        long           size;
" N% i4 W+ J& Z        int            i = 0;6 @) W9 g+ y3 j! G3 G

( ]- ]2 O  a7 H8 n/ F4 h* |0 E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* d* K5 e4 _* T                addr = base + cnt;        /* pointer arith! */
9 `7 ~2 I& U/ M; v5 |                sync ();
  {- M) S# F: T/ k7 r/ `% y2 P                save[i++] = *addr;
7 \1 J9 |& L; ^$ ]$ e  ~                sync ();
; k0 a& ?9 S/ u4 O% d) F) V7 H                *addr = ~cnt;, H& W0 S  ]9 ?5 x$ @- ^+ g; y$ O
        }! Y: b9 ]7 V8 a  Y3 `

3 T; b* |9 ?$ f3 O4 C) e) b        addr = base;
( c% J( D3 E& \0 r) \        sync ();
7 `0 d# ~( {  |" u        save = *addr;* Y9 c8 S1 M$ Q- q: o
        sync ();8 F- x* F5 z7 l: h( F
        *addr = 0;
) {/ Y. B" ?* o% O
$ ~  w$ p. m4 O- H. y        sync ();5 A0 W: [" k( G. i9 U" Q
        if ((val = *addr) != 0) {
% t$ x3 X$ E- y  M8 N/ T6 L                /* Restore the original data before leaving the function.$ U/ m6 y2 j$ e
                 */6 p7 W- k8 M) p9 J! l
                sync ();; T: Y; r; j4 [/ t2 \! e
                *addr = save;
7 R7 i! a7 X& i: r, h5 j: U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) ?% s) J3 v% Q2 H                        addr  = base + cnt;: W0 t3 f- V+ n
                        sync ();' m. t$ k6 L& d7 D
                        *addr = save[--i];
# A9 g. H5 L& w1 n8 `# S8 T                }9 p% R# C( x/ h& l7 @- P
                return (0);
$ E7 _/ H3 D' K' w- ^6 n1 {! e& X        }
. [# q. N# W/ z4 z6 T! C3 |, L4 o8 }8 K' j
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( g( C5 M: n4 w) l* d3 c$ ]/ ^                addr = base + cnt;        /* pointer arith! */) f: {( c. W  d3 ]% o5 K
                val = *addr;
% @: G- ~- x) B  R' t+ a  u) `                *addr = save[--i];" ~+ H3 t+ W/ X- J
                if (val != ~cnt) {0 [/ u2 M# h2 O
                        size = cnt * sizeof (long);- r7 G5 f$ G% ]5 }2 n+ |% s
                        /* Restore the original data before leaving the function.
# R( {9 L0 P- B/ p$ g8 I9 c0 ?4 }                         */' }+ ]8 K2 d5 }- j9 _. q# h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( q7 X/ F- ], U% n8 ~  ]0 ~6 a8 `                                addr  = base + cnt;9 w* [5 E1 b5 a$ x' h
                                *addr = save[--i];
  Z4 B) g% x# B, F, F                        }
/ F/ L- @+ ~; f) a7 i) {" Z' C1 l                        return (size);! @; @' y- g2 B/ v+ }; f1 D
                }
/ y/ l! c0 U- x. |# p  B8 S+ S: J        }; c4 @4 o3 v1 m3 y8 z$ K" ]
" r1 I+ x+ N) c8 B% U, H) A
        return (maxsize);
6 c3 \) E6 i  c+ \, ^}
* x+ J4 x! O- A$ V/ Q0 K( Bint dram_init(void)
; J1 a7 |' A* `! I4 \( b{
5 v) [8 k! x: E  t7 Z% i        /* dram_init must store complete ramsize in gd->ram_size */6 J. k/ S- C8 V6 r; f' P, C0 R
        gd->ram_size = get_ram_size(- Y. B# ?) [8 W% |8 M- w
                        (void *)CONFIG_SYS_SDRAM_BASE,# O" B3 @3 g: L, X$ w
                        CONFIG_MAX_RAM_BANK_SIZE);
5 U& H6 o# u; Z, {/ K6 Z$ |        return 0;* t. o5 [, M+ s' l4 N$ S: A/ X
}+ S/ @: b2 C7 G: |3 E& O% h

- o+ H- h1 j# D' m. q  l% H
1 p' C/ z+ A, v3 s# x3 M( Q2 i
6 ?  J/ B" j- M4 U3 }5 p5 x! a: R, V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 Z6 x4 K  ^0 ?
4 y6 m& ^8 ~8 Y" f- z9 U: w7 O* r+ F# _* H' b

4 c" v7 K' S/ P% Z




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