嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* j; o7 A' R7 Q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* Q; D! c( k; z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 n* r# d5 ^# Z; B% C. D( @2 z2 E$ k6 y1 N- v, l* i% W2 }5 s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 {" Z7 D' v4 ?: M
2 N( |) n) r/ k2 i( G- f* P9 t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c9 Q5 D6 ^% ?+ \& f8 d/*8 Z. E  L# V3 C  a. K! ~
* Check memory range for valid RAM. A simple memory test determines
% {& [0 B; `6 M* Y) a* the actually available RAM size between addresses `base' and
9 |: M$ |$ J) `3 a' B; p0 I* `base + maxsize'.3 q+ }( [1 r, w" p1 F' v) M1 |
*/
# ]. T8 G1 q. C9 Jlong get_ram_size(long *base, long maxsize)$ t- b& d: f& l6 C
{
( j, f" h" ]0 r' F" [6 I        volatile long *addr;
1 t' i2 w" m6 A- L6 P* Z% T        long           save[32];& E- [* L+ V# {5 c
        long           cnt;
, `8 I. g; n8 y3 l        long           val;1 W8 W, [- l, T) ~, V2 c
        long           size;$ K/ [6 c- I: N
        int            i = 0;
* M8 @% j+ g" @
1 p' Q& l" _- ?8 ?* S6 w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 J: J3 i' x) n, k3 ]8 W% r- Z; X                addr = base + cnt;        /* pointer arith! */) y% F0 o4 k5 m+ Z  B
                sync ();
9 d4 p4 p7 d2 k' A: `# a( s                save[i++] = *addr;
% @. }- s6 v- X5 J% f5 `                sync ();
7 s3 z; W: R8 f# M: j# \+ h# z. i                *addr = ~cnt;! ~( x4 g; W# v8 E2 X
        }
- [5 r) `$ _+ h' _1 e4 `1 S1 }* Y0 U; _$ I# s! E
        addr = base;) ?' K. P8 z+ S1 g
        sync ();6 V, A; q6 G2 e6 R' p
        save = *addr;
- [. g; X. r& L; l- K        sync ();
3 P* f' c: Z4 W3 D1 [: {        *addr = 0;5 Q1 ?, M7 Q9 z
( `9 ~" c- \; e# e
        sync ();$ U* `# }2 [; E5 E- \& l
        if ((val = *addr) != 0) {
  U# S% \' L7 `  P. S0 N. y1 a                /* Restore the original data before leaving the function.2 v& N0 {6 }3 [" P$ ]9 l4 b
                 */
" X2 ^% L# z0 H' j) g1 Y! \0 u4 V                sync ();
: M. H7 J" y' w# \: K  g                *addr = save;! N$ |6 H6 }  E  k0 y, q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 \1 N( O. b+ r+ x- ^; R+ c
                        addr  = base + cnt;2 p8 X3 `7 f. C  m0 u1 P' d
                        sync ();
/ R1 ?3 U, R" Y% `. B6 U3 H; @. o                        *addr = save[--i];
8 Q2 j+ ]! n9 Y5 ^0 w" w7 L+ G                }- D$ U3 g9 l# x
                return (0);
2 p) N+ |  g# u" `        }5 }0 |5 k6 d& ~5 n6 o5 b9 U& b

9 I+ o* v! V' _/ b% K/ i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ J& ]( q( w0 I6 I) e; L
                addr = base + cnt;        /* pointer arith! */( `  B. Z  p) A# l/ h
                val = *addr;
- ?& N  C' c+ s- |. \% c9 z                *addr = save[--i];  }. t1 o, y% q* W- H: n% z  P
                if (val != ~cnt) {
( u( H4 r. B8 ~! }" R# }7 |                        size = cnt * sizeof (long);
6 }4 K- v4 e( k/ K                        /* Restore the original data before leaving the function.0 S. J! e. J* U5 `8 s8 O. p
                         */, `* b( k6 q/ Y6 k; o& }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' o/ U8 _" ]( b0 T5 g* A
                                addr  = base + cnt;
9 I+ G9 ?* E  b, J' n                                *addr = save[--i];
8 a% f. c; a& `. [  ], ~                        }( K* l0 G8 K+ F1 F7 G6 h
                        return (size);4 o+ |3 P5 H5 V* d8 U) s
                }$ p' z: p5 N( _& u( I
        }
4 E; S: U8 {! Z) R1 l1 Q
, [" A5 V! a$ W1 K( J& ^6 |1 a/ N        return (maxsize);' K/ P6 u" ~' e  Q% l
}" S, j" V& a( f, f9 j4 I3 u
int dram_init(void)9 o# G8 J/ E2 r  N
{
$ I: K4 x; C# H0 Z8 `3 }        /* dram_init must store complete ramsize in gd->ram_size */  M  u9 F) ]) Q7 p7 T
        gd->ram_size = get_ram_size(7 t- z1 W9 }2 N, K  g& m- h; ]
                        (void *)CONFIG_SYS_SDRAM_BASE,
) r5 [! P( C2 s+ \7 y                        CONFIG_MAX_RAM_BANK_SIZE);
/ ?7 a! P; u% |: u$ A2 Y        return 0;
! ^5 R+ c) \3 B0 \* o: P}% k* W; V$ ]' {/ ?

% J' t6 E' j/ _/ f& c% F3 Y; V
7 d4 }6 v" Q: M7 w( B+ s  D- w4 s; y# T% u/ U! j
- w9 J* u% ]6 M5 w( u4 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* y) ]9 |* X" K% _" @; X! t: X& x3 T% I( a/ {
3 h3 Q$ _7 \' Y' |4 L6 T' j; R/ H( d  y

' V( }5 Y8 d# O% q- ^( ~- A: c




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