嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 |2 m+ s4 f5 f5 [2 X: P核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" D5 s1 c# h$ N0 j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 p- G- E/ b2 r7 b/ \5 A" X$ L+ _

  m2 H! R& G. {- u* a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& D0 _- C- L- U

! Q/ ~' U- s+ D, Q# z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& p0 s: {" C' @% [  [/*- a8 M: F* u) d$ ^3 U/ z
* Check memory range for valid RAM. A simple memory test determines+ z. o! W& U; g. R5 G. I5 c
* the actually available RAM size between addresses `base' and
8 C' a; w  {  m* `base + maxsize'.% N, s- s' t6 @- Q5 I! c5 _/ M
*/5 z- E! [! W; q6 |2 v2 ?
long get_ram_size(long *base, long maxsize)& G0 X4 {/ @9 @3 I& f
{
, J8 i# r( [8 e" H. k+ L        volatile long *addr;+ `5 |1 f3 z1 O8 T
        long           save[32];: S9 Z7 L) Q5 d$ Y. k
        long           cnt;8 E) r; [  F+ A4 L/ L9 ]
        long           val;
! |* B) Y$ D) J  p) E        long           size;
/ c. E( _8 T* ?( }6 y        int            i = 0;1 _& v% c. i. s0 y
3 f. A6 H3 R- B  D! L) d" k
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) T4 ?0 w( f2 A0 ^; y                addr = base + cnt;        /* pointer arith! */: K6 h8 s) s& }$ ~+ x" M
                sync ();
" i' \: w& i7 ]5 c$ i% ]                save[i++] = *addr;( T( W5 X  |& L
                sync ();) A. o% u- r1 x, }( n+ X+ t9 @
                *addr = ~cnt;$ {* r2 o( G% v/ i
        }& j) {! }* Q8 W2 n1 u

9 r9 @: }8 ^4 y- K3 x% l        addr = base;
; m; ?6 b' K8 d4 K        sync ();' ?' \2 x+ Q1 d% B4 G' g% |1 t
        save = *addr;
  g! I/ A" _4 s" e8 q        sync ();5 F' R9 H" o2 {6 w6 D
        *addr = 0;. _! W5 f# Q# w9 V# x. k+ q3 E/ W
% L! ^' W# V( b1 C7 q
        sync ();
. A4 j- ~' v( C; d        if ((val = *addr) != 0) {
* s4 B, `6 g6 D3 T1 c( e9 ^7 Y                /* Restore the original data before leaving the function.: m0 h2 H( L* P$ o. H4 G$ F
                 */
/ y; b1 r) v+ v                sync ();( l1 b% y& c* C. f& b: c) {7 O: r
                *addr = save;
1 X: |! O7 o# s) y# i                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" J: @6 i; b0 f2 q6 _
                        addr  = base + cnt;2 a! T4 s6 \; v  |, z1 c; l4 V
                        sync ();1 o3 D8 f# O7 z- [$ A  t& |$ {
                        *addr = save[--i];
( _+ X/ O& @% e; w* l% d                }' i+ a( L/ L4 ^3 K
                return (0);
6 K3 R% R. p" I4 k9 w) H8 _8 g        }
$ j* y1 u. d/ m# k' c! o, }) U' Q+ L, m, g% C$ {5 H- R
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! j& c# s  s" J! j! a( L                addr = base + cnt;        /* pointer arith! */) e1 ]; a& U9 x% W7 w$ W' X3 h
                val = *addr;
4 y7 C% Q" \4 D5 v# T( _                *addr = save[--i];/ B2 T, X: Y6 J6 a' F
                if (val != ~cnt) {
, o6 H  q/ X4 b  C% O* A                        size = cnt * sizeof (long);
0 {- L0 y) a/ p6 T# ?                        /* Restore the original data before leaving the function.0 U$ V2 n0 e5 K6 c% l/ o$ T
                         */
: ~1 g; S+ _  ?+ N3 h% E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 J5 X- \# @8 n; y0 J8 |                                addr  = base + cnt;) v$ O* \4 [6 ~" ^
                                *addr = save[--i];
" A' W9 y% r' ^3 n* E3 S                        }% m% ^1 d) B2 r4 M) Y
                        return (size);
% l1 R! v/ r2 z# X; j                }
2 K! Y$ v6 e& F% ?$ k        }
0 ^, M7 {* `; S: {, X: z) ?: I% j4 b; U6 r  |7 f- _
        return (maxsize);
; N  P5 F& e+ O4 `' I8 x}8 E, y) r, w, V  _' a$ e$ Q& w
int dram_init(void)
0 L: z  e2 }' a( _: s7 [{
' B: c# O) A8 k% b        /* dram_init must store complete ramsize in gd->ram_size */
3 \% ]% {: f( V2 c# y4 {; d% y        gd->ram_size = get_ram_size(
0 r6 Y& d5 W- i! m                        (void *)CONFIG_SYS_SDRAM_BASE,
% b& Y8 R( P/ n$ V& L3 {# O                        CONFIG_MAX_RAM_BANK_SIZE);; x0 s' d/ I8 e8 \% `0 D
        return 0;
6 ~, I' d# O( i6 {! D* S}5 z! H, T8 X4 F* o4 q5 ~

; g$ b! H6 N; _
' J& I4 F) x; F% k6 ?# \* M" M% w' h: i8 [  j/ A* J
. P+ j! V/ R- Y$ x6 t0 `* n- b& c* @# w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 R+ m, Y7 c* W& U' m: y* ^5 f8 }  {  e( E1 L6 {* n$ t

8 U  n' I$ P; E. _
6 n! {2 W+ `' D+ [3 q% O4 N





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