嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 j- L6 J6 ~' [4 N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" V3 I: ~4 m* |5 s7 l$ I$ w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' |; w; k/ R+ o) J% C
: R- s/ P, g7 @; D5 z4 y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ T9 |! [" O- e& ~

! ^% u, Z, X5 z/ Z1 N  h! D- `9 h* g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" r9 k. G4 F; a& f& d; U
/*
9 r0 f, Z( C3 P. j! V3 z* Check memory range for valid RAM. A simple memory test determines
; C: i0 @  Y; i- M* the actually available RAM size between addresses `base' and9 O3 k+ J' v. X5 }
* `base + maxsize'.
( j5 T* R% v3 C$ \6 m*/
  k5 V' o# _% w2 k+ B. r4 Nlong get_ram_size(long *base, long maxsize)
0 K- s# g0 x6 W/ K8 E7 b* |: g{
% k% d4 [* F2 s7 j9 Y9 |        volatile long *addr;
4 B: ^1 J/ {1 F" i        long           save[32];# Q" L- u8 m/ `# ]- ?/ u/ A
        long           cnt;0 o9 L4 A0 v8 w" }0 B" v/ Y! s
        long           val;% `$ B+ \- ^1 [( o% q5 q
        long           size;. ^& i$ u+ f- z3 r: b0 v
        int            i = 0;# z* i. U9 `" a7 d

3 K7 b9 a: N- v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& q# Z; |9 [, r3 a9 {* F% K                addr = base + cnt;        /* pointer arith! */
$ N! g' e% t7 e8 [                sync ();
4 N6 `! o! @8 _6 d# ?                save[i++] = *addr;
1 f9 m; J2 I" W; d  [9 M                sync ();
6 p; [& M% J! @                *addr = ~cnt;
5 h! s! t# D- L2 B        }# G$ y! _4 t% u9 e0 P6 I) V: i
( j2 U2 T( z9 W( D$ L/ ]
        addr = base;, F0 f6 i3 n: V2 s( Z/ t
        sync ();! {1 j' g: u) r  G! U
        save = *addr;
; O! Q; x3 |! v( m        sync ();4 o/ t" p1 b. F) F
        *addr = 0;
. W: O4 @# H9 G
  i& X; L  K! W, u. m7 L+ j        sync ();
, M: v1 |# \" h6 x        if ((val = *addr) != 0) {
; q: Y, `, v8 _! D7 Y+ T1 \5 p- [                /* Restore the original data before leaving the function.0 k2 t: a0 [( E3 d% q
                 */6 r  ~/ m5 n. j. B( I, P- X
                sync ();
# k0 O% X1 ]! T* E, L$ ~/ E                *addr = save;
! S& V. S6 N/ b7 F8 \, [) p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 |4 M0 C4 P9 R( q& {5 ?) c
                        addr  = base + cnt;& F1 C: Z; h# F
                        sync ();
. R( A2 z' C% V, r' ~! D3 }& c                        *addr = save[--i];$ ?. K  @& L# n" ^/ J
                }3 S! d4 @6 |. d3 m
                return (0);
6 h6 g: Z6 O, x* }4 O        }2 |4 k; @. L  ^9 D4 Y
( o+ z+ X5 ]3 ~" ~8 k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* a4 o# S& j7 y3 \' K6 m' x                addr = base + cnt;        /* pointer arith! */
6 ]9 |3 `3 n4 k                val = *addr;
1 B& r, T, |9 b' `& T                *addr = save[--i];
( c; G2 ^& }- }5 q/ j; d( }- Q0 M+ W                if (val != ~cnt) {+ S% i5 i- V( ?4 q& v6 U6 z
                        size = cnt * sizeof (long);
0 r, o( r" q" k: a) \4 `7 U                        /* Restore the original data before leaving the function.0 v& W, U/ |9 E9 @& P# _8 u. j
                         */
) X% G( {( U5 M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 K, k' q8 C! ?- p6 h* {# ?; B
                                addr  = base + cnt;% B9 Z$ G6 c. s+ P/ Q# r
                                *addr = save[--i];
  N/ x; S! ?% B4 z* z+ r                        }
, X) q! d+ d2 Y( Q+ o                        return (size);
3 U! ?7 U5 _' l0 e) z( Z( }# {                }
3 F; [+ W4 T/ A& q9 h7 N        }" t5 d, q9 K' \8 t* l

( p' d( A/ Q, j" `5 r6 ~        return (maxsize);
0 j" B7 E4 C$ Q" w" }}$ A# N. X# g1 _
int dram_init(void)- \6 ^2 b" f, y
{
0 F7 w( n8 w( K: ^! U        /* dram_init must store complete ramsize in gd->ram_size */
: m' ^5 f" ~8 p  H- n7 y7 `& j. r4 U5 `        gd->ram_size = get_ram_size() e& \6 ~/ y7 f4 W4 @3 S) B2 |
                        (void *)CONFIG_SYS_SDRAM_BASE,
5 i6 _8 Z2 I" X4 n/ a7 W$ K                        CONFIG_MAX_RAM_BANK_SIZE);
8 ^) r* H' j& K        return 0;6 f' L9 H  @. l$ a
}
- D' X5 D- L  h- d% |8 a8 ?5 F8 s2 r# x

1 k5 V* F7 w( m* f& y7 O1 d. G  I) Y* v: u
, n9 J; X- q* I/ g7 I1 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 \% X9 l, P1 j' y2 C; h

- D, R% m! R: L5 p/ }, |
0 ^4 v& O& N, n  J
+ I/ U$ S0 ]4 g  m, D





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