嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 K: q5 u- V1 i) g* `* x* n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. K# p1 D' l; B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% v5 [& ^' o# ^% k
4 R' J4 s5 G& M# l$ F7 i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ L' ?7 z; g  x0 ]) \
9 J* ]* ?& Z. S

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* M$ t  f! I- b& @) I' o; d" @/*
9 @# H/ q& k: ~! s! ^* Check memory range for valid RAM. A simple memory test determines
) x3 i2 S! \, v5 Y3 I4 J2 q* the actually available RAM size between addresses `base' and
4 E; j% M- L& L) o1 Q& e" F* `base + maxsize'.
" l  O5 }% w* K; u+ M1 A*/+ c" K! C8 f0 c7 ]- E( g
long get_ram_size(long *base, long maxsize)& `* _8 W/ ]8 I5 u$ b7 k! g) g
{7 N# ~; [6 G" o' Q9 P- I
        volatile long *addr;8 f1 o  V  h7 V  w  Q$ x  l1 g
        long           save[32];
- f' E6 O  ^( y: h- \% g1 f- J8 o+ t        long           cnt;
7 I3 l* s) y; o6 s* {        long           val;
. P: }. f& y, S* C9 `        long           size;
. q  ?7 S- E: r# [/ s        int            i = 0;
1 t* d* Y) z$ o" }& W; B8 T0 g2 @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ _/ C- K. T/ ^( i/ w                addr = base + cnt;        /* pointer arith! */1 c7 A9 S. @" O4 C' z7 M! [4 @
                sync ();3 x9 U/ \) W6 R# Z& A+ J6 K8 W: L3 B
                save[i++] = *addr;
; A4 H  E% E0 o% _) y                sync ();
# T$ N- P" B: [! X$ ^' a" O) H                *addr = ~cnt;( v, A* U: m' s0 b: `7 i0 t0 m
        }: s) ]8 e5 I. a  y1 k

. P( G1 L# L3 S' e) o        addr = base;  @+ t" Q/ [% g, b( d9 _4 A
        sync ();, l$ _+ d) I8 I/ s6 d5 g0 c( E$ \
        save = *addr;
1 U5 Y' B8 C# o; G3 f  @, ?3 O) r        sync ();$ b4 x( t- m) I) d
        *addr = 0;0 m  S& C% e/ }) p4 n( d! N

  ?6 |. c0 s) T1 B$ H        sync ();
5 T. e3 \3 x/ Q" i        if ((val = *addr) != 0) {. c! |: m" X0 O9 }1 x: `' ]) [
                /* Restore the original data before leaving the function.
+ \6 z! S& i) K9 ?                 */$ p" O3 p- p& \- n5 |# f) i5 ^
                sync ();5 J  y; _+ F/ _- O. _; g
                *addr = save;' j3 @" ?% e, K$ m
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 _. z% U- f. J! q) p/ i% H# s                        addr  = base + cnt;# m& R5 y3 T  [1 x5 a6 l0 J
                        sync ();9 n* I1 G+ N6 b+ j3 v
                        *addr = save[--i];% I6 {6 Y1 n: W
                }
# u0 l$ @. U# F: i3 w; V; G                return (0);9 T  ]8 Z- `4 X, d9 x7 w, R
        }
9 E$ V8 K) c0 t, I; v/ x( |! G' b5 B5 C, R( a/ V
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! s6 d; i! e. S. s
                addr = base + cnt;        /* pointer arith! */3 d1 _. H1 _* S7 C
                val = *addr;0 m/ V' I6 C' n: e+ Z5 m0 X/ d% C
                *addr = save[--i];) @3 O1 s( @) y0 z
                if (val != ~cnt) {" d9 B5 @: V! Y- s: e
                        size = cnt * sizeof (long);
( m5 b! V4 }# H( j                        /* Restore the original data before leaving the function.
/ B7 L) o  g( f  [5 [                         */
6 N& h8 S7 W& N% K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% J5 s' j1 g7 D, u+ ]7 ^& ^3 `
                                addr  = base + cnt;
! {! D, e3 w1 ^/ H: M                                *addr = save[--i];  B- w5 C; g+ ]: R1 T4 n
                        }5 X* L- {* e/ ]3 ]
                        return (size);
7 l' d% x5 R5 p2 T/ p                }( j" n4 H- t! q
        }( g8 D5 d/ Y( _/ Y% Q6 H( D
/ y0 ?+ O6 `! g2 [) p, Q! U( s0 c
        return (maxsize);* _' [" N( D  {$ j
}3 p- b9 `/ s5 B( L# L2 G3 x$ N3 U
int dram_init(void)! F- v. F+ o& x/ [9 q1 F( ]$ f
{7 V( P' }) e7 Y( I4 p4 C
        /* dram_init must store complete ramsize in gd->ram_size */8 G9 I+ d% V$ N, V) @& p  b
        gd->ram_size = get_ram_size(
: K6 j# g+ ^$ R  H5 x& k$ |7 I+ r. J                        (void *)CONFIG_SYS_SDRAM_BASE,9 L- ~( I$ R5 @" ~2 h; U
                        CONFIG_MAX_RAM_BANK_SIZE);. r- [" c8 \- L. v( B- A
        return 0;2 `& n4 ^5 i2 x7 f: x1 G) k" e
}/ e& U2 C5 x# C1 |$ G' Q4 k

1 V( `' c: _& p8 ?. c$ ~/ w
9 |1 |2 j7 H& g1 Q  J5 r# ?7 Z" k" |6 Y/ n% Q. w) a

7 R7 ^& c) k) c5 {0 Q& ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' O5 G0 a4 p) P2 R
1 a! n$ }$ T" ]

& v, m$ U( H9 t/ y
% g/ v7 d) y: s4 ]0 k





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