嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 [. Z+ B9 p; ]% h4 [核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 f+ p4 P5 _5 o8 e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 \2 h& d" X5 w! [- }9 r$ w5 Y4 Q6 n! U, L& ?/ V; R% i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 i) q# z/ `8 v/ i7 n! \

( ^6 t! r% J* @# z$ D  R$ A' \
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) R; v% W6 I  `3 t/*
; ~' r  ^, e( L* P0 X* Check memory range for valid RAM. A simple memory test determines
9 d1 E" z* r8 ^, m  \* the actually available RAM size between addresses `base' and
/ ]* d" f6 o* D2 G% w; k3 g8 @: j- c* `base + maxsize'.0 X  A5 X. i- ~' ^# j
*/1 Z7 H" e$ X5 D- a2 D' p
long get_ram_size(long *base, long maxsize): R) V# n" B( r$ p
{
2 d  i" ~0 s) H- e' d( A$ K        volatile long *addr;
; B& n3 |& K  n% L- s1 O        long           save[32];
  r$ _" ?+ ~; I8 D$ z2 a5 Y1 u        long           cnt;, ~/ o' F5 q) d
        long           val;% ?. s2 G, F/ |) `' [
        long           size;$ U1 z, {5 G) i+ X5 j' q
        int            i = 0;
6 ~* b7 _" b: q  |& Z# T+ e
2 Z* m$ @1 P1 P, w4 W9 r  f5 \        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, _1 t+ v9 c' h  W9 `+ [% o/ n5 G                addr = base + cnt;        /* pointer arith! */0 C$ ~$ Q" O  Q7 H1 b; K
                sync ();* }) i4 B- _- W! p
                save[i++] = *addr;
: r: H. b  \- p8 q  y                sync ();% N6 J) |6 J; @$ c8 ^
                *addr = ~cnt;+ a) ?( o6 A% ^$ P" J% x
        }
( N3 j' n1 Z: g, E$ `1 l  q1 h6 f, a* Y
        addr = base;
5 f" O2 a, w+ J) j! `) Y2 s# h) K7 g3 |        sync ();) a: ?& T( q, U2 H
        save = *addr;7 ^1 R+ z, i! {
        sync ();
1 E) b% }0 c" b5 j* o1 t        *addr = 0;: |# i$ [  _; K% o; R
1 y% m  D/ P2 W% j  ]
        sync ();
0 G/ w9 d9 }9 T3 Q        if ((val = *addr) != 0) {
; s) y$ H# t# p5 r4 U  \, @1 E                /* Restore the original data before leaving the function.: _) q# V' j6 G
                 */& O" E* O# O$ [" X
                sync ();) w( X0 r6 q& ~* \" n
                *addr = save;9 ?. S/ |, g% ]
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 }* z) F- O$ B9 A
                        addr  = base + cnt;- ^# t  H9 w( N# i
                        sync ();0 x6 L6 O' ], K# _0 u: @
                        *addr = save[--i];
3 ^5 T" Y' [' {, l                }
) w6 a, i) ?, z! `5 c  y7 S# n( S+ x                return (0);
1 M0 O0 l! h  W, n        }
5 b2 |4 |0 r6 ]1 Z& {" C
; _2 h6 S& Z8 L1 @! n( R        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' w+ G. a: A0 c
                addr = base + cnt;        /* pointer arith! */2 l3 {' N( q1 z4 u1 w+ R! ?. L9 Q
                val = *addr;. r& ~5 k6 ~; `, c# k
                *addr = save[--i];
- U  h* l7 Q: v- G                if (val != ~cnt) {7 u1 T$ `# t9 ^. g0 ^1 H& ^
                        size = cnt * sizeof (long);% M1 J1 _! |# o, r2 V0 J8 S3 r
                        /* Restore the original data before leaving the function.% O+ {& |; y6 q3 O  a
                         */
6 U+ K9 @* X- t$ H* X8 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( f- p0 _, Q! t. V3 U& D6 h, G8 `4 I                                addr  = base + cnt;5 {8 m8 F' c0 K: r# {
                                *addr = save[--i];
( n& i- ^! ^9 ]0 G2 t+ f7 D                        }7 ^8 C- {1 i' C1 _+ i& \. k
                        return (size);
; x" O, t' _- u, e                }
/ |; V. Y$ I! e! S" M7 V) a        }5 x/ |8 ^8 r6 B( H" b" y

2 l6 W6 ~3 y  H0 m) i  q) i9 C* f        return (maxsize);' H" D9 W  ^7 J5 Q: L( H) j) X8 z
}
! C% n3 {8 z$ P9 ?# C7 J4 Q( `1 |0 Yint dram_init(void)
  X: O1 T! l, }, ]: E* E# J{
1 G9 N5 K# p0 F; K' D        /* dram_init must store complete ramsize in gd->ram_size */
; I' g3 O7 J7 C4 l; d4 D  ^        gd->ram_size = get_ram_size(
: p% ]$ _, u1 U/ e: M) W+ K3 [* I8 L                        (void *)CONFIG_SYS_SDRAM_BASE,9 n% ?% T' _! v3 l$ U; @: T
                        CONFIG_MAX_RAM_BANK_SIZE);
# J! l% P! M1 g+ W' H, l; `! k        return 0;' ]3 [; y: @( B
}
; m6 z+ p  [0 m8 m. [5 e2 [. t- _
! A2 J, @1 f3 {& `1 S  I  T8 Q2 ]6 h! R" P" d' n7 N1 P
9 `# ~$ J7 x/ w; N9 |
% t% s; F& U5 L9 L# P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: I4 k' l2 x& o

/ c9 F7 `" l. H  ~
: O) t! U' Y, G1 _) F9 L
2 W) Q* f- |4 b





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