嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 r2 H% S' X/ A3 g" @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% k5 N& o7 e2 n+ K6 J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& A$ [4 h3 r3 G; K3 x! o: \) ?( W8 M) G+ K$ x7 B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" }! B$ ~9 W  F( ?
, x% L/ \0 R9 j2 K+ J" f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 r5 K8 R9 N  B1 z$ a
/*
% o0 F9 ^. c- W/ W* Check memory range for valid RAM. A simple memory test determines
; ]2 a" h  e0 `6 n# F3 v* the actually available RAM size between addresses `base' and! b& x- [2 _, D- w! T( p8 |# }
* `base + maxsize'.
- d$ P% ^2 Q+ Y*/
! W7 ?! q& c+ _' ]( P+ M& O8 Y, [long get_ram_size(long *base, long maxsize)
8 o7 ]' S/ Y5 J' \{. I* N0 }$ N" i5 ]
        volatile long *addr;
- ?0 ?: W% J: g8 z        long           save[32];
/ m3 ?$ ?# P/ W* e; ~        long           cnt;
- w% U- X* H* k! [4 v+ d        long           val;% a! n/ d  d4 c
        long           size;% {$ I, u1 K; K  \8 L9 E; h7 n
        int            i = 0;
2 c$ e$ E/ z' a8 I7 C* G" E% ?
6 M1 ]0 d  J& V4 M1 ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* Y6 I$ ]: X+ j, x) G7 R                addr = base + cnt;        /* pointer arith! */
, D3 t- ]' W8 g, P3 ^                sync ();( @% H' y. \# ?
                save[i++] = *addr;
) I) }3 y3 ~1 B7 |2 q" k                sync ();6 d  G; M/ B2 ]+ z
                *addr = ~cnt;- R. Q  A& E) S
        }9 F+ G& b7 J5 }0 C

, B% w' {  P$ j        addr = base;
6 a/ H8 [3 u1 B        sync ();. f* L' }  @  C9 }
        save = *addr;
4 L5 d: L3 f! b. J- E- D9 Z, l        sync ();
) D% F4 a) w: u! N1 c: m5 J        *addr = 0;
) D" N2 y/ D/ f- a  L- w  O8 ]/ s9 Q  j
        sync ();
9 l) U; `& v! Y" Y% |2 f        if ((val = *addr) != 0) {' V: k$ Q& Q* u9 Y: C! S
                /* Restore the original data before leaving the function.
+ d# l4 ~7 Q1 r1 t2 w9 R                 */
0 _& f/ i$ z8 }* a2 ?                sync ();9 E. w; q  W) w' X, ?, m
                *addr = save;
" {% b: |  ]7 B0 K* o# {                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' t* m9 R2 [; W( E$ S- G) C                        addr  = base + cnt;
! K; E6 T5 j" m* @7 D                        sync ();  Q* ~8 S( }% t3 b$ B
                        *addr = save[--i];
3 ^  M: r, @8 K, t                }3 n$ U  @$ {) `0 Z
                return (0);
4 t. e2 j9 ~& ^( [$ S1 B( B        }5 z( g3 i7 W# P

4 S5 [% }; q3 o' V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 V2 v) u7 R7 p' T6 j, M! w) Q                addr = base + cnt;        /* pointer arith! */8 G( r3 `8 y2 c( Q) j4 v' g0 Y
                val = *addr;
- q* Y/ ~5 G; q( c) e& K; ]                *addr = save[--i];
# Y7 o+ L+ K  P& E# s' Q                if (val != ~cnt) {2 ]; O: d$ f2 r1 b
                        size = cnt * sizeof (long);$ T, Z# k# X8 ]# R- H1 ^
                        /* Restore the original data before leaving the function.
0 V* C  d: h( |9 y1 s                         */( z9 E: _3 C, N, g- v$ ?
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% c% A, s/ b6 X! j% n
                                addr  = base + cnt;
2 J; j( R2 U; f+ t                                *addr = save[--i];4 D/ V/ ]$ i3 }/ U3 q4 R- m
                        }
9 f- v) @1 ]( k: z                        return (size);
. D/ h2 g- B  A# ?5 o. |: S                }! y1 x5 C/ V0 e* `
        }1 G8 z4 s3 `5 e* ~7 X# t

* C. K2 V- |) M$ s) x3 X        return (maxsize);1 U/ v8 m. v5 M& k8 I- N; t
}$ N$ x- e6 n/ S
int dram_init(void). F: y( R  o( Q9 v& _( F
{' p8 j" R  [8 R; m6 U
        /* dram_init must store complete ramsize in gd->ram_size */  [1 R: l! O4 m2 a# \; @
        gd->ram_size = get_ram_size(3 i0 R4 p' p5 J( n
                        (void *)CONFIG_SYS_SDRAM_BASE,0 Q0 l) P/ i+ h+ j# e, W
                        CONFIG_MAX_RAM_BANK_SIZE);
, P! Q, y+ I- D% t+ T        return 0;
# W, ]: O+ o( ]}9 q8 S. M$ L0 B
" w7 _2 K0 t# P- y! P* y
1 k- H, W! V$ I
; L/ F2 N* Y% p* m, X1 X
' P0 G3 N8 S* [+ }3 _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ b( [) d# I1 O) p

0 Z; |+ F, X3 Y0 u( i% ~9 e% ^% d. p: ^
4 Z/ Z) E" O8 K& x0 o4 a





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