嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; Q: D: X, j0 |1 ~: C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* b; U2 N5 A! Y, s3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  b6 O; k! m  h: l* ], h1 ^5 X7 s- L2 N1 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! D( I) s) e2 e  X8 j

" L( O. w7 m. I& W6 b9 q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ ?2 G6 h1 ?7 m$ B# ?/*% O7 J1 }1 c* {% T; N; K
* Check memory range for valid RAM. A simple memory test determines: @* ~- i- Z" M+ A+ y* t
* the actually available RAM size between addresses `base' and; U" |" K. L" H
* `base + maxsize'.4 s  c- b& d' p# D8 q% j% ]: R
*/
1 s3 k* a* s( `7 J" c( Clong get_ram_size(long *base, long maxsize)) E7 s. m) ~9 R2 q
{  {% t8 l- V% ?! s, u
        volatile long *addr;: P: V0 y9 q* K1 {. o2 |
        long           save[32];
* `' o  w. H( n$ Q* [5 F        long           cnt;% C+ }9 r2 C8 s9 J
        long           val;" n/ i) x1 Y0 G% E' V* d" \
        long           size;; D- c/ {, {3 {4 M1 }' {
        int            i = 0;
" V2 D% }0 Q! Y/ G: [# H+ X& M5 b% E4 V- f5 w5 ]4 r' c
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, o; ?9 {# F% X! ~- h$ H                addr = base + cnt;        /* pointer arith! */" U% c+ F9 U$ X4 x1 K, q2 l1 T
                sync ();
! d4 n$ [" \# x3 M& u3 x8 `  N# k                save[i++] = *addr;' v# P: D  B5 s: g: w
                sync ();" o/ r6 Z9 }- {! `
                *addr = ~cnt;
5 h0 R# B' `! {* e0 H        }: a9 |( f2 Z  H) c1 y, \: D; q

9 n  X5 ]0 l+ Y6 U$ N3 H! ]; J5 R        addr = base;
- o  s3 t) y- n7 U1 ^2 @, `        sync ();; n: ?# @% b/ ~/ F, v, @
        save = *addr;
& t4 t5 h6 ?. ~  f2 Y2 O        sync ();
2 r. C" Q4 Z3 A' }        *addr = 0;
+ q  w' W0 C3 x0 m# `4 p- o0 E' g$ U3 y; e1 n; N; {2 d; |, s
        sync ();
2 f. @# L4 s- ], p; z$ T/ s! }* w        if ((val = *addr) != 0) {, k; F1 P$ z6 e4 [' n
                /* Restore the original data before leaving the function.; m6 K, v5 v( E, Q! u: ]. V
                 */
! s- Q! `! s1 R2 y                sync ();" ~2 ]& k, g/ Y) @: e  L9 O
                *addr = save;
1 J' U- d+ G, q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 p1 M$ u' L8 M6 ?) x                        addr  = base + cnt;- K7 h! y0 L+ ?+ m" e0 I6 t& e0 i
                        sync ();; U4 \7 ], h3 X+ {6 M! b+ B" [
                        *addr = save[--i];
) T9 i7 q! P! j6 J- b; m1 }& M                }6 l) ?( C$ L! ]# R+ x8 `( a% H
                return (0);
* _4 ?* x1 q: t% F) [8 F        }
! Q4 V5 a/ ^2 {7 u1 X  J' q# M- |/ \; Q; U2 Q  p
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 p$ w; Y. b! q+ l2 D. s% ^                addr = base + cnt;        /* pointer arith! */
+ o$ Q) f4 G3 a2 t7 n                val = *addr;
$ l' j4 ]. `$ A6 K# z$ m$ s) ]                *addr = save[--i];
0 m$ b! Y/ A0 X+ W  g" \                if (val != ~cnt) {+ S) c2 _% I/ n% ~5 o9 _8 x
                        size = cnt * sizeof (long);
7 T7 }1 {$ t; R1 x6 V4 B5 T                        /* Restore the original data before leaving the function.
# k& A  q9 c# ?; q  a; u                         */- N# r' b+ h4 K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' U& m; X& m( W
                                addr  = base + cnt;
+ p1 t% h5 e  ^9 ?  o                                *addr = save[--i];
6 ^; y2 {$ `% p* U/ J$ r5 H; g* Y- E                        }9 i2 G  {, r* @0 |4 M5 a, A
                        return (size);
, G* l5 g7 R. P& f3 m                }
, s; M' D* U$ D7 Z1 W. S) e        }
, \1 y1 g. v1 k  r2 M- z
, X  G+ r  `% e/ h+ u, `* o        return (maxsize);6 x/ Y+ _' X; L* Z0 ^" ~
}1 o, r: w  E- F: m4 [$ O
int dram_init(void)
2 L5 J8 U6 I' W( w{
( H) C9 \9 r" @        /* dram_init must store complete ramsize in gd->ram_size */
( p; L- P$ K# a; G* b" O        gd->ram_size = get_ram_size(7 f  p( I1 ?7 \8 G
                        (void *)CONFIG_SYS_SDRAM_BASE,: s% t+ C4 L" w1 W" r  r! u7 F
                        CONFIG_MAX_RAM_BANK_SIZE);
0 R$ q# P/ k% r/ C        return 0;
% Z' N" }2 D8 E: z! F1 N5 u( }}
. V) T% t6 O: V9 r1 ]9 A
& }0 K/ ]6 F! Q( t0 t
  U) k5 }+ S$ P( d" J- P5 {) D# M- E/ [2 m6 i

8 J, d& S) {+ a; X+ O" jFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# E" z. F, q6 U! l7 k

( [( _. x+ m, N8 L1 w# h0 Q& w8 A
$ _1 Y0 h: e6 r- A$ O$ Z  q

! h% K5 b& ~" k7 B' B




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