嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 c2 v/ g3 A6 L9 I" [/ a8 ?% u- \8 @' Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit# s, H6 _% I4 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s' R8 W0 a% L; t
3 k6 W+ F1 M2 G) [是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( [. x6 s+ ]: l% H* y1 P: g2 K
6 `+ d) V+ o5 {" E! n! r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ u+ B  e0 _- c& t$ Y/ b/*$ _9 Y5 N, T3 e: `8 K
* Check memory range for valid RAM. A simple memory test determines$ a! L/ H0 |6 ]2 m7 k$ B3 Z! e
* the actually available RAM size between addresses `base' and  J9 i% d5 r1 G4 H7 ^# y
* `base + maxsize'.( }  F$ r+ j, x  {5 ?% j" h
*/' _( E/ Z- i' k- C( ?5 n
long get_ram_size(long *base, long maxsize)  H; j5 d2 I, S7 x" [# I
{7 K+ }% b: F1 h( _+ u; Y
        volatile long *addr;
. Q% X3 s2 D8 f        long           save[32];# a8 D3 O+ }3 V1 Y
        long           cnt;' K; l6 S4 M3 Z, {4 v
        long           val;
. I+ O! F; e3 Z8 s- y8 M# I        long           size;: j# t7 Y- b" {
        int            i = 0;
$ x" x( B/ Z* C+ M6 m
# |9 w) ]6 Y  R* c, v3 u+ n. @& H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* g/ O8 Q4 s( r2 ~; S                addr = base + cnt;        /* pointer arith! */
. S7 ]; H8 I2 Z5 o                sync ();# i8 |0 L6 B  p. {0 p; L
                save[i++] = *addr;: L9 f( ]- d6 ~
                sync ();; u4 F5 e0 i& T$ w+ L( ~6 D
                *addr = ~cnt;4 f) s; f7 X/ W) C& g. {
        }, k* A/ z) X5 E
. ?1 T" I& b8 [) h
        addr = base;0 i- o/ Y8 {, v7 c$ t8 z' X
        sync ();; Y8 ~- ~. p7 d- @/ S5 }& U
        save = *addr;: T0 N( S# y6 h6 l, q6 i& D& v: C6 |
        sync ();
9 s" [5 S7 X( E0 c4 v; {$ Z3 \        *addr = 0;
2 f* o" [) Q# h8 L- e* a- ]
7 Q+ x+ Q6 W& ?        sync ();3 J6 i5 e2 v* K- M% a
        if ((val = *addr) != 0) {6 F( v, `; }  I% e% Y7 |
                /* Restore the original data before leaving the function.7 @" _: `3 w4 {/ |* K2 L' A6 f
                 */
2 i6 w6 Z% q+ d5 D                sync ();: i5 o# P* q( |, G7 p9 u
                *addr = save;
9 Q/ m/ P7 x) g, _1 o% y9 N                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 v' v: {- Y5 ~% Y/ D% X
                        addr  = base + cnt;
  E2 `& n1 M9 K! ~: k, Z+ M                        sync ();
3 |, G5 {0 [4 l8 N+ ?# _                        *addr = save[--i];
3 P6 X% G4 H5 w" M2 G1 q9 m. s                }
2 S# Y% P# {& p                return (0);. I% C+ H6 A: ~5 u# c& W5 d
        }
% b( u& m5 D1 S! A4 O, p3 \7 e* u' r1 G* M  Y$ W) w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ a/ C( ?# }1 w" `# G
                addr = base + cnt;        /* pointer arith! *// j/ e' \- K; [5 e& \9 x  |2 D; j
                val = *addr;
" M0 H. J7 G/ X: Y6 g                *addr = save[--i];/ q2 ^6 |+ A% d) h% k8 m( j
                if (val != ~cnt) {
' ^& Y6 R3 R; U                        size = cnt * sizeof (long);8 E/ e! \( C3 A0 c& c) D. V
                        /* Restore the original data before leaving the function.& J9 i2 l; h) e5 c
                         */
9 a! r) Z2 {& O9 c, I# @- Z! [                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ ?( b8 |, x9 c" z0 C. u
                                addr  = base + cnt;
3 n8 @5 [. k! L3 H) w1 t                                *addr = save[--i];" w" T, i  B" y4 O3 u
                        }
6 \0 S- \3 L" n- U( Q2 d2 n                        return (size);
1 r% |+ A7 p4 q/ J) X                }+ f- J; I) Y) I- m6 S7 k
        }
& V( j5 q! o1 g8 M
- P9 @6 m; ?9 x: Y0 \# G4 f3 o        return (maxsize);
( W/ l* t# q0 Q" I  U}
$ ?9 s8 d2 l: Z4 ?% k; {int dram_init(void)5 ], l" J+ s3 P/ r9 X4 E4 X
{% N" r  z' o, Z/ i$ M: U8 w
        /* dram_init must store complete ramsize in gd->ram_size */6 x# y( Q3 W) ^6 [1 `
        gd->ram_size = get_ram_size(0 m$ ]8 T7 o% a5 U: C" H: S9 r, t8 o: K
                        (void *)CONFIG_SYS_SDRAM_BASE,- m1 {" t# h, q
                        CONFIG_MAX_RAM_BANK_SIZE);  q0 Y' C6 f& D/ @/ H
        return 0;2 x$ {- h1 C2 N/ I( F9 ?5 G
}
& _2 Y0 k0 t) A+ L% Q# w
& Q+ S( N- n1 v' H3 Z& ~3 \
) u/ f, {' n3 Y/ v
+ c' B1 T; ]' S, B: p. w4 X7 ]: D- y7 _3 I- [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# o  N  c3 {" y  k# J  R

' q1 D8 M( {+ Z6 Y% c. r' ^  Q9 ?' n9 T0 K5 ?8 E
6 ]+ U5 F4 w$ O( j) s* L





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