嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 m; v- h( C+ ?" ?1 w1 f' @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ x5 d/ Q! s' ~/ z) k2 e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) F2 v( L8 B% D. m$ H0 b# ]& P/ b! }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ n8 V7 F: D$ \, X" E
! y  L3 l+ c& K! P8 z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ J7 z4 B: t% e
/*
. [3 B, m- [; q% A- g1 i1 J* Check memory range for valid RAM. A simple memory test determines
+ y6 l, A  m2 k2 g* the actually available RAM size between addresses `base' and
3 d2 r; \7 n4 @2 i  s* `base + maxsize'.
9 k4 k+ D0 c* z; s1 v*/
6 G0 M" s9 G& W4 U, _9 y  along get_ram_size(long *base, long maxsize)( G* R' u% q# e0 D8 Z- p  P
{
5 }* _* S- z) o) G' U, `        volatile long *addr;+ N' _" H$ W8 Y9 j8 M
        long           save[32];
; K; o9 F# ~0 q8 u& L! o        long           cnt;2 J8 k" w& p9 y( }
        long           val;
8 m/ E( A- P; v9 d9 M        long           size;* P1 o6 R, R9 `9 Y
        int            i = 0;) }% R+ v( o& P, T

, M; m+ c0 `# R4 s+ U' E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 Z- a* M0 A. k9 K" D; E
                addr = base + cnt;        /* pointer arith! */  u# D6 R8 g- `( M; C
                sync ();/ C" S, Z5 }1 q
                save[i++] = *addr;
: G! u7 r$ _4 y! y! N" m' ]                sync ();
: g. I' V, v9 T* @6 V& u5 s                *addr = ~cnt;  L' l. ]9 J$ u7 Z4 R. Y" ?) E9 L
        }8 Z% K0 Z7 G7 k2 f- }! y$ J$ R

1 R, D, M' \% E% D/ P        addr = base;
( E0 h1 t& ]: `3 y3 k0 g8 u        sync ();
7 W" Z- Y( T8 M4 H        save = *addr;2 ?0 n7 W3 E" T# S3 W5 V
        sync ();
/ C5 U, k! v  C: l% ?6 H5 N        *addr = 0;8 B7 s) U, I1 v- E% L- Q7 H% O/ h
0 ^8 ?8 R6 }+ E- _& C% F
        sync ();- k2 d" T- m  j2 @* R* V3 |3 r3 |
        if ((val = *addr) != 0) {
/ z7 D& {9 l, ?$ F6 V                /* Restore the original data before leaving the function.: ~$ P, ?# g# ~2 _, w8 b
                 */
, M, `2 H# x2 C& W6 Z. _                sync ();
" {4 H* \' U8 e' a* t                *addr = save;
! n4 E0 h. e3 r9 h; i! C- `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 a: P* Y) ~2 ]% d& m* x4 O" Z
                        addr  = base + cnt;
/ V( _& u4 i. i9 _                        sync ();+ ?  N! A, D. R' @9 ~% Z' m, ~
                        *addr = save[--i];
. s) l1 @- C/ Y5 j& M( ?                }( }5 \! R0 c* s; p( f
                return (0);9 t  G5 E+ B6 l" l1 T) L  D, p" t" H
        }) S8 A1 i- q% s7 D! l

4 N- G, Y1 s. R9 Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: r' V% [& z/ {; X. N                addr = base + cnt;        /* pointer arith! */
+ m" Q  Y9 h  H+ t$ ~- Q; [) y7 ?' S- t6 K                val = *addr;0 x" G6 g5 t+ Q
                *addr = save[--i];
; x1 J& T7 z7 u                if (val != ~cnt) {
/ @' g  M& H' R) T3 F5 g+ x                        size = cnt * sizeof (long);% W( w' i. u: k" q! X7 K% M
                        /* Restore the original data before leaving the function.
2 V' R  X& [: V4 M7 b                         */$ z7 s* t" d* [# l( h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- I& d  P' J- l0 u7 W+ ]- |8 o* P
                                addr  = base + cnt;# L. P& Q9 N% J
                                *addr = save[--i];
6 V- P/ ?" I" G9 j6 }/ j0 ~; E                        }
) r8 a7 d  f$ a' \% a6 X                        return (size);
/ V$ x9 Z1 g8 W* P5 b5 ]& e                }* l' W1 S) @0 T2 D& j& a0 g
        }$ C: U( R1 \% V# P3 g* h
+ s% Q5 u( P" f% o. A  B1 X
        return (maxsize);
) \9 |7 a  [5 ~4 ?; F* w}$ x5 `5 @* k9 O5 f( y1 t# P: j! R2 {
int dram_init(void)5 U* \( r# _: x! F: K! z
{
- l0 T& S) o( k8 J        /* dram_init must store complete ramsize in gd->ram_size */$ b4 R# X8 c& X
        gd->ram_size = get_ram_size(( [% r) R6 @; D7 r+ m" E/ w9 {
                        (void *)CONFIG_SYS_SDRAM_BASE,( ^/ ]8 p+ n$ @6 \# R7 _
                        CONFIG_MAX_RAM_BANK_SIZE);
. o. B3 `- f, F4 F" w) _8 N# C        return 0;8 g" A8 l8 ~* m5 [
}& @: \, T2 ^% W# v' c/ c" v
* I0 i+ ~2 U7 _$ N
* z( o2 F7 A9 a6 s* j; J: X# n
. a0 k( u- l& O% i: U  `' g

+ s! v$ {1 [$ |0 ^/ B5 j- P( QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( g' a* ]. U0 Q2 s; [5 d; B. f
+ s7 ~- ?% A' n# X% F* y0 X- o- E2 v5 E) O+ @( i9 C1 c0 P# D2 v: n
$ D9 x7 W5 @  @& T0 x, ^7 ?





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