嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ _2 Y" E0 G' N0 F" q7 d$ S) E2 e核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% C1 D, P- Y, i这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- ?  r  E. s: o/ }2 M7 G: T

3 a* J3 Y4 }+ y0 c+ W# y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 b+ I4 Z. D8 a, j
* y  V/ _# h0 P) T1 m9 r: D
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 ~8 s# n, h! v; S; T0 [" }$ C7 A1 h
/*3 |+ v4 e7 a) R: F2 G' q6 Q3 h
* Check memory range for valid RAM. A simple memory test determines8 z, S2 w. ]: c/ ]7 n) |9 q/ v
* the actually available RAM size between addresses `base' and
" E8 x8 }) m& A) Z6 y' i- j* `base + maxsize'.' ]- d- b- U8 m- G9 I
*/9 ]! s, }& S7 l) V9 L# ~
long get_ram_size(long *base, long maxsize)
7 y* g6 [* }4 [2 P! H, t/ d' J# B{
1 F7 t2 d- S* X2 i- n        volatile long *addr;
3 |& ^) K+ O0 T1 K; Y: y5 w        long           save[32];' c" I/ o7 j. e9 b7 O7 P
        long           cnt;8 d- [* z2 W2 j9 q( ~) L. ~+ V% s
        long           val;" l2 s! s1 Q( E5 a, B" W# G# M4 U2 q
        long           size;8 d4 F: j* }& G. o+ _, y: E+ m
        int            i = 0;( p. l9 h* v6 S9 o4 w2 ~

$ h" C/ j% ^0 _3 r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ f7 D; k( U# h" }- e# V& y1 m
                addr = base + cnt;        /* pointer arith! */
- I' U/ ]# I0 [$ O$ E                sync ();
1 q, x6 q: W- q  Y/ D0 N                save[i++] = *addr;
+ G* A( G3 E- Y3 C3 `8 e                sync ();* e4 J# {" m7 N/ ?. A6 K& p. F
                *addr = ~cnt;' T8 Q; k! a6 o7 G: L  \
        }
- v( `) i: r3 c, `9 S' U- t( T- s5 U7 M# I* j
        addr = base;/ G% W3 Z  l% C6 |$ h3 Y$ l& v
        sync ();
5 K# ?+ d8 {! ?2 }5 \0 Y1 W7 j! f9 i) o1 W        save = *addr;, }) I& |1 u6 e
        sync ();3 I+ ^! J% F! q. [/ ]
        *addr = 0;
8 o, P7 V+ H) R  O+ v. L$ T; [  b4 a5 W6 h+ u
        sync ();5 B5 k) F2 }: j  g) c
        if ((val = *addr) != 0) {6 e) C0 S0 B9 X* U; f
                /* Restore the original data before leaving the function.
6 _& {2 O' g: k: d  _" B' l                 */5 i+ K; ]5 d: L6 `* ?9 K
                sync ();3 |  U8 z) e: W7 x3 @* o; v/ q
                *addr = save;
3 q* C7 V$ e# |, W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# U2 v- U" B, B! `- N( I; \                        addr  = base + cnt;
% E2 c0 b- K: z6 k7 h                        sync ();5 z/ C! o' x! v$ L; w3 `9 Y
                        *addr = save[--i];2 d7 B1 h! H) J
                }
. N( R$ i" S# n3 E                return (0);% G$ |1 W1 f5 f: T0 m6 {# o
        }
  W, T+ A( m$ I* {* S0 w6 R3 W2 O1 j0 l5 }2 [
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 o# l" T$ Z$ t* Y                addr = base + cnt;        /* pointer arith! */+ n: I% j& K9 q9 b+ Z
                val = *addr;
  o# K* E/ A8 S1 M                *addr = save[--i];
! a/ p, |0 n5 l                if (val != ~cnt) {, \. [/ D6 j0 V( t
                        size = cnt * sizeof (long);# i. \2 u* k  o) K$ E2 ^7 k# o" o
                        /* Restore the original data before leaving the function.- E0 n# W; l/ R' D# B$ L
                         */
: ~5 r7 R  e/ X9 j                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 a- ?! |' X$ ]( J# b9 r1 Z
                                addr  = base + cnt;& r' w2 l6 i9 |) G
                                *addr = save[--i];" X* j) A( T3 n* V) Y
                        }* i7 Z. [: V, f
                        return (size);# v, E. N9 _# w7 t3 B
                }
8 C! P+ j( N1 G5 K6 y# G8 Q        }
" E7 }% u1 `2 |, A/ A9 {3 S0 g; w/ \% B  ]/ X
        return (maxsize);, P; W8 I& R6 m# P. x" W4 H" N$ V8 }
}! h* w, J' {+ U  S1 ?* N
int dram_init(void)0 b, F* W% P+ D; v) O
{# c* ?2 ~- ]; a2 `. g
        /* dram_init must store complete ramsize in gd->ram_size */
0 m% q5 d- ?. l# B        gd->ram_size = get_ram_size(  d2 O- x: Y8 L9 T4 U/ `& V
                        (void *)CONFIG_SYS_SDRAM_BASE,4 w% d8 Z- M! e+ O% N
                        CONFIG_MAX_RAM_BANK_SIZE);" s% x& M' a6 F: g1 J9 H5 _9 p6 V( w3 B0 u
        return 0;& P' W5 J( E  X6 d6 Q' W
}8 F8 r6 {: R6 }
. i5 a3 z+ q( d" T4 a

* @) Z2 g9 P3 ]& ~( \2 ^4 K9 V8 z+ m9 G" O" Z* l
: f, I4 V) F1 U: P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 M; L9 `% ]) [% b7 ^: A4 [# F) @& r; y9 n) o  w

- E* \2 ~! V; v2 Y' ?+ i

( L. r# F! G( O




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