嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% s+ L8 z+ ?' q, h( @8 G+ C  c核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ n3 y$ D2 w2 ^7 ]4 i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 R1 i  R9 p# s9 M" \' c  U! e+ @" J( X6 t5 m5 J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ p4 G+ E4 p; \* Q* z/ Z5 U
) Z2 c% ?% k+ l. c8 g( r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 g; L+ R4 H) g/*
" W9 h! w5 c/ Z) g+ d* Check memory range for valid RAM. A simple memory test determines
; G2 w/ A0 [. S* the actually available RAM size between addresses `base' and+ k) _# C  w4 ]  D) {  n
* `base + maxsize'.# x: A8 I! {$ v5 f! M9 M
*/
; d3 t! p( O+ x: G9 y- ylong get_ram_size(long *base, long maxsize)
& R! P# z! ?) G, k* @  \/ _8 J1 J{
- ?  q( E9 w, j        volatile long *addr;
( J/ C0 C2 q+ E, ~; c        long           save[32];, m3 T; k9 k1 ~4 D
        long           cnt;% B3 I5 x# A/ e- h
        long           val;
$ X& {  n( c$ E% N        long           size;
0 o2 a6 [& [* G4 K8 b        int            i = 0;* Y6 x3 q6 l, M8 f' h7 @
2 G2 H  E  a/ g
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" N. I: y: `6 }7 a/ A0 u  v                addr = base + cnt;        /* pointer arith! */5 T* |$ h# h  L! n, c! g, S$ d( q
                sync ();9 K* D. n, f, \. Y' Z; r
                save[i++] = *addr;) \. c& i4 g/ L5 J( J
                sync ();4 M8 h6 Z2 v$ Q& N+ l! {
                *addr = ~cnt;
  D, o  o6 p$ O7 ?        }
& K0 E( ]8 M/ X1 J
1 ~% T" w0 v6 K        addr = base;
0 [* O3 J" ~$ [  i+ z" F1 ]        sync ();. {: _5 Q$ b4 u; I
        save = *addr;7 J: p! ]7 a" `% V# m0 J: u
        sync ();0 E0 U$ @9 C2 F6 }8 o
        *addr = 0;  f- h& L, n( g  T; f  l0 l
+ F9 Q! ?& L  |5 l
        sync ();4 j' G2 m2 |4 W+ }' ?7 h
        if ((val = *addr) != 0) {9 n2 r5 A. ?( S7 @0 E( B9 s
                /* Restore the original data before leaving the function.
: ]. r, G9 G7 X                 */
- U" I7 y4 Q) W6 \                sync ();
* a: R7 I7 j& _( H* z' Y. t                *addr = save;, A$ t( X: z3 i, H& r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 p) q9 P+ X( w- @5 `- }( O
                        addr  = base + cnt;
) ?. ~" I; q, e" L6 m7 O                        sync ();7 [# B! R1 t! E, U" ~: e
                        *addr = save[--i];
- S' ?; f6 P4 y1 y3 J( r                }
$ o8 n4 g; F" Y+ F/ s; h                return (0);( K1 l5 `0 X1 }6 G2 t
        }' u) s6 V: s. v4 \
5 l2 H' P. L3 C8 |- D+ B) Q3 F
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 w3 t4 W7 _# L" R                addr = base + cnt;        /* pointer arith! */$ S2 u' ?7 g5 Z- \1 C
                val = *addr;
! j: w- y3 t' o                *addr = save[--i];) _2 ?. a& {  |4 E6 x
                if (val != ~cnt) {, w1 z# _1 Z6 z6 z
                        size = cnt * sizeof (long);
9 t% a5 o, G6 a! O4 m                        /* Restore the original data before leaving the function.
" {  a; d& v! M' p9 Z7 |                         */
  w- D6 J" o. K3 H                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& P2 n, [( w) u. k                                addr  = base + cnt;- q, B: N% U, W% r9 i, Z
                                *addr = save[--i];
& E/ h9 R, Z3 k# T2 c  Z% n* P                        }7 k6 c" B* E( F
                        return (size);
  c: m6 z% O  ]                }
3 T" ^& A- R4 D# H' [4 v8 U# ]        }
0 p; e  I- z5 l( m, m) ^2 a
4 }4 N' x4 W; ~0 w! N        return (maxsize);) q$ j# g0 }- M9 Q  y9 @
}0 M" N& H' W8 G( u. h2 W
int dram_init(void)
' K  N1 S+ |9 d2 N  C) r' P1 O) b{
. X- u9 p+ Q% q6 [" G" e& X        /* dram_init must store complete ramsize in gd->ram_size */
9 ], {" p: w" `4 w8 z6 j( z        gd->ram_size = get_ram_size(" w" M/ k1 {3 z7 D8 l
                        (void *)CONFIG_SYS_SDRAM_BASE,% A" o( }" l) s  y
                        CONFIG_MAX_RAM_BANK_SIZE);( F& [7 g% O( [& ]$ m
        return 0;5 ], z6 X! @- r$ ]( P7 w
}
* L2 ~. b7 f, d1 l. ?( \; z* H4 O" M+ I5 V6 L3 j/ i/ f
1 D& J' Z& |6 N2 w( B$ @2 A

; G$ U$ ^. c% ]/ Q7 K: K$ i
' P( ~: S) C9 [1 sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& o. `# q9 ?# O% Z

! R! G. j0 y* d  s5 r2 P/ d
2 g! S/ ~% d6 F5 ~
6 Q2 A- l- q* Y9 u+ `- K7 c





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