嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 v& K) m, A( u6 \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* g4 W4 t' l9 T2 B) R& S2 u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ T6 r* q& G. v2 c; C- ^/ S1 k

0 d. U& R+ c# a7 d0 p+ {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- L8 P" J  T" N; z, ^# i

1 `% Z8 E" k9 o1 ]
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 F0 X) ~2 A) ^. \; f$ B
/*2 v/ I! F" T5 I2 \. B6 R
* Check memory range for valid RAM. A simple memory test determines* U/ h, X7 R1 h; i' l1 ]2 d- v
* the actually available RAM size between addresses `base' and; W* A! v$ E: b) p, H
* `base + maxsize'.( _( p0 E6 j, ^, \" _; E; Y
*/
. H2 k) }0 a  ~; H$ i! R" Klong get_ram_size(long *base, long maxsize)- _. }- L( V5 g+ _9 ?) k
{# n0 O. \9 \3 E8 ]
        volatile long *addr;" g( A9 {/ [8 H, h/ q2 c; x
        long           save[32];, O- S+ r. p! ?$ h8 }* F. S
        long           cnt;7 }  {* _4 _# z/ \9 S: ^( J- _. C; ]8 Z
        long           val;
4 o6 q& W8 z& j; i, ^3 E8 v3 H        long           size;5 u& Y  T* ?6 f4 g2 R6 ?
        int            i = 0;
% G1 `5 V1 C) T/ R
% j$ ~5 E& t0 x0 T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- [9 Q* R+ Y3 Y$ Y9 ]                addr = base + cnt;        /* pointer arith! */8 E, E0 ?2 r8 Y' t" h! Q
                sync ();
" g& a5 l8 D) A8 i                save[i++] = *addr;; j4 s. E. N5 f8 h  O) @
                sync ();
1 ]) j. Y4 n& F- k. p; t% S                *addr = ~cnt;- Q; d" L' B8 [/ B) Q
        }, `. D" @1 G$ g1 K

2 ?" ?- k* e5 [) [        addr = base;
0 k2 e% D8 _) Y; p2 _        sync ();
+ Y$ r& \$ D( Q- T. [        save = *addr;
& r1 i4 `, |5 A( Y3 l) M3 A        sync ();2 m9 \- {; t& W% K6 @9 ^9 L6 {5 G* t
        *addr = 0;
5 X8 G: j& @0 v( T  H7 _
- C' M4 k$ w! I6 E# e" e        sync ();
- S$ y' t. L  L( D1 e" |- u        if ((val = *addr) != 0) {
6 H7 e; J( Y& Q; t                /* Restore the original data before leaving the function.1 w6 ~. c9 G' L7 t4 v8 g3 q$ `
                 */
6 j. d/ O6 o: V7 q- b$ p+ q. N8 X                sync ();
! g3 W) G( t, [! r' n                *addr = save;
+ u6 P, U$ t1 v- |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 R4 C4 `' n" I( H4 ~8 Y
                        addr  = base + cnt;
. {3 r) R" b3 A% Z+ a; @% J# t                        sync ();
8 Q) H- L5 M8 E' B! r( @                        *addr = save[--i];
$ s$ ]& N+ y' [8 ^; |                }
6 @8 u! Q( M- k6 f. K                return (0);/ k/ a/ K7 W: r4 C' l$ N. G1 _. v
        }. h3 m) l% E0 a6 O% P) o) v
0 B2 A; q7 z1 l; D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- p0 r0 _5 }! o2 Q5 y                addr = base + cnt;        /* pointer arith! */
! j$ H# M% Q) e7 X  q' [                val = *addr;  |! L. \+ g. _! ]1 @9 Q7 a
                *addr = save[--i];4 \% d) c  `/ m; F
                if (val != ~cnt) {- P) y$ ~! \8 h! X- t  |6 b$ _; N
                        size = cnt * sizeof (long);8 X5 g0 F( c, i$ u2 M
                        /* Restore the original data before leaving the function.
8 _5 i( k0 i5 \# q0 x) w                         */
. F, }% D% {- y! J$ I) @! @2 B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: `! m# b8 Y: M1 s# c+ }                                addr  = base + cnt;
2 ]/ x6 g6 u# L3 n( T& F, a; W                                *addr = save[--i];% q$ |4 @( d, I5 q- u- A
                        }; J. ]* B# }2 x2 {' W
                        return (size);! ]& D9 B, L5 h- S' r0 e6 C
                }4 d/ d7 Z' y, w& ^* c6 N6 o
        }8 q) v' y. I; ]$ E6 m/ N
$ n( u) {2 Z& p/ r; J
        return (maxsize);
* e6 u* Y' t( @. }; `}
) H- Q2 o. t5 J- D" `int dram_init(void)
& O& N! c) K% s1 t{5 b7 C  R0 w8 {# i
        /* dram_init must store complete ramsize in gd->ram_size */: g& I$ c$ g6 n& l
        gd->ram_size = get_ram_size(/ }1 M8 M- _/ c) F4 _) a8 l
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 }1 T- s% B/ S/ k" ~2 @' n                        CONFIG_MAX_RAM_BANK_SIZE);
( M, \1 w4 W5 Y1 [8 R        return 0;) N5 n6 w: q# y& w* m4 t
}
7 \/ \5 b1 B" e, T" B  M; O) ^7 Q  Q" i0 }. E7 ?9 E; f! M! p
, i0 m3 T$ o- N' w6 p9 {7 X
5 j% h% Q, ?+ }9 l& L

2 A9 A6 I) c6 b9 k0 {: Z& cFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 s/ @. f# k7 L* T  p
4 |7 {, S( P3 z5 {
' u  V, |$ y; c! q

# {5 W+ i7 w/ a  ]6 T




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