嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 b) u$ a) Z! g5 g0 M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 T. F( F8 `4 J0 Q0 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: j# t5 u  {0 F' R
$ c% a: x7 u% g& l2 p. B- Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" Q! t" s3 F! R1 G

1 v2 w1 D+ e- P" j2 d/ e1 t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# H, a5 T' k5 W& {, R; g
/*7 u! s9 n) T( u* C5 s
* Check memory range for valid RAM. A simple memory test determines
* w0 I5 D6 B7 k( s* the actually available RAM size between addresses `base' and# n9 |+ f) s8 n3 `2 I6 E
* `base + maxsize'.3 a7 B5 X/ \) c
*/) \* w2 r  J# h
long get_ram_size(long *base, long maxsize)
" d1 f3 N" b4 F8 A/ F" ~6 H5 b. h* `0 ~{
; R4 q) {% t0 X        volatile long *addr;9 \3 o0 ]. [  c) y; k- G2 y1 S
        long           save[32];8 A7 g! l" I  w
        long           cnt;) N4 A, h4 ^0 R6 u: C0 v
        long           val;
9 U+ r3 e5 l! f1 [/ h* i7 `  m; ]0 X        long           size;9 t. q2 @3 `4 ~' q+ S0 r
        int            i = 0;/ I9 l- N  y3 o" s

0 w' u/ W6 @# `. p2 `  g* ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* W# N# v8 z7 u. {& z
                addr = base + cnt;        /* pointer arith! */7 D9 |0 o' I: [: ^
                sync ();
' t9 f8 Y) N  D2 z1 s  P- R) U                save[i++] = *addr;, \2 Y# I& S- D, A
                sync ();
$ y5 R7 y7 p# ]: b( e9 Q6 {2 z                *addr = ~cnt;# [7 z: _" W1 K6 Q7 V
        }9 y% F' N' R; D; G2 l7 \

( j, p+ `( _; G/ h+ g2 a        addr = base;4 J" t( q* ?( S7 k  X$ P# }
        sync ();
6 z  R* G, n. ?+ e3 @6 T1 m, ^        save = *addr;1 C/ ^; ?' m* x6 t4 B* n
        sync ();
# r9 O# A* _2 r        *addr = 0;- R4 R& ?' f% E% `$ m& U9 @

/ Y: v6 B. V. ~7 Z& k        sync ();4 ^3 {- V+ K4 T
        if ((val = *addr) != 0) {
" o0 t$ M) @/ y; M  }                /* Restore the original data before leaving the function.
  K/ H& S: B% Q6 ]                 */, G+ K2 F3 x& @3 H
                sync ();& V, k" J; L% |! C! m& K
                *addr = save;' u$ c: Q- b- z3 f4 J5 e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ H3 N# y' W3 b$ H9 ~                        addr  = base + cnt;2 M# D/ s9 ?9 g: m7 o/ p+ v! g7 A
                        sync ();& b  F4 P* x3 u# f, c: q* ?
                        *addr = save[--i];' J$ @- ]+ q/ o8 U3 q0 @; w  [) S
                }
! R; E: E# z9 P! }                return (0);
6 P) o+ t2 R3 G5 Q" a$ d( L) b        }' l+ j7 E+ D# z& ^. @% [5 z/ q/ Z! Y
1 b2 w8 N0 ]# t- h8 }5 e
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 k* y8 Y) G$ m; G, Q2 t
                addr = base + cnt;        /* pointer arith! */
1 X" W9 t$ U0 ^% @2 s. f                val = *addr;
+ T3 e1 e9 }8 o( y                *addr = save[--i];
4 b( `7 P7 m4 J+ b                if (val != ~cnt) {1 O3 _- a+ o: U7 b
                        size = cnt * sizeof (long);
/ p: o9 k7 V8 y* G3 n                        /* Restore the original data before leaving the function.
) F5 T4 R: n) [6 q/ n9 w: ?                         */
+ m* q; E% \& ]. c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- z: ~) o& B. @9 M; d  M- R" @
                                addr  = base + cnt;
, B+ B4 \+ B! D                                *addr = save[--i];7 H6 M2 s1 z/ f7 N# o
                        }. _/ I- Q/ C  i: P. K4 q2 ~9 I
                        return (size);
+ W1 R- O3 [7 j$ i  W                }
0 g9 Q# E4 E3 `! v' e        }- y% Q& V0 W/ J7 u8 k( ^
  l* t3 u) c! R3 ^
        return (maxsize);* H( b6 q# _0 j9 r
}
+ x' G5 j- ^# e  n' @int dram_init(void)
+ G! X5 O5 a0 ?3 H3 O7 C1 T6 h{
* P$ X3 I9 D* Y+ ~2 G        /* dram_init must store complete ramsize in gd->ram_size */
4 o1 e& u3 C4 K        gd->ram_size = get_ram_size(! {  B% T7 o. F5 ~9 I! k6 q
                        (void *)CONFIG_SYS_SDRAM_BASE,
) d8 U' r! v" @3 J5 ^' x                        CONFIG_MAX_RAM_BANK_SIZE);8 a; T4 _; F9 @% r8 l, h8 b4 U: u
        return 0;
$ t& h: T7 @8 m6 t}
# _! W" s0 b' N3 ^
  E6 r: v' }9 T: m4 Z3 H( y7 s* p! ]+ @1 H4 O, @

" z2 [( L! K2 c0 r8 R5 m/ a6 L% w5 A. D( V8 ]3 N  t, {' J( ]. e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" G, {: o% S& T
  Y! U2 Y  I6 `+ _' A( b; e/ H3 T. L
0 b5 S$ j3 v: j5 Y





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