嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! C4 f6 J! ?# p3 i
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% o" q- V$ N- F- J! z. c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% m* p% N5 R5 U/ B9 Z
9 l2 t0 x1 \! T0 [' C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" n* s. @; e- E: g9 m0 P

. F* x# X8 t- U7 N& |2 r( y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( }0 M) {7 Z3 i
/*
$ w9 ?1 N( N( r6 X' `2 Z7 A* Check memory range for valid RAM. A simple memory test determines4 a0 x+ g, t+ f, d8 V
* the actually available RAM size between addresses `base' and' G) p+ T8 B- X3 N7 s
* `base + maxsize'.( s" P7 c: h5 V# b7 _: |/ e
*/
0 N$ C" g% L! F3 Ulong get_ram_size(long *base, long maxsize)6 W( {3 F' L1 r4 V
{; E7 c, c& s8 }, F8 D0 Q! D
        volatile long *addr;, N+ V& [# w1 D
        long           save[32];2 o2 W& s; b' J
        long           cnt;) J- H9 K$ s, H( w. p& m" O
        long           val;& j4 Z( Y- r+ ]  C) a
        long           size;
; S% M* |. `5 D        int            i = 0;  {" n' n1 d" e5 R* W
& O1 q4 ?5 O7 t; l4 r9 p0 a- @. z1 g
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ U$ f% c7 ^6 k0 D% Z. m
                addr = base + cnt;        /* pointer arith! */
' z: C, r5 ~3 z2 i' c                sync ();  W0 j7 A/ h+ E
                save[i++] = *addr;8 ~2 d4 g1 ~$ Z4 _1 G; Y
                sync ();
8 c8 [: F, @% X0 X: G) i+ I, K                *addr = ~cnt;
0 |9 ~/ h) {' ?5 I2 X2 F' r        }9 ?; w4 u9 O: @3 V

8 t0 D/ |6 m5 W6 \        addr = base;
% f& [; X! X& {1 q        sync ();
$ A7 q% z) p6 j        save = *addr;
9 J$ @0 _) `% H: U        sync ();+ ?# t: ?# l7 [" {4 I9 ]$ R
        *addr = 0;" B4 Q4 o7 Y8 d+ j

4 h3 Y& h4 X' ]( Z        sync ();* q1 Y. p- ?  w: Q) k
        if ((val = *addr) != 0) {
( A: a7 w* f% r7 p- \% W$ f                /* Restore the original data before leaving the function.6 N0 y1 M, M- Q7 u( u
                 */! B+ M3 c5 \: }9 u6 e& d
                sync ();
& j. e/ u# M, n# {! s                *addr = save;& x; ]3 |& g  h' c7 m
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. I2 P6 {' S+ @9 @
                        addr  = base + cnt;
# a: `" Z) d' Q/ n                        sync ();
; s! Z4 s2 P+ d8 b' X/ C                        *addr = save[--i];
# V- O6 P" X4 v9 U+ U                }
( J: j* l# Q+ C) ]                return (0);
. ^+ C1 j& J' [0 O/ }        }* V. R4 z- Q6 q  `# ^

/ F# D0 ^+ {( `. `/ w        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; x& M' ~/ @6 @% M
                addr = base + cnt;        /* pointer arith! */1 q" M$ p) r! q  s  X: M
                val = *addr;
% |( M4 l  i: m' V! k                *addr = save[--i];& V% R8 K! B) W$ ?9 J+ e6 N
                if (val != ~cnt) {; ~0 w  e4 e/ v" J7 n
                        size = cnt * sizeof (long);3 C% b3 v) D/ m9 e) u8 |4 p
                        /* Restore the original data before leaving the function.$ Q& i% h" x; O9 {
                         */
9 h6 u: ~' {& |% M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ M! B3 c! \. G# r. H; x3 B
                                addr  = base + cnt;
- Z/ s4 o9 D4 n8 O0 c                                *addr = save[--i];
8 m( h$ N4 H" F, r* T  ?                        }1 G" u7 h3 k, G) V) _" c$ M' R
                        return (size);5 a, T1 x$ ^/ c
                }9 O& I; F# W1 M& N) y+ v+ Y; }5 }+ p9 H
        }
% c8 C7 ]0 {, b9 s3 }! H) G: G9 ^1 S7 ~9 `+ n
        return (maxsize);
; _* x& m9 B* I+ j. k% q" ^}3 F7 |7 O% c+ m6 D
int dram_init(void)! P* t5 _7 W5 U, Z/ a
{9 [* ^  @8 E: x
        /* dram_init must store complete ramsize in gd->ram_size */
6 x! j2 S- ?- A' Q/ v% n; y# n2 t        gd->ram_size = get_ram_size(
  W5 u& |5 p* f3 k                        (void *)CONFIG_SYS_SDRAM_BASE,
- r& y7 L. p3 p) [                        CONFIG_MAX_RAM_BANK_SIZE);+ Z+ \# Z$ `  q: @% s/ o# X9 v
        return 0;
' ~1 D( P8 j" i7 G& Z* Z8 t}
& j1 n, Q+ N; C+ Q1 s; c( m- n; _' S
9 @! h8 _' O, r1 A' c; L# q$ i

  N5 l' I* s6 H. P  i
; d" e$ P# F$ zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 S4 ^9 [, j2 P0 D7 P& c4 {5 {! F) h9 y; p
% S2 g9 }2 G* K

( _  `1 t$ f$ K$ t+ [. V0 \. p  \




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