嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; [- b9 X( R9 H. ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit. D# B3 ^: ~! p4 y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% A8 d% C1 u+ \' C% O" r  _
5 c* S9 h: v  c# H7 ^3 H. E6 F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 f0 W# k2 v3 }! j7 U- S7 [9 }2 W# A* l9 T! _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. N' c1 t3 \' W8 u  B
/*( l3 S) y. r% G- b3 M6 Z9 Q
* Check memory range for valid RAM. A simple memory test determines
# k) v+ S6 o/ i7 q( D1 A* the actually available RAM size between addresses `base' and
/ L9 l$ s8 `5 Y4 Z+ Y' ]* `base + maxsize'.
( R1 U" L& r6 b; ~- i$ k  H*/7 `' m) R. p" G, l, Y3 L7 `
long get_ram_size(long *base, long maxsize)' x# q7 ~" z$ v9 F1 G9 d$ q
{$ j! r1 ~7 c+ k9 @- g1 L. ^# Z
        volatile long *addr;' O# ]( e1 A5 q
        long           save[32];1 M- j- D+ ~8 Q: _( y* I
        long           cnt;
5 R* m2 @( A( a& o2 O2 j        long           val;( ?4 m- h  T  U. f5 U( A; w
        long           size;
, X( ?# u, b1 L        int            i = 0;
( P% e2 k! A' P& q1 A& c" A0 ~. g. ]' h) _! [% I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) \# K( t0 L: \! s( k                addr = base + cnt;        /* pointer arith! */( ]! B" G( ~( q2 W% X3 S/ Z
                sync ();! ?. E8 s- ?: k: t
                save[i++] = *addr;& Q7 {  J4 K1 Y. }+ Z" l/ \8 V
                sync ();3 ~1 G& v% G9 h% b, W
                *addr = ~cnt;9 a3 p! b3 W' f( B5 }& [( l
        }; }+ J3 Q  q9 r, r
4 Z8 a, v2 z; {7 p# |" f2 t" H
        addr = base;% N  T+ d. S/ n
        sync ();
$ G( o# e, o2 U' w1 i9 w. Z0 @5 O        save = *addr;7 K9 q( L' Z& D, i6 t; X  j
        sync ();
+ I% C1 t; @! S        *addr = 0;
  t: ^' ?: t0 O! l" V( ?) n5 e, L8 b+ Q; V
        sync ();
) w% O1 B; x/ w8 h, d! u8 |        if ((val = *addr) != 0) {
& [( u6 x( d7 ~/ l  q                /* Restore the original data before leaving the function.
0 ^0 _( N3 e; w- B& x                 */
: r8 m+ A* M9 R1 z. i) y                sync ();9 f7 j% c! c, T" k3 v8 B) O
                *addr = save;
+ G* Q; ?; i0 c" W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 @$ b( O: ^0 g; H% g7 V                        addr  = base + cnt;
# I3 q1 o9 R6 P3 X                        sync ();7 |; }- B' \9 U9 j# v- z& M
                        *addr = save[--i];3 u; P& Z) h1 O- Z$ J  @1 z
                }* P9 y* ~* Z8 r3 i" W) t/ T
                return (0);
$ L: ^- M7 R- }$ a4 \0 \        }
' I$ p8 O9 R! N3 d  }: J
. w- t) |4 i5 I; e8 U, i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 z8 G! i; I7 ]$ L, ?# |' \
                addr = base + cnt;        /* pointer arith! */" }$ M, e) k+ |  d: N/ P; e' Q
                val = *addr;2 d% S+ r/ k7 j0 o& Y* z
                *addr = save[--i];$ Z/ r7 j! g8 b4 |  B7 a) D# z
                if (val != ~cnt) {/ N& [# Z! A  k
                        size = cnt * sizeof (long);/ }' P; C1 S1 H
                        /* Restore the original data before leaving the function.
5 S3 t4 `$ _+ C2 G! ]; z; w- g$ c                         */) \7 ?+ X* ]" p1 l/ R
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D8 K  s+ K0 [- X2 w$ M  n. H                                addr  = base + cnt;" ^; L" m& w9 k6 \
                                *addr = save[--i];( s+ `: o; h9 q/ _, f% i0 e
                        }
* E1 Y0 V( Q0 d7 z) s8 V                        return (size);) C/ M" j1 m) F: \: j
                }+ K5 O. `) l) K9 s: \4 d/ b: |
        }8 m; y3 U6 o" e/ N4 g

- f- N  K+ v6 d        return (maxsize);
" x1 b" ^! k' \}0 q' g8 a- z6 `, H( c, [4 m+ _4 e
int dram_init(void)
5 m; T( l& ~! g8 I( R{
+ o# ?" b  J$ F( O" q        /* dram_init must store complete ramsize in gd->ram_size */
! r* j8 u) J3 n& l        gd->ram_size = get_ram_size(- l$ a1 l8 O, ]; U9 Z
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 `$ D* T7 w$ Y                        CONFIG_MAX_RAM_BANK_SIZE);
2 F- f9 q$ l: v+ U        return 0;' n# B3 T! k' S; l& t0 K% l
}* s+ W* \; T% e4 Z# f
# X& C8 J/ K; }( W8 h' U* B* M2 M
; f( Q* v" Q: P$ L5 d

7 y6 P& r* P& x( M8 U* H; s
; y/ S) T# K' ~1 d! C4 Q# c8 nFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 `. c+ F/ i: X- o
$ c: t+ c! F: k* ]
! l* t- ~. V* K

' S3 X# d+ {( [; v4 z9 |




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