嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% T( P  _8 r1 ?1 e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 Q' L& Q0 Y: n: s% q5 `这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: H) [  Y2 h6 L& `" z! ~( ?
+ c: ~# N' k0 C& U+ ?; Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; g- I* `, k& H, S5 J; s

7 E) C1 j( C# _* i% v9 `9 d, v  X
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 }; L9 {, I" Z0 V8 ]7 Y  F' j
/*2 ]( M5 N# d0 }
* Check memory range for valid RAM. A simple memory test determines# z* P. F5 W( q( X7 Y6 c3 c/ v8 k
* the actually available RAM size between addresses `base' and4 d2 Z$ t! T( t: {- O, n6 R
* `base + maxsize'.
5 L8 }' g* g3 K*/
% K* I% Q# f# r# [  z0 L: Hlong get_ram_size(long *base, long maxsize)0 a5 E5 f3 K' s+ v! z# y+ [
{
2 t1 O" l: n" l( g- W        volatile long *addr;6 f6 P  d7 H0 X
        long           save[32];/ ~8 s) p1 f2 s
        long           cnt;
  h' R/ k1 D& w7 P        long           val;" V$ D1 h( D0 n& Z) G
        long           size;
2 d7 i: [9 P* i' o9 K        int            i = 0;
9 Q5 b! _$ |  \/ w) W; s: v5 b; s7 _# K, E8 q, y* I( ?
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 x! q' W' V3 W7 A3 Q0 @- l- s5 [
                addr = base + cnt;        /* pointer arith! */- j2 N0 q( z+ Z) l
                sync ();. Z; f1 W* l9 r- c! e) B
                save[i++] = *addr;3 I# Y; a6 n2 t9 g
                sync ();9 w$ {8 g; e( G2 Z2 _* v" |
                *addr = ~cnt;
0 G# k# z* z0 n1 z* Y5 z8 \; X        }) T4 e+ I; R$ ]- @' T
2 ^6 e" O* {: _
        addr = base;, T4 f/ Z& g% `; J( w
        sync ();
; |8 `5 x+ q2 J3 [1 V5 e, A1 S        save = *addr;. G! B* M8 A) A2 [* f, g7 z# ~! Y5 r
        sync ();9 T# ~. R: {$ V
        *addr = 0;
  u6 M; P, u% V% A" L4 k2 J- F; [- P: \) a: ?5 I- e7 i
        sync ();. x; E, Z: J4 H) W1 e
        if ((val = *addr) != 0) {+ ~- L3 i& S# {, [- s- x% a5 h/ E3 l
                /* Restore the original data before leaving the function.  }( b4 T" ]! e
                 */5 [4 r# L) C& ]- I1 |
                sync ();* L& [. g$ o% z) u' m
                *addr = save;
$ O5 K  h' S. j  R4 }3 _: d9 D3 A                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, r2 j( E* D$ V) r% b; R
                        addr  = base + cnt;
% v1 f( k$ }* e' i4 @/ I/ n, |                        sync ();
' H  ^( c  T/ v; m                        *addr = save[--i];
' [# ~! p+ ~( c% b, i                }: S# q7 l' t  O3 `7 Y4 p9 Q2 i8 f
                return (0);+ o8 u0 _3 Y* }7 F. b
        }
8 Y$ Q4 w' D! N" `/ v' Z3 c. N, b0 f) K! ?  y0 b0 W2 l$ X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  {3 {- @7 r. x9 W$ }2 c$ D
                addr = base + cnt;        /* pointer arith! */) |7 q+ t( v% d, g1 y; K
                val = *addr;5 S1 d% A( T$ R; }
                *addr = save[--i];' S3 y5 f9 ?) b( q" u
                if (val != ~cnt) {
& x* A& N4 }- R+ J5 ^* S1 c( t8 N                        size = cnt * sizeof (long);
* `7 L# k: [( j2 S; i9 W+ f" `                        /* Restore the original data before leaving the function.
# H# n* g  x- `: I3 {4 C" F/ |# M- A8 @                         */
) y1 i: ?6 M+ h; G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ [( @# D* B$ v                                addr  = base + cnt;: O1 b' r. v" T% M
                                *addr = save[--i];2 ]3 w' N, K7 A" r. A+ Z. U
                        }; u$ ^# T  h3 r9 m! b* X
                        return (size);* E8 x0 H' O0 g2 X! H5 m1 J
                }- E! `! ?0 g% C( `# [. H
        }
7 t2 a1 s! s# P
6 Q) e1 e+ D; p* {        return (maxsize);5 F. t6 W& d: ^' n
}
+ v/ z" P* J7 @: {; J! Lint dram_init(void)
* I% h" r) @5 {; l) M! N9 b# X5 U{9 ~  ^; F5 @# u( S! ~4 v
        /* dram_init must store complete ramsize in gd->ram_size */
* u. _( x) u% f$ d        gd->ram_size = get_ram_size(
) ]* `  e- `6 m; f* h) t                        (void *)CONFIG_SYS_SDRAM_BASE,; V. l  ^6 b3 P/ F
                        CONFIG_MAX_RAM_BANK_SIZE);
1 Z6 e- ?: Z/ _        return 0;
, p6 T# o: p( S, \8 a}- `) P. l, h+ v# G1 Y
; P; @, w6 O: W. P* B( |7 B* \" Z' [

" ^) V( u2 @% x% s( U6 c5 w( b
# P( h$ G7 ]/ b1 S0 R* D4 p- y
) o) _, \+ Y2 B3 p" E: p9 @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- e5 [" g" B' H+ Q/ ]& p/ p5 L
! V( W3 v8 J, l  C+ x7 Z9 t& q: n: f& v
" F' E0 I" A3 X; @9 g! E





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