嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 j0 k$ {% q# |
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: J+ F4 u) |6 J* e& F( o& |, b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 [, Y# d. o% }6 p
7 N6 _# y3 m7 s+ |8 I2 A2 g/ `* |是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 b& @4 o) z" h; Q* V

/ A% \) F( h# D- ?
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 J; E+ @. \7 w* f) R: ^/*
- O7 a% Q3 m( b' r* Check memory range for valid RAM. A simple memory test determines3 W' D% O. i4 W% h2 E+ e  C- F
* the actually available RAM size between addresses `base' and, F7 \  u) t0 m$ j6 x
* `base + maxsize'.$ ]" T4 G9 v5 F% b/ r
*/
' }" l; |: {$ K6 {2 ^long get_ram_size(long *base, long maxsize)
" Q1 y( w8 u8 B{
' W! n( l1 f) m        volatile long *addr;
1 b9 S) h5 e4 h  o! y$ ?        long           save[32];- X4 |# N1 C/ e  j
        long           cnt;
7 g1 }' {2 o& \! [( ~# i- H# t# G        long           val;
, D% D) h9 E; h) u$ g        long           size;7 I- f, b0 [5 G
        int            i = 0;5 F( `8 |6 E4 `7 q. f$ G3 b

3 X8 x7 J) p9 V3 w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ o/ |9 |1 f( }( Q6 m9 g                addr = base + cnt;        /* pointer arith! */
: F8 a% K: U* Z- ]                sync ();& |" A2 H, a& h  }: k. P  m
                save[i++] = *addr;" a8 x( T: W5 Q) O! T
                sync ();7 k* K) D* g2 ^: O0 s
                *addr = ~cnt;
* ?* Y% j; b/ T4 d( j" m- s# i        }* ?2 ]) S# S. \% U% y. N2 n
+ e4 t$ Q# o+ T/ P3 Q
        addr = base;' [8 N/ Z& h& X3 Z/ n- V2 c2 z) J3 |0 ~
        sync ();" V) f$ c- k* h2 A$ v
        save = *addr;
3 V0 C7 j& k8 i# B4 M        sync ();) q% U( i0 ^5 Y" j: x) F2 D" T
        *addr = 0;
, X+ R% g$ n$ s
7 _6 `. p( b9 `  ?! i3 b/ E8 O5 b% e        sync ();
9 E: m8 B5 ]& s0 |        if ((val = *addr) != 0) {* N2 M. Y' ~$ N1 d+ R
                /* Restore the original data before leaving the function.* ?/ ^4 m3 w+ [8 W( V1 X' E
                 */0 E$ O3 ?0 j  ?7 k: m
                sync ();
3 Y) Q+ H4 u8 @) A6 |; p, K9 T                *addr = save;
6 a5 d& ], N+ ]* ^4 i/ z; q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 r5 K1 [3 R4 v! y3 _
                        addr  = base + cnt;" W8 o4 i. \* V9 H" J& {
                        sync ();& C4 v6 M! w4 C2 G1 T  Q* a; e
                        *addr = save[--i];, @, v* M& c, r: d. D
                }
2 W# O, N" y6 D, {& O* w4 p" g. ^                return (0);
& B5 U; V( j1 q+ g) v( Z" a        }
  v* @4 r. |' j8 A: m$ x9 v( g+ G$ ^- r, X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ \- Z/ l0 v) |; H( [( r
                addr = base + cnt;        /* pointer arith! */0 S- {- @" U( r
                val = *addr;6 O% s3 R- P: e) I8 Z& `- U
                *addr = save[--i];6 F! V4 V9 i6 `/ {* ~" p+ a
                if (val != ~cnt) {
# u' j6 V# u3 R& B+ i. l: ^( M                        size = cnt * sizeof (long);- W2 K. V% N) T. I; v0 M9 e$ g
                        /* Restore the original data before leaving the function." C6 N! o; ]8 ?5 c& v& h0 B! ~7 k
                         */
* W7 J7 B% H% A7 z( y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 q- K# d8 ]8 s0 F7 o$ a$ u                                addr  = base + cnt;
/ Z/ W/ }8 }3 Y* w- T                                *addr = save[--i];  M6 [: R6 g- t& n
                        }) ^2 _1 H3 X* Q
                        return (size);& B1 x  ]% n5 H+ E8 f% z' R
                }
# ]4 U9 c2 c9 c        }
" o* |% t& _! s6 i. n9 h
" A# P3 f: H* u+ A1 m; i  e        return (maxsize);
: k+ e+ ^4 }5 n0 o  p8 z' Q$ e}! r" h3 N9 ~# _4 O) J
int dram_init(void)5 V0 T' R$ W. `! [( H
{
  Y9 r; C9 @4 W        /* dram_init must store complete ramsize in gd->ram_size */
& U9 Z, v, p4 s! Y6 D! j        gd->ram_size = get_ram_size(
7 S2 o1 b% M- H- e1 x4 @                        (void *)CONFIG_SYS_SDRAM_BASE,
# M- T8 P0 \8 M  J& A                        CONFIG_MAX_RAM_BANK_SIZE);
0 V; y. Z# S1 i5 n7 d, f        return 0;0 L4 n! R$ x5 Z. j: q
}
0 U' O" i$ T! c0 u, k  ?
" ?; N( ^0 @$ U  V/ F, B
* y  I$ Z. Q4 B9 X3 n+ e. {" X4 G4 k3 o1 T9 q6 G4 D6 R/ o# x
0 O7 N7 u# \, m9 f) g7 F7 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, G% @( u+ w8 n9 t+ A
# V4 A8 u& m# s2 w1 i" J: j6 s: y7 ^5 G. `- w! B6 u

) H( X2 k0 ^. Y( d6 v' ^& Q




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