嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- e, [" i- e8 I7 @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 q. o& i0 M  L9 T5 N+ c% y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) m2 l) k. _$ E0 u% [, j, n8 K  ^, d. @% Q! }( P/ G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; p% C9 y" v; Y, g
) p! @- l8 y& i, Y/ t# L7 q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! h/ L' J3 L$ l; m/ ^* |
/*! q1 i, y3 o% [9 w/ a( v2 C, h
* Check memory range for valid RAM. A simple memory test determines. x. G) k' o2 \3 Z$ }3 P( {! c
* the actually available RAM size between addresses `base' and
, S# G" ?' G+ A; N: @; f: r* `base + maxsize'.
( H: L) r+ F" ^- a*/
0 c" V2 [. K# F6 h7 V1 ulong get_ram_size(long *base, long maxsize)4 W3 H7 c5 I& ?+ j1 V
{
5 o3 p6 |# C, K* s8 ^        volatile long *addr;9 C2 i$ M, R0 z% t6 W8 f) g
        long           save[32];
( }$ G9 S- `8 a1 g, t0 n        long           cnt;/ H' i$ ^; E7 [" ~. Y
        long           val;: [$ l" o* ?: T
        long           size;
/ m+ `+ r% j8 |' Z        int            i = 0;- E9 R2 h/ j1 S1 }
( s8 [+ `* A3 a# e+ ]
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- i2 S7 \) n( |$ y+ v
                addr = base + cnt;        /* pointer arith! */4 h6 K6 E, I9 H
                sync ();5 K# {# r# |; a% ]
                save[i++] = *addr;
) i$ r9 h/ |8 }! k7 I: K                sync ();& _& w0 j+ e9 |* ~% P% @4 n- u
                *addr = ~cnt;
, D: c: `1 x4 `6 X3 B2 ]3 U" o        }
. P2 z: `& A- u2 j) ?, e2 B- Y+ k2 P+ w5 F+ b7 z
        addr = base;+ N, H' E( i) |) `. a" W
        sync ();6 c' I( m! ^' m3 u
        save = *addr;; q  H2 n) z; F
        sync ();) q1 o1 F. @+ o5 a& p
        *addr = 0;
# v9 q. q3 p& o' _
3 Z/ }2 X+ Z1 B, _        sync ();5 L) ]$ E% H% Q
        if ((val = *addr) != 0) {3 a3 t, i$ m. [
                /* Restore the original data before leaving the function.! L2 {$ Q  R/ g$ U7 C% w/ Y  a& |! j0 W9 a
                 */; l: Q6 p; T. a/ P
                sync ();
8 u. P% k+ U+ d& V; _  J5 I9 D, L; x                *addr = save;
2 D% x; T9 a7 u- T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 a  r! i6 l! R4 e" ^2 h; B
                        addr  = base + cnt;5 e+ [" ~' n0 n  P0 O5 n
                        sync ();
9 {: z' Q4 ]; Q' }                        *addr = save[--i];
" o1 }8 z: t2 o: H& }% p                }9 P* g1 S" ?( V8 e9 H' y
                return (0);; C5 |, Y5 z- @9 r# Q$ w
        }* m/ G) m$ F& q4 F- [3 n& C

- ^0 ^, l1 k0 r" [+ J3 S) Q( H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' |; }. f% Z; \                addr = base + cnt;        /* pointer arith! */1 P2 m% g. [' _2 |
                val = *addr;
2 T. E4 P0 e0 J: j$ e                *addr = save[--i];
- t; z* N/ [8 z8 d                if (val != ~cnt) {. {4 `! C% K: K
                        size = cnt * sizeof (long);
: w, Y/ n& \+ |5 k6 x                        /* Restore the original data before leaving the function.1 l, S& A4 I2 G( c" n. R1 ?
                         */& t4 a! W; ^5 i3 W9 o1 ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 _" t; g) P$ F- \$ w# R                                addr  = base + cnt;5 y5 P+ n3 x5 O
                                *addr = save[--i];
* H! ]7 c( @/ H/ A  a% P                        }( S, g. T; |  h  T# e4 P- W) c
                        return (size);1 [# N( [2 F3 m" O4 N
                }
+ p; K( F% F3 ?        }2 _8 C4 k) E; h  p5 I% ^/ _# ]

+ l& l  I5 ^; E, K9 X0 m* w        return (maxsize);
' |2 Z8 j% I$ ^}
) }8 Q9 S! `) ~, {1 \/ mint dram_init(void)
6 B2 E/ y. Y" A% v{
) L& @7 K5 d* K6 i" ^  A/ X        /* dram_init must store complete ramsize in gd->ram_size */1 X; m" x! B0 `- q" m5 h) C% F
        gd->ram_size = get_ram_size(
, `9 K# e7 P& \( _                        (void *)CONFIG_SYS_SDRAM_BASE,0 @' K0 ^6 H5 X: L5 c* N5 `
                        CONFIG_MAX_RAM_BANK_SIZE);
, S, E! X- q1 T' c; P. ]$ s1 x5 S        return 0;# ~/ }* n/ Q) M8 B* H$ _! ~1 n
}2 f  b" ^1 i' g, |1 E( D9 e% D4 k# X

7 X9 L; x' o, E3 l3 w% M2 l' e8 D, @5 n6 n. u8 p+ g; [

' _, D% x' `# d
5 r2 g& Z. |% D. g" G- {0 Q  hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" E, H6 n1 G  L8 p, r6 {$ S3 X( [! a- E: p; e# H( v# ^6 Z# Q

1 H  G) _/ t9 a6 F8 A
7 l% v% l3 a- d7 }





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