嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 ?% G& D+ H: V8 A
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* Y. D* F: M' J9 w* ^, m) o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  C  @! c# D% q0 ~3 \* M6 q/ L  b5 E

7 I+ U- I4 Q0 Y8 ?5 S是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" m* d9 C4 j+ I( }7 ~( N1 @& p

; c# v! L/ r6 Q6 l) E; s
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 y! U9 n" A  F6 q* n7 _/*2 G5 i8 C: L  H
* Check memory range for valid RAM. A simple memory test determines' T2 A& G5 u0 l1 C( |9 p- a
* the actually available RAM size between addresses `base' and# m2 p5 U9 g8 J9 d5 c: K: N
* `base + maxsize'.
' ~& k) m; m- w& \*/9 w* `9 @$ \( h# M* g
long get_ram_size(long *base, long maxsize)
* {, Z8 P- n7 C" b{
$ f) ^2 D; Q* i* |& R& I5 R        volatile long *addr;1 K) P4 B: |* Z! q+ k' P
        long           save[32];% r2 @" i1 `) d) @, V/ o) Q9 u
        long           cnt;
; A7 |. T" S3 t" K" F% T        long           val;6 z6 Q4 Y4 c8 q/ i5 c$ U4 t
        long           size;
7 L# P7 G+ n- }( h  c7 i- [        int            i = 0;$ B: ^  Q* R1 E  P$ l4 N
, N# L$ t( z% u5 r1 |0 x9 `+ x5 i2 W
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 ~8 {) E+ ]' T# b# q4 V& Q
                addr = base + cnt;        /* pointer arith! */2 }8 _0 p4 Z. t3 j; ]% @; o! G) a
                sync ();
+ Q0 T. [1 G7 c% a1 ^                save[i++] = *addr;
9 m. A6 o* I5 F0 c; z1 q" L                sync ();7 ^" |0 X" I( _# M
                *addr = ~cnt;- V1 H) j* X  a) i( d# Z2 n6 z
        }
: \/ g" `8 x: ]3 X. |2 B: b' _8 j- [* B) |9 X! _9 G
        addr = base;
: x! @6 o% i- z        sync ();
/ }  C6 P' f. @' c        save = *addr;3 N$ M8 k  K4 k0 h; i0 @
        sync ();
) M7 o0 p  _8 M) d) `, g- A6 X0 |$ y        *addr = 0;
4 M- j5 r8 _0 q, B9 L$ R/ D% ?/ |( m, i
        sync ();
6 t( ?& V' X  i        if ((val = *addr) != 0) {
" n$ N, H5 P" E: \8 m2 E                /* Restore the original data before leaving the function.
( W5 x1 @) I1 k  s                 */. _2 i) ?$ w: u, u
                sync ();
+ D5 L% b) J8 ~* E+ u                *addr = save;! h+ n  V' i) |- f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 b6 b8 V6 p" J. p) W4 w* F% [                        addr  = base + cnt;: y! ~. I( k5 ]4 [' Y& h
                        sync ();
# m; M8 f8 A# `  j( `! \. q) @                        *addr = save[--i];
) }2 |2 n  F% F9 P5 M                }
! ~8 I9 p1 i  |0 `                return (0);
! r2 j! v9 v$ }) I: q6 d        }- s( u7 J2 M5 K0 p6 _3 \% t* x

/ U' A- j7 B+ g: h$ |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" P' _/ p# N; \' m                addr = base + cnt;        /* pointer arith! */% W: |( ]. s. v5 v3 |7 @/ s. _- c3 \
                val = *addr;
9 a7 V0 X1 j7 c% m* `' w                *addr = save[--i];
6 y- L/ v( p: J                if (val != ~cnt) {5 [( Y" y  V( X- z* f
                        size = cnt * sizeof (long);' S2 L7 }/ p8 X. @1 [- k
                        /* Restore the original data before leaving the function.
9 v2 h9 ]" U+ j1 R( A3 W- U# p                         */, S* v5 H0 Z  ?. W7 }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 l6 c+ X/ U( h" V
                                addr  = base + cnt;
. m: o% }6 S( i$ h: i                                *addr = save[--i];
7 I4 i9 e& m  e+ ^7 R                        }' G' ^8 G! r5 N6 h2 z( b. F
                        return (size);$ l" u( ]( P0 F6 t  g; z- f
                }/ y0 U7 R4 h8 S" ~) c* S1 b
        }
1 y4 E! B& L' W3 _' J  ]  l: c6 N2 T  \6 ?
        return (maxsize);3 j& U( H5 l  D: ^7 O4 x& a) H& ^% e
}) Z5 @+ x( I9 w6 i" r, g
int dram_init(void)" v; j8 ]' D+ a/ A6 T  }, O5 k
{" w* W2 w" w7 u/ b! v  B( e% H
        /* dram_init must store complete ramsize in gd->ram_size */
. O% _8 p2 m. v- x0 ^" M        gd->ram_size = get_ram_size(
& G9 w2 Q7 r8 _6 t4 H                        (void *)CONFIG_SYS_SDRAM_BASE,
( E' F6 ?/ J8 C* ^% d                        CONFIG_MAX_RAM_BANK_SIZE);9 L( E, p! \9 z, `# b2 o- O
        return 0;( @: }  O- ~' {/ }" I1 |
}* O8 h% x8 W6 ~& v/ d
9 H. a) T  E- v% q

& I' j2 P1 A  S  H; p; h8 h
8 @9 P9 a5 [% n$ j1 S4 g  q7 l8 w" Q! ?' N: p& z( V" q4 y! [0 |0 B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' z) ^; x& h% M* m! T/ Z. J0 F, _# D) ~% ~" ^  Y2 f
) M  Y& Y+ i# m4 k, W% C

# Q! l- I. i+ R) L! s( F




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