嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 ?/ f; Z; o! P' \8 x( R
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 H7 T) d- S; }! x. F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% }" Y8 m* ]" T6 I0 k8 T7 J
$ ~. c8 H  E* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! ?0 B/ e: C" `  ]4 _( y' _) L' q8 C: `

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" ]4 s' k7 f2 @# S3 Q/*% q/ d! |0 P8 g  n; }
* Check memory range for valid RAM. A simple memory test determines
8 _/ p, k) f2 q4 _3 b9 i( Y* the actually available RAM size between addresses `base' and
4 _2 h* j* X7 z( w* `base + maxsize'.5 o8 @1 s) ]- W- ^# W4 p
*/0 f$ n6 g7 D9 u# w" _
long get_ram_size(long *base, long maxsize)
9 E1 U5 H" K# j3 G8 `{
/ |3 X7 N* X3 c1 K' O        volatile long *addr;
( y4 c( l* {: Q        long           save[32];
+ w$ ?  o. I3 w" O$ H        long           cnt;3 i/ A* M4 }! O* S0 l4 A
        long           val;
4 R; E) G3 {" t8 V! z        long           size;) o, a" h2 V( o2 A
        int            i = 0;5 i" l+ F& D6 s! L3 w; D& M3 }. m9 W
9 i! \5 V( v& t) D9 n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 N' V1 Y6 J/ n* C, u                addr = base + cnt;        /* pointer arith! */+ V+ v3 `2 m9 ?$ D9 h; M" N
                sync ();
. G% o/ E, c- P* e; [                save[i++] = *addr;
  Z  U) r0 C& \" T( l3 j* P) U, ]                sync ();6 `  ?* }; _: R" j8 v# I7 b
                *addr = ~cnt;5 b: r# j4 i) t" V3 j8 Z2 }
        }; S; v0 A' R0 `

6 F" Q' y! _9 m/ W0 ^        addr = base;  w4 u) X! y" K3 `4 X
        sync ();( ]; p$ Y5 c  r; o5 p( _
        save = *addr;
7 Q0 B" X" i1 o/ h% O        sync ();" j; k" c* G) J5 N
        *addr = 0;
1 c# o$ l& s7 n$ K- j: J. W& k" l/ i  w, h0 r# I, s
        sync ();
4 G% _9 H, {7 ?! ]        if ((val = *addr) != 0) {
% s' [4 m6 d. z                /* Restore the original data before leaving the function.7 ^( ~% h* y& I) g4 H8 ?" w
                 */
1 h+ d: D' @+ q$ A                sync ();! L5 A, D* ^, d% l5 C
                *addr = save;
( h; Y# \; X: n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: G& n* C- f3 e6 S, y% L, C' A* s                        addr  = base + cnt;
9 G+ t& m  S5 L7 M. A                        sync ();
% T5 s$ Y( |  m% ~$ ?) r) u* E* `                        *addr = save[--i];! p6 ~, ~- @0 s/ D
                }
* u1 Z" k  j7 a0 @                return (0);# o/ Q3 ~8 u  u( ?) v: P& a
        }1 h. _" e5 Q8 Z- \. m3 O. T

3 ]# A6 F  J; Y; D( i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 p9 Z- D( k9 R                addr = base + cnt;        /* pointer arith! */
1 ?# `1 ?8 K5 f  G- M- ~! K                val = *addr;7 F1 |5 l# c" b0 ]( W! d( [
                *addr = save[--i];
/ H, H- h  i+ p& r                if (val != ~cnt) {& g% w8 j' @7 K1 _. i0 X8 u) T5 u
                        size = cnt * sizeof (long);! K! q+ u8 E: R' q$ ^2 D4 U
                        /* Restore the original data before leaving the function.' P5 K( k; @/ i& |
                         */
  _" t% S9 }+ Z( v0 a: p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, {# q8 J4 m9 k) W& ?  k                                addr  = base + cnt;
, t* a3 S% t% w4 @; }# ~, K! P; M                                *addr = save[--i];
3 ^* z/ t  Z7 m% N# R6 Q$ a                        }
- H& ^# Q1 I( ]                        return (size);
5 G$ G, e; G2 ^4 ?0 r; y' S                }8 u' Z1 j0 b* P; W/ Z
        }
% h/ D( N$ r9 a" }8 g
' V1 c( b7 G$ h, S3 v        return (maxsize);" Y8 `* i& ]+ o, W  ^
}( v: z) {4 X- G' V3 n6 s, z  \" z  w" X
int dram_init(void)
* U0 f* Q! V7 ?- S9 ]% ]{
4 `- M; {4 z" [! H( ^' q/ C0 b+ F        /* dram_init must store complete ramsize in gd->ram_size */6 b: y; C- e' b; ]$ E2 I2 W+ L1 d
        gd->ram_size = get_ram_size(6 s9 s+ z# |) U5 t1 h  `' Z# Y( t
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 P% k' \9 |$ D/ ~                        CONFIG_MAX_RAM_BANK_SIZE);
8 X& N/ p# {4 y        return 0;
0 g' |" T% o6 T! |7 Q! l9 L}
( B! J, B1 `, w& z# S/ f4 F  w  R! T

- S5 b: ?! O" M  ], B: u9 {
. \  b0 X/ u( ^! }" \( N( _* T* R$ D; F. u2 `) a( p  w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ l, U7 f1 S2 d6 z% b
$ f9 i- u7 l* N/ C8 ^% ~$ ]8 \' k; l  T% t+ T) `5 O
& [1 \) _, ?/ \$ I+ Y





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