嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 ^; q( b% ~- X+ D$ c; S核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ F7 ^0 [( t$ S& `) N* h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 o8 q9 |; a( l# Q. v1 S8 d) y

* H* ?- W+ Y* h9 s9 ?9 E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" l$ k1 A" H% ?3 j/ v) F
. U8 q, |. y" Z8 K

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 D1 M$ S" `+ E- P
/** y7 B- I. C& ?5 h4 N: u: f# |
* Check memory range for valid RAM. A simple memory test determines
4 W0 V4 I3 f* K1 @4 t; p1 t7 Y0 ]* the actually available RAM size between addresses `base' and7 p! V- k9 Z. }' ]# \+ N5 |8 e
* `base + maxsize'.
% D4 y* j- z4 @; m- i*/5 P7 H7 {. b: m. i) `1 O- G
long get_ram_size(long *base, long maxsize); B7 F: S4 R  R  f8 C- r1 V0 p
{: l( {+ q% }1 x) |" T) p2 A6 E- Q1 `
        volatile long *addr;1 i) f- @4 b, c% I- o5 A: p8 T
        long           save[32];; y3 I3 J: \8 n( x
        long           cnt;
$ d4 V# ?; J- w, ~9 N. M        long           val;8 l* W. k7 H! Z" o' X* t  N
        long           size;9 K% m( I1 v5 c
        int            i = 0;
$ N8 k" |* I$ M5 f1 @- }3 y5 K) [( X3 ?
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( j4 R" f% S+ Z1 @, }8 Q4 T                addr = base + cnt;        /* pointer arith! */: ^! g4 R) X% F+ Q' ^
                sync ();
! O8 s8 [- A$ }9 B4 ]                save[i++] = *addr;: C7 v9 H& j/ c0 [# }  i1 K
                sync ();! V! f2 @" e# L5 q; Y
                *addr = ~cnt;6 T# b- s9 c  u0 u1 _; q# o$ I+ A
        }- N, y9 X1 `5 K
# L: l7 F& `5 L; C
        addr = base;
2 V+ k/ g& z& ]' _1 h3 s        sync ();7 @) N/ ?% c0 K  ~" B1 }
        save = *addr;0 y6 f' U8 }9 ~7 e1 i
        sync ();
2 |1 y, l, m. _7 J# g( p        *addr = 0;
- B3 d9 t2 }3 f6 |- ?* I5 y) U6 X1 q* y. Y$ A( v* f
        sync ();
! _8 z/ r- D  {" @% v, s) X- Q        if ((val = *addr) != 0) {1 D/ a8 r" H0 l) w3 L7 b
                /* Restore the original data before leaving the function.$ M* [( J3 y5 k  j* Q4 R
                 */
1 L1 w4 ]9 u! T                sync ();. f. h* ~, `& d+ q
                *addr = save;
  N3 h' E! b& O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ Z" h2 `% J% j. r$ T3 w                        addr  = base + cnt;) c  {# |5 C" n1 i# J% W0 X/ u
                        sync ();
/ [; X" Y0 t" f* g/ u                        *addr = save[--i];0 @4 ?# k$ F4 r  F, s
                }
% g' H& f7 u- Y" e8 z7 Y+ |                return (0);
9 {# `4 M$ Z6 A8 K* m        }
& U, u+ l" g8 E4 A8 B5 r) _8 n
" t: a7 z4 a0 r* P- s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" |1 B5 L. b4 p1 E% m                addr = base + cnt;        /* pointer arith! */, W5 _- |/ U# @" B! h4 l7 ]
                val = *addr;
5 M3 X, H6 C! _                *addr = save[--i];  f: g6 _* c& i( z4 e7 I
                if (val != ~cnt) {
- ?; ^) ?& I6 a1 o4 e: N! A) h                        size = cnt * sizeof (long);* l5 A6 G, P- c- o
                        /* Restore the original data before leaving the function.
( U/ {# [' _1 W* {                         */* X! V( ]- M7 a9 ?/ X: V
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ N7 G0 u* i2 L
                                addr  = base + cnt;
5 i' R/ h9 w6 O8 S3 B! e                                *addr = save[--i];
2 {& N/ ?, S' Y3 F* \8 Q                        }
- ]% e. N4 |5 A6 a# s0 C                        return (size);, ]9 k) s  ^8 b; M. ^( T
                }6 U: N' ]. s* u; P# `. w1 _9 H
        }
1 l" j. R) [. u& V+ ~* x0 }5 }! n
" l2 ], k9 E' M9 ?  w9 L        return (maxsize);
! A" E" t1 c; C2 A5 W% t! Z}: F; T" a9 r$ N, h% @7 U" h
int dram_init(void)
3 g$ ?9 b/ v8 M- k" N2 c6 a" d: \{
* `2 Z$ c; |$ j3 P5 V- [        /* dram_init must store complete ramsize in gd->ram_size */2 g% i7 H4 P. ?6 J" b' V
        gd->ram_size = get_ram_size(1 X0 l# q7 o& x! g, ?
                        (void *)CONFIG_SYS_SDRAM_BASE,3 |! H5 n1 {( t0 d3 e$ U, ]1 ^1 x
                        CONFIG_MAX_RAM_BANK_SIZE);' v0 l7 L2 `6 \& t
        return 0;
% h- T  `9 ?7 u+ ]6 M}
* Z; T) V  F3 R* F- s& w" B( i0 e# W2 r6 c+ f" M5 \. ^

/ n7 K& s3 u1 D3 X* f
' Z+ p8 S% [4 f( s; @' T' {; o3 F, i8 p7 H$ l5 L: X! m7 ~; o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: K5 q" L, b# ]$ N2 F; S

4 O1 F( `7 r8 }; I: Z2 u+ ^$ e7 l6 y/ E2 y
  H* e5 J9 `/ b. Y& Z/ q





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