嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 m* I: k( T0 M; R! N7 p" \# T核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 r# s1 F2 v# z% m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  p- ~( f# M& j- @. ?

' t* L* d0 U0 I" A+ P) H8 W是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: F9 i) x! J( o$ c0 z

, b7 P. G& v0 }1 k8 [) q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& B% Q! O! i; w9 F7 D
/*9 M" t! Z6 a8 _! {- W$ J& b
* Check memory range for valid RAM. A simple memory test determines
$ q# t4 H3 d% P4 D, L8 O5 f* the actually available RAM size between addresses `base' and8 K+ q0 n/ J. n5 N. s) Y7 \
* `base + maxsize'.
2 q9 M9 V! p) V0 s+ U*/3 Z! n; b" A1 x: u1 p
long get_ram_size(long *base, long maxsize)
7 j* z+ G6 T0 X( ~* G$ I% P{
6 I# x# B7 |* U; h/ k0 E, y        volatile long *addr;4 N6 O( E2 G/ g
        long           save[32];
1 u8 a( a5 G, A) l% x; e! G        long           cnt;- E7 Z. p7 e- i" l
        long           val;2 W1 q- E8 P' J: b- T
        long           size;
4 y6 I+ o3 Y$ [. q- `+ ^' s        int            i = 0;% N1 d8 ]0 [6 K. t8 t
' W; T& U5 K* M0 Q6 ]
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ h, `) C+ ^0 h% m9 z+ n" H. {7 c! U
                addr = base + cnt;        /* pointer arith! */
9 S! n. m, m) \                sync ();; V+ o! x6 g. i: i9 e
                save[i++] = *addr;% l9 n, c. O0 f+ Y# Y! r
                sync ();3 @9 a; ]+ p+ G* j  e5 j. n
                *addr = ~cnt;
2 R! s; k9 V9 W9 E        }
, t5 P" `4 U5 z# s. O" o
% p) k, H/ I- C) a        addr = base;" U+ C1 t8 q8 N% w9 s
        sync ();
' k6 H% D, B0 i3 M$ Y$ Q, `        save = *addr;1 j4 z2 V  J  P3 T5 ~$ G
        sync ();5 E' X( c( I1 d' N
        *addr = 0;& k6 T3 j& ]# C0 y; ?6 ]
" q/ q8 o2 V! A, X) j
        sync ();
3 }9 P, h: V( Q' }4 f+ @9 g! K/ U        if ((val = *addr) != 0) {3 z, a4 |3 Z5 [, o; \/ s
                /* Restore the original data before leaving the function.( [( `( z( R5 Y, a+ x  O% x
                 */
. [. l* n4 \4 d* @                sync ();% C9 \& H" o, E+ v0 I6 Q
                *addr = save;* n: h1 W  I6 s- p  D( j6 z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 ^# @2 ?( f9 r: g- o. ^5 c                        addr  = base + cnt;* e4 k$ F1 `" |) P9 t- t- f  w
                        sync ();0 l1 m+ S5 P" U) \/ x3 P  J
                        *addr = save[--i];# u" P/ [0 v! {5 u( R5 l
                }
2 f2 m; p1 q. A+ {% J                return (0);! u3 t' f( I  s4 [2 k. G
        }9 w4 \  j3 R' H3 Z. }8 j. ^
6 \3 k9 L3 U2 Z% E7 d/ T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! m! Y; h( B1 H( F& E# e                addr = base + cnt;        /* pointer arith! */
8 _- u7 {/ ~" ]. r! k% B                val = *addr;( h4 h# e) D# I1 _% s, @+ ^- Z, N
                *addr = save[--i];" X* b9 J4 G9 Q4 p" c5 O& D( m8 c
                if (val != ~cnt) {4 ?0 Z% |) N, ~* f6 \- x
                        size = cnt * sizeof (long);( n2 ]" z1 ~! d$ \# A/ s  K2 L
                        /* Restore the original data before leaving the function.
4 |: R2 m' \, b% B8 R                         */
% @+ T" {, x6 A1 E/ M+ w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 F( T4 J8 v1 h
                                addr  = base + cnt;4 V: T# H2 a& t, E# X- j
                                *addr = save[--i];
1 G+ B6 R/ `  b5 o, w  |                        }
+ T! F% \  l' N4 J7 l  K                        return (size);; b/ N( u, M) h
                }3 u' d7 u; C7 t8 f' A2 \
        }
0 i+ ^2 ?' C3 t  T$ M4 C" f2 ?: Y
        return (maxsize);
4 \9 @9 N$ I4 v9 `2 g+ i}
# ^' w4 l# c0 \" Y! l# }int dram_init(void)  e/ B! P# U2 m+ @+ Z/ `
{
5 k0 Z% R* a; Q1 ~6 v9 D        /* dram_init must store complete ramsize in gd->ram_size */" S0 t; y* J& h0 }3 C
        gd->ram_size = get_ram_size(
  u1 P2 w* }$ W" y                        (void *)CONFIG_SYS_SDRAM_BASE,
7 l  H3 P; q3 w8 K  {% v6 @                        CONFIG_MAX_RAM_BANK_SIZE);9 u/ @, r& \) V
        return 0;
) N; w. {& F6 T  z% q}' J+ z; B3 ~# \" p/ {4 g7 |/ m
, Y+ t2 ~( }. J
! E* E2 c3 a, k  d2 R- j
* [% A9 T, e8 @9 ^3 b1 d

1 `4 P3 g0 i! P& C0 y. WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 W$ h/ i+ D( [

3 b: D0 n( W* I# v- {  i: U4 W# S$ E

! e0 i5 ]0 C0 ?% E9 b




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