嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 k+ W9 z) I& s+ s4 m1 i  F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 @- b- E1 R" o1 l! k5 M! B! `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 h, Q% I- g  D% V) T& S
' Z0 T4 x& ~8 {3 c% V/ z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ s7 ^) c8 g5 ^* H% {
* X4 Z" q7 U) s$ K, b
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( y) g2 p* u+ x* b4 s: l8 R
/*
9 L; a7 U4 c3 F# w* Check memory range for valid RAM. A simple memory test determines5 x; I: S0 C9 I0 d+ z
* the actually available RAM size between addresses `base' and- w6 C; C4 b& L6 \# ?
* `base + maxsize'.
  F$ S+ v- O7 f) x: x+ M" v3 z*/  @; h+ j* X* y7 Z
long get_ram_size(long *base, long maxsize), f0 r) E0 Y" [) D4 \8 Q' t6 F
{. M7 j# j/ N" Y0 A. [' v
        volatile long *addr;+ W/ P0 H/ M' \! ?( |: ~1 A, o
        long           save[32];% e* b# I% w9 b$ J3 Y) u( d1 x* Y8 C
        long           cnt;
+ |& ?0 Z. F6 c8 k        long           val;
# B" T' V3 a8 _' D% _4 L. n: I        long           size;; Q" x1 i( V0 `! F; u' x
        int            i = 0;, X- o" F. [4 E# g

) B( i+ M0 W5 J) g4 J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 t  R) C1 t8 \+ K5 h  K% I8 w
                addr = base + cnt;        /* pointer arith! */( B8 j0 p8 {  D, }
                sync ();
; P6 l( Z6 V/ F# H* }: m                save[i++] = *addr;* y$ Z+ P. \/ V- y* B. u9 f
                sync ();
  ^0 h+ G! v$ w9 E                *addr = ~cnt;3 Q7 @3 O" u$ m, I8 j5 H% @
        }/ L9 y4 k* X/ g' G4 R2 @2 q. u( x8 x
. |  e, `5 {& `
        addr = base;
8 @/ }) Q6 K9 B, c7 P8 C/ n4 y' u# z        sync ();, H2 p6 I- I  X, C0 s4 Q9 v
        save = *addr;. [, [5 U+ w$ D& O3 X
        sync ();
  m9 t2 X$ t" v- e4 O        *addr = 0;
" O6 f# G  V: {) y- G& J: G# n+ r7 v( G
        sync ();
- R- P* p6 u0 R% V1 ~        if ((val = *addr) != 0) {
9 o8 v2 Z+ ]: i                /* Restore the original data before leaving the function.
1 [  Y% e+ t4 B( ?2 N7 o: B                 */
6 a  e: M  T  M- u& I6 O' x- o0 y                sync ();
6 ^1 Z! K/ Z* f# {5 T9 B/ T                *addr = save;
7 z9 z+ \% d% A: k- r$ n% |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ i. F' m  ]+ Y9 a. Q                        addr  = base + cnt;
3 a1 m# v* A$ B% a                        sync ();
+ y5 \( O5 ~. n8 o0 @# Y0 H                        *addr = save[--i];
2 Z  {& [( C5 z+ l' F) B, e  a$ E                }& ]9 ^: V) x& G) i) Y; J2 @, {
                return (0);
8 f+ I: ]) M4 ^        }9 \. [5 w+ ]1 B- I

) k  x) U! f: c0 I* t        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 b0 N, A  D/ f/ c! \. p
                addr = base + cnt;        /* pointer arith! */9 W5 n, e9 P0 A$ {, S2 w9 s
                val = *addr;* E  A6 d) u9 y& A
                *addr = save[--i];. M: w( d* w0 v* ]( N. j9 n
                if (val != ~cnt) {
/ b9 \; n/ N& P! T( E! y6 u                        size = cnt * sizeof (long);
* ?$ x7 ~" d# [; l: ]                        /* Restore the original data before leaving the function.0 P7 D- a2 H* F# \  N# Y
                         */
( s/ _2 Q2 J8 o- _' k                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ D! H; C% r1 c- ~" B                                addr  = base + cnt;
* ?6 Q0 x, `0 U                                *addr = save[--i];9 b$ }" E2 z$ O/ \1 H
                        }
0 D* J0 p) H* _1 r% U                        return (size);1 B" p5 z$ m* [
                }+ e6 A3 ~4 t& B5 ^
        }
9 I) f- R( ^0 v0 |( ~
8 J# D3 q& r& j5 k% M, G: ^/ b        return (maxsize);
! t% B5 B; Q5 S0 h}
, _4 S0 M' C6 P7 E$ {9 k, _' Lint dram_init(void)
" [1 T0 c% C# A{
. |+ x$ d8 |3 Y7 h3 ?" ]0 g        /* dram_init must store complete ramsize in gd->ram_size */; g% g" \. e) a) _8 w9 I+ i  ^5 `
        gd->ram_size = get_ram_size(, m/ E( q! Y2 Z
                        (void *)CONFIG_SYS_SDRAM_BASE,  |9 n2 U/ i6 \# A' c
                        CONFIG_MAX_RAM_BANK_SIZE);1 K) Z+ M2 C- L# z+ c' I
        return 0;
& r' B$ e3 J1 u}
9 [& k4 t1 T5 X) [; d
4 Z5 ~/ b. P8 Q0 T6 S6 D) ]$ ~* m$ `* R
6 u5 Y# g9 F: k7 V* J& q
+ z4 c4 b  @! N1 N5 m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 Q- C6 ]) E  F( Z
0 k, `7 e6 u- _# m3 R
- h+ E1 L' Y" z, X( f8 B$ }& ^

- C! z5 I! d2 Z  u* ~4 @1 B( p7 [




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