嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 u: q, h& w' z1 S) d7 c7 g) }) f
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 A& E3 F0 b7 m0 u" R& m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 M$ s( R# \1 |. M) Z( ]4 E* ~/ T, v! P! w3 ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' i( t" S! v, R  Z4 ^0 r
- N& i  \) W. C; ^. H* c; I

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ h# y! R0 m% Z! v& L
/*
; S$ [# M! P8 O. k' W" F& ^- T+ v2 K* Check memory range for valid RAM. A simple memory test determines
" Y' e( f2 q8 F% q: D3 I* the actually available RAM size between addresses `base' and3 {- F! c$ E  ?5 x" R3 X4 o% {2 P
* `base + maxsize'.
1 a- Y- c" Z6 ?( O' ?  V*/
0 X* F9 i6 M: N: R- m5 slong get_ram_size(long *base, long maxsize)
7 H1 c7 y) D# P( S; f2 X. A{6 m) r5 A, L& F' |
        volatile long *addr;
/ h& U# b- X* q9 y% \) u" v        long           save[32];
# @- Z% E) [8 Y: h$ M1 |. U        long           cnt;
/ m- P6 f" n! p2 J+ ]/ c        long           val;
6 r; [, r! B4 G- n, K        long           size;
- N  L3 j# R8 [3 m        int            i = 0;
( ?4 z0 {0 j: P0 c3 w  Q+ J( }) c+ v3 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 |4 U" |  T  S4 p1 e$ c                addr = base + cnt;        /* pointer arith! */2 d% k; E$ M1 v: _, V5 f4 _5 j) x
                sync ();4 b1 I# k; c* \/ v8 c9 F
                save[i++] = *addr;0 e! b5 `- S( i- ]. d+ }
                sync ();
7 k/ ]2 x7 U- ^* r6 c                *addr = ~cnt;( _( d9 T* Z. n4 y# |6 c1 d
        }
. m9 K% b0 Z3 X6 W0 b2 T
6 X( p, _8 x8 a9 ]1 U6 M6 x9 L& b        addr = base;2 |& ^: s8 R9 i! p9 J  Y
        sync ();
- i% l% n/ a" t# L* Q        save = *addr;4 r- l& ^2 V( }7 v" _9 _5 g
        sync ();- Q# [) F& P$ ]# U2 a; u4 t% W
        *addr = 0;
0 L, b+ g8 k, V1 i3 I1 m; b
- Z, q' B) B4 j; D1 b0 P' d2 _3 R        sync ();9 P. |0 n0 A8 H5 R0 p
        if ((val = *addr) != 0) {
1 A% R; ~$ u' B, p                /* Restore the original data before leaving the function.3 E" B6 w! H) L& U
                 */
8 S( V1 ^2 C1 L( k                sync ();) T  n( `8 z8 ^/ R
                *addr = save;
5 {: ]( b3 P+ f2 x                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; u, d% v4 k' \" n                        addr  = base + cnt;& t: e0 z) l( B" V
                        sync ();& C, I/ n- k, c3 }! |; g4 l
                        *addr = save[--i];- A0 d( ^: b* n' ?4 L* p% l5 o
                }) X% H+ k2 T2 F! U- L) X: ]
                return (0);
5 X3 u3 d/ Q0 O) C0 T: c        }/ v, k' ~4 e$ S

6 I9 A$ J' K1 ?( I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: v3 F2 j4 Y& c. q7 ?# R                addr = base + cnt;        /* pointer arith! */
, X3 s  H( `8 e0 ?  ^4 ]                val = *addr;
# [9 E6 Y+ |5 Z9 n$ t                *addr = save[--i];
$ K, N. G6 [0 k5 l& D0 ~" T9 N                if (val != ~cnt) {
3 Q: s/ |* M) n; F4 s5 H                        size = cnt * sizeof (long);$ s; T0 P8 S0 w7 U8 k0 N9 n, ~
                        /* Restore the original data before leaving the function.% S: b+ g( q! |1 n+ l. r! I( J
                         */# |! Q4 i+ y. D
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" C+ {' v0 d) k0 p
                                addr  = base + cnt;/ T2 q+ N1 o: G" y2 j1 V
                                *addr = save[--i];" o, O  _9 M7 L1 |
                        }& c/ B; h$ k+ `% Y" i- Y" u5 D3 J
                        return (size);
, ~7 o0 }: l+ c1 c( v$ ?                }7 f$ @3 s8 {' f1 |; o
        }
1 _' d; t4 ^+ M5 s9 u2 D4 g& O; a8 X2 [+ E& d# |" H. o
        return (maxsize);
5 r2 {. W7 c- X}
( j7 e, i( i6 x# o4 Qint dram_init(void)% U6 d" S+ s. o
{
- P2 a4 m( R6 z1 z% q        /* dram_init must store complete ramsize in gd->ram_size */9 X4 }' a7 I1 b+ w* O
        gd->ram_size = get_ram_size(
3 ^6 C. t: N  F3 b6 j6 t3 t                        (void *)CONFIG_SYS_SDRAM_BASE,  }4 v3 p2 R# X( @# ?
                        CONFIG_MAX_RAM_BANK_SIZE);* C3 Z) y$ R- M
        return 0;: h; C3 |- ?# y' ?( U
}
* p# k8 x+ k$ B# ?" Y* h' Z1 {+ T! ^" ^$ |5 n$ z' W- n3 {* T
9 v7 M; i' q+ }! ~6 G, {1 Q
/ Q6 T2 Q- }6 x% s4 q! i

) h( e- k3 K$ {' d; ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 s, R+ k# w( I1 @& `
! s% P: v. b" ?. [1 Q5 R8 O# `
' l6 G! {/ d+ J3 c( a
' R1 N' \  z9 }& R3 P- r6 y! c, P- {: c





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