嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* t0 z1 w4 }. I) ?: k) ^" n+ _核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) G: R+ A* ]  V9 a+ z: R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; b* ]2 O# @( z) ~# K0 ^
6 h% S! R: k' S" ~8 X  u. m$ P( a: |是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: j% ?5 m) n( a7 a8 t
! k( @) W% d' P! o1 }
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 {* C" S& P2 b/ b# _/*  ~) q+ m0 g: X9 K  F9 J
* Check memory range for valid RAM. A simple memory test determines
; z; j. ^2 N$ A* [* ^: l* the actually available RAM size between addresses `base' and, Q/ \7 O" F* N/ G% W. T
* `base + maxsize'.
3 C2 }8 y6 v. I) `: N*/0 y0 r1 r9 M- b* q' H$ S0 i
long get_ram_size(long *base, long maxsize)
( k- B0 a5 S- ~/ y{, ~0 ^, b/ }( D
        volatile long *addr;
7 ]3 [0 d' d) U& x" X  ?( J) q        long           save[32];( g- J3 z  T+ t- ?
        long           cnt;
$ G7 r7 K+ `# }; k8 L& Y        long           val;
/ s; S6 @. |: V; ?8 V2 H# [" U# h        long           size;
% D, ?* l0 w: G        int            i = 0;
+ p9 b, g" Y1 W  N% D
4 q: P2 b: b* R5 g+ Q# E) |1 O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' K$ X/ s$ J& ~* U
                addr = base + cnt;        /* pointer arith! */; d, W5 z; s; O4 q2 m
                sync ();7 \5 o1 H( R9 ~& T1 }' g9 \  b
                save[i++] = *addr;. G2 ]9 r4 ^: O
                sync ();
  A( E4 y$ G: y                *addr = ~cnt;
0 [) f4 H' V  ?1 ]/ \" `& V1 `$ U5 u0 T        }
1 {, Y, k5 N: t5 ]$ ~1 e9 H2 u& `- ]- b6 ?. S
        addr = base;
5 |2 m: U6 h6 }( q7 M1 E6 d$ V% n        sync ();
" X# r3 G& p2 h' r        save = *addr;2 g6 {2 s* q, r7 ^7 v* w) t
        sync ();
& I- _) n/ z4 v3 E# @        *addr = 0;; Q/ g. h/ E& a5 i/ b$ s+ P1 h

6 P% }; A7 [* O7 _        sync ();- P, l- l) i9 J9 L! E, a+ Y+ f, }
        if ((val = *addr) != 0) {$ V+ E1 f1 M3 q
                /* Restore the original data before leaving the function.
1 Z+ w1 h0 m/ b0 _8 |' q6 w3 v                 */
9 t+ H( }$ N  f3 Z                sync ();
, _7 t0 ]+ a1 M                *addr = save;. k) |6 v' e% m% a+ l
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 p* D: i" [; B1 Y0 J$ ~                        addr  = base + cnt;9 S& F- w% j! w7 O7 G
                        sync ();# ^  ]6 F  O5 J" e- @% P: R
                        *addr = save[--i];0 _/ Q0 ^/ Z# L" ^7 K
                }
" c: o1 M" P& t# s; x* t( C                return (0);
/ K. g# h* P& J( v8 r- k* z( M        }/ b; ^: ^& p/ y1 ?+ M6 [
$ y' V! j; r& g  F/ V8 I& j2 z/ @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 K% @* w) ?* q- M# n2 j, M2 K                addr = base + cnt;        /* pointer arith! */
9 S1 W$ i/ Z# N                val = *addr;* u; p! L; R. W4 ~
                *addr = save[--i];
7 Z# f' n) V( d  C                if (val != ~cnt) {
# V8 K( U, j& z8 v- Z. v6 ]' d" w                        size = cnt * sizeof (long);$ t) ~$ D5 l/ y* q4 o
                        /* Restore the original data before leaving the function.
& m* `( {" Y3 f+ `0 {                         */; I9 @' O* x  J& m; X* _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; n& g  y4 R8 C1 o: x' ~
                                addr  = base + cnt;
7 b, B$ J* w3 M. v  d, m* K6 |7 R                                *addr = save[--i];
7 r+ {- X% Q) k7 ~, H                        }5 h" p- T& t4 [
                        return (size);) l# J& [$ ^/ t' a! w7 z5 g  F& N
                }
& S1 _+ k5 d1 q        }
6 o" u1 c# a- R1 J* `
) n8 f( v0 ^  u/ I  [        return (maxsize);3 E/ D* b% l4 L2 R8 n* K; K% ]; C. Q
}
' ?# H: h% ~) T4 B4 w6 `8 W4 @int dram_init(void)
  {2 ~/ E5 i# T' U6 s) B, U{
5 `  z+ P% {' L' [) m% ~1 a        /* dram_init must store complete ramsize in gd->ram_size */% j2 r7 i8 M% [
        gd->ram_size = get_ram_size(4 H0 S9 ?: c7 u  @4 o
                        (void *)CONFIG_SYS_SDRAM_BASE,+ K  k$ L2 p% o7 H7 s8 Z0 ^
                        CONFIG_MAX_RAM_BANK_SIZE);
% J$ N$ I% |" `8 U6 ~        return 0;
' H6 ^) S4 d$ V2 X/ _/ @}6 K8 Y- r* ]# |% h! x4 o( s

% t2 L2 F6 H5 U6 ~1 k6 ]
; L  X$ E2 x; a* F1 W3 o% l1 t2 {3 S( j, e8 j5 e% y

* I; b, X! \/ R8 dFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( ?6 l0 e4 ?& Z' S2 F9 x

% `' Y" s; J" n. a$ N! A' p
* J3 g+ [( U4 b" l$ x$ E( {

" W7 b' E' H# d9 W: Q  K9 s3 i* ?




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