嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; p; S$ O; K* }% |1 B$ i核心板2:DDR2 256M Byte   NAND FLASH 8G bit; x/ G7 r+ m8 A1 a1 ]4 u- |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, a6 ^( i: N8 v8 r4 L7 s* f+ D3 _/ a; a4 E! v1 J! D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 x4 N. D) }4 j+ @7 T% G
, s7 h- @( I6 D) f
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 u8 G& \6 o) _& e4 ]2 A: E
/*
: J8 X/ x" }# p- [7 E. A3 J* {* Check memory range for valid RAM. A simple memory test determines
. y; H! g1 O" T3 ?9 c7 x8 t3 F7 `* the actually available RAM size between addresses `base' and0 {- r2 {6 L5 x. O/ G. G. ?! j
* `base + maxsize'.
8 K0 I& W2 i# z& _2 @# P*/
9 S, [( O) z# u& ~0 |" T. V6 `long get_ram_size(long *base, long maxsize)
4 H, _/ s# s5 Z0 u& _{
7 e) x/ M" _& y3 B        volatile long *addr;5 a" w8 Q1 Y0 h8 g- [4 n
        long           save[32];
2 G) T' }% d2 R: o        long           cnt;6 z3 G9 p8 ^  C! S1 w6 \
        long           val;
- |9 ^# q0 V0 A$ B: c; @# C) U        long           size;
% p! z) R8 L, R: H2 G  {6 J        int            i = 0;
0 X9 H) r8 T& o
* Z: W2 c( ?. F        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! Z' t- v# w" N6 f4 t- d2 t                addr = base + cnt;        /* pointer arith! */
4 S: t) C9 ]  B6 I) Z6 J                sync ();) ~& L8 O7 K, d2 N
                save[i++] = *addr;
% _/ ~/ N$ i+ Q; J/ q* Q5 K% z) a                sync ();
( y. U9 m) |5 t8 a- L, ?; T                *addr = ~cnt;" C0 \% a2 }( ~% T8 {+ q7 b
        }/ Q! ]' _8 I6 t: A4 P5 r5 b

. Q, |8 |! d; ]  y( j% \! x5 Q- `        addr = base;+ l! U4 c7 S) J! n8 C
        sync ();& N7 h0 [4 _' i! w' Q# i" n
        save = *addr;: ]5 A- U8 Y0 M/ Q2 i
        sync ();
) D1 l8 f  C* m# j' K4 Y, t* ^        *addr = 0;
) V; Q; P& I6 F7 c% }4 o' L
4 E8 N2 h! K7 D' k        sync ();' \3 X/ h* G/ w8 z$ S, j9 Q8 R  c
        if ((val = *addr) != 0) {
' A7 B5 B( `/ F0 G                /* Restore the original data before leaving the function.
/ h5 P8 e5 |! ^; o) J1 k0 O                 */
4 `$ g6 U5 |* |9 {3 Z                sync ();6 _& l! S8 z( B' J* @  v
                *addr = save;
6 r1 |* \# G. m7 a( A- d9 H                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' T0 B6 {$ G% l6 B8 e0 P$ ]$ g/ g% A
                        addr  = base + cnt;8 D0 u: S8 z6 E
                        sync ();
) o2 E$ f2 M: F% |/ [/ K                        *addr = save[--i];! ~  D1 W3 r& t% i
                }
2 w; a+ W- o% y7 U% I+ T/ Y                return (0);& \+ }" c3 {% D
        }
5 \/ B% O3 K2 \$ j( _8 u3 S( r# U. l0 y1 @. l! j* n
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( Q  t1 C* F5 \/ T7 ^4 |4 ~& e) R                addr = base + cnt;        /* pointer arith! */$ f4 G; ~! w5 ~8 y
                val = *addr;
/ V+ \9 l( v, o8 }* D* _( K- R                *addr = save[--i];
5 p1 @$ P- G* |  P                if (val != ~cnt) {
2 v1 X( p0 u& |, }) v% G                        size = cnt * sizeof (long);  _/ I1 f' l$ b; ]" ^4 [) Y: |. B
                        /* Restore the original data before leaving the function.' I! G: b+ p# E
                         */0 w$ A3 T/ R  g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# G  w7 w' w, X0 y% i2 a  B) X
                                addr  = base + cnt;% G4 [1 ^" g% z4 O+ @
                                *addr = save[--i];( Y- o* W" j% t( {
                        }, J: o7 a% O! T3 ^
                        return (size);7 I' v' h- t7 [
                }
8 A) K& e6 z0 i, X+ }        }" d  G. D2 k5 m  q

& B$ h+ U& |. M7 e5 I0 m0 A        return (maxsize);5 {' O" v/ I% Z. c
}1 e9 N% D0 M3 `8 d2 ?
int dram_init(void)
4 F+ ^7 L7 N0 j8 i{4 j; H$ M* Y3 k1 w+ D6 F
        /* dram_init must store complete ramsize in gd->ram_size *// Y% `$ S* _. |$ J$ y# L
        gd->ram_size = get_ram_size(
! E/ k6 q" x$ ?/ E5 |' X                        (void *)CONFIG_SYS_SDRAM_BASE,
( r  k: h3 e6 q  ]# |                        CONFIG_MAX_RAM_BANK_SIZE);
1 r8 c$ S8 y$ @  G* u& Q        return 0;
0 w0 P7 |/ m& j, |}9 S; C/ V3 ^$ L% j6 J

7 `% `, j9 w: ]0 _
" b( H! {( }3 D) g. V6 d7 c) }( L" v7 u, P* D  f" G/ {
) E& }3 N) Y7 P# g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 W  {- [. J! N, Z: H' F$ g
2 J, d1 ~' R5 L6 {- }
) I4 T8 O# W3 b, ?/ y; l5 x
4 A$ t- h6 P0 |# d9 ^( Y3 S' e





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