嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. k& X# Q. W( o8 p  ^  }, K
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; R9 r' M$ s, ?# y% Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( y% H+ {% _+ b
3 S8 D1 p7 `, f3 ]* J$ T2 c, t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) _! |, Y# f2 ]# H* r* A- U0 K0 V- ^+ f" g

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& j" m. H) s" Q1 H
/*" }$ W- Z9 W: B% b3 \
* Check memory range for valid RAM. A simple memory test determines
0 b- ~) `# i2 J* the actually available RAM size between addresses `base' and
& v  f4 A3 j+ f5 K1 }) i  d* `base + maxsize'.1 W. P5 ?0 ]. b: d. Z8 o% ^' J
*/
# U! W! ^# ~: g( a) X1 S5 mlong get_ram_size(long *base, long maxsize)
; ^, i  D. [) Q% |) X{
* f/ L3 B. b2 w( ~, o        volatile long *addr;$ i5 e7 X* [* A; g3 e
        long           save[32];& I2 n' f" A* B
        long           cnt;
0 u; h0 J) s7 R        long           val;( b# X- ~; }+ |* a
        long           size;
: M$ y6 z$ n0 c( p* m6 A( d: f4 N        int            i = 0;: |1 ?* x# r+ Q% \9 W( `" y
: u% N6 `  ^0 }" M$ L' F2 H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# Q* ~) u* H! p& v0 L0 Q                addr = base + cnt;        /* pointer arith! */
3 \6 v7 W: t# t$ j( B8 W1 d                sync ();) w1 n5 G+ _! w( N& K1 ^
                save[i++] = *addr;) ~* @5 C$ P( u7 c' z1 v
                sync ();9 M& O% u" i6 X$ N$ i4 Y/ s, e
                *addr = ~cnt;# p. R9 e! }2 q! o
        }
) v. T  }/ p% }( R, W/ D. F: Z' |/ `: _9 w7 }
        addr = base;# C5 @+ G. p  r  o
        sync ();
; |5 n8 t2 A% D" U! g        save = *addr;: i# P% O' G+ k! a' g0 T
        sync ();9 U4 ?  n* G, ~, k: U9 V
        *addr = 0;
. ^+ ~; ?) O0 a$ |
; s. z" Y; R# B0 a        sync ();
) v* \: ]4 Q1 e+ t        if ((val = *addr) != 0) {# b: a" l. a1 E" o, `% p+ K. f
                /* Restore the original data before leaving the function.
% d# ]% I# Q7 S, U$ t                 */$ ~$ P1 ^$ O( Y7 U7 P$ l0 l
                sync ();
) s8 x3 s; u# b; b6 `$ y                *addr = save;
% ^1 w1 X0 R: Y, o- m                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. ~; f" H6 W. R4 |6 r  f/ t% H8 X
                        addr  = base + cnt;; b. ~- }& n* q6 C  p
                        sync ();
( b7 f  l9 W3 }) n                        *addr = save[--i];& ]5 {  q$ [  D# q. y
                }! |, e( }# i/ a5 g( H# s; e
                return (0);& r& d# x3 v2 Z+ |$ m, E$ l" P
        }
" ]! w% j6 X2 \" u
- b7 b) h- v; |; V. G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& i& C  D" x  b. A% M                addr = base + cnt;        /* pointer arith! */
- [9 x$ b" N0 x- q; T* g5 c. E                val = *addr;( g  Y3 F7 B; N/ C  ]) }( Y
                *addr = save[--i];8 o3 D: N+ R- c$ S* T9 I
                if (val != ~cnt) {, |8 b# ~( t1 o! U) U8 M
                        size = cnt * sizeof (long);
. i+ h* @: Q: ]% [; T" d                        /* Restore the original data before leaving the function.
" k7 i/ J1 [6 ^8 F                         */1 d; c" d; C9 I: a% l6 g8 z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 I- B5 m9 |5 G0 B' T                                addr  = base + cnt;  A) X& y9 i' T# p, ]- u
                                *addr = save[--i];3 B+ X- v+ L0 p
                        }( N' i% z& }, X4 g6 l, O
                        return (size);
7 X6 l; r! Q) m, V8 q, f                }+ c$ c' `) @0 \: \9 V1 [
        }! g+ h* x# ~) y4 Q! K! c0 x
% q; B5 p0 g+ F2 A- Y
        return (maxsize);
4 Z0 C2 q8 e: C* {. T}5 U4 u7 L& X  G
int dram_init(void)
2 E; k9 R! p8 d2 K4 n/ Y3 q{8 a7 I  H7 u% i6 s
        /* dram_init must store complete ramsize in gd->ram_size */7 Z" o4 w5 Y$ a6 e* y- `! c. t
        gd->ram_size = get_ram_size(
4 g, u% l1 X& n, ?9 V3 @                        (void *)CONFIG_SYS_SDRAM_BASE,
; |( s4 c6 f) H+ i& L8 b                        CONFIG_MAX_RAM_BANK_SIZE);
& t- H/ C4 f5 F7 E* Z9 K5 v        return 0;
) K7 k! t- z, s& d  ^4 L6 g$ x}3 Z1 ?1 ]7 h$ S2 F, [- _5 k
# G7 H( Q' F& R3 {5 m3 X
' p. F- k9 D1 `$ D  P8 D# t! v
& W  e! V/ r$ [9 X( @1 j4 [' C
, B& I5 t) S# l  O
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( S/ w5 g: J8 d9 y2 L3 y$ U/ v

$ `" ^: w* x$ t. Z( j, x

- V2 C, J5 @" v4 L8 P# L  [




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