嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. {7 m) a$ U; a" j3 I2 M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 M  q5 `3 N7 o2 h0 c这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 n5 j7 k  N* G+ F9 j
+ Z: ?, M" t0 z+ f( n5 W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 |! Y" H# ^! p$ V' J# k* E* f! ?" @6 b

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# K9 Q  E9 \3 j$ K1 K3 y
/*9 k6 n4 w2 ~. i4 u) C2 H. ~
* Check memory range for valid RAM. A simple memory test determines
& T, B( [: z& x9 ]9 F  O2 C* the actually available RAM size between addresses `base' and
1 A: ^% r& {* e( @) a8 P- n* `base + maxsize'.9 t* h* W+ F+ f! C) ^  q0 p
*/( @7 `  g( |* N5 X8 E
long get_ram_size(long *base, long maxsize)
& _5 b4 \6 f$ O; G. g5 a{; W/ [& Y: b  Y' W
        volatile long *addr;( O  r1 @  ]9 [. g
        long           save[32];. ]4 @: i& n  g( O7 J1 R5 x/ A
        long           cnt;5 ], H' Y9 {2 ~$ [& f, H" [
        long           val;
: K4 f, W( U8 m# n" Z9 e        long           size;) y* B6 h: c7 G
        int            i = 0;
4 o5 M4 Y! X) d7 J3 M% l4 [, O: v4 S  ^6 c4 g1 p1 _
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' o8 a5 o% Z9 C; v/ i                addr = base + cnt;        /* pointer arith! */
* L! ?) [# i9 M" Y6 O% b8 m                sync ();( `+ @0 i) u. ~/ I8 j9 H
                save[i++] = *addr;! ~8 v$ Q0 Z4 z' F9 f' T1 j
                sync ();
, T( m4 d! y3 ~; w4 n                *addr = ~cnt;
  x+ @, j, l/ T4 L; e        }; X8 j, D8 l9 D5 _1 i3 u
/ H$ j" E, T' O, i& z3 F) l" l+ o( R
        addr = base;
, ~6 q' E  r0 B4 T! d$ A        sync ();
% n% @8 L5 {( {1 c  [; k        save = *addr;5 w% A2 O" l* V% |* W% }6 |
        sync ();
3 I4 Y: i4 g% P, Y3 W+ i        *addr = 0;) e  J8 v/ T5 U4 c9 v
7 i2 g. p8 T* u. t3 F. H' f
        sync ();
! M3 Y4 [& m6 P/ E" C7 G        if ((val = *addr) != 0) {
  ]  ]& ]# D5 q. J4 @                /* Restore the original data before leaving the function.# U) y0 K: L; C9 y/ _
                 */  D7 b$ @0 J, n! t, \
                sync ();
" C  P# @7 i0 l7 Z1 P8 |* k$ Y                *addr = save;- o7 b+ F, R8 l+ p& X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ ?0 n- ]5 U% H& _* C! s6 B                        addr  = base + cnt;7 n3 ?( O! k$ k  J& }# r  H5 W3 C
                        sync ();
4 v/ W# o3 X- C- [0 r                        *addr = save[--i];1 d% O) c6 [( }9 L# ?' f- k
                }; p' [4 ?* g4 _! G
                return (0);
- {1 d* Z, u) K& ?& y        }2 \: T+ ~% ^5 D. h' a) K# T3 l

; k' \! g$ a1 C8 ~  O  t4 x        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ \( T3 E* G( e$ g' @8 Y                addr = base + cnt;        /* pointer arith! */
  W8 X% `/ n) d0 G4 K; y                val = *addr;: F+ K0 l) t7 a# [' q% [7 s
                *addr = save[--i];- @4 e. p" x& d
                if (val != ~cnt) {
# C% g- z5 }7 {" D                        size = cnt * sizeof (long);
. o: S- X6 w# w# k                        /* Restore the original data before leaving the function.
! Q7 W8 F: _% m+ [                         */
; G) W0 r* D+ S5 E) {5 m; e- q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 ~8 r3 p$ ?8 D: Z# e" J- f
                                addr  = base + cnt;
  Z4 i' x6 ]% [( O5 n                                *addr = save[--i];/ N; ~; p. p" i( _, S
                        }
% l8 I3 }4 _4 _" y0 ~                        return (size);
; H, o* \! J9 ~# J0 F                }
0 W* O- ]3 u% n0 D        }3 ?+ S5 l3 V8 g$ j3 U: X. T% \
3 z/ S" L7 x2 f- q
        return (maxsize);4 }8 a2 U/ c4 \3 D
}, H$ i6 g7 V5 p2 |- y
int dram_init(void)
4 B. d# D4 i# f4 r8 ?9 J+ R+ e{
  y  F3 g# n/ |5 ?* v1 y/ R        /* dram_init must store complete ramsize in gd->ram_size */
# J0 D7 y% h  {; Z( o        gd->ram_size = get_ram_size(
4 i; i1 y& f, O                        (void *)CONFIG_SYS_SDRAM_BASE,% A' g- f4 r! z9 ?  c9 B# T. O
                        CONFIG_MAX_RAM_BANK_SIZE);
. [8 Q! w6 r, j; P$ W, j        return 0;  ~  A4 t2 N. Q+ A1 u
}
$ J2 g& R1 c/ e! k5 R3 ~* E0 V% F( Z# f# Y

" D: F$ P6 V+ ?9 W5 k& g8 E" k) a4 c+ A- T) N% O
3 F8 B3 n, L% M% H' k1 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, s# x. f" U" `1 w- l
- y4 e, K; o9 }5 O% l6 A' S" K3 b! U6 w" w( \" }
7 K1 U' x, P9 K7 Z4 d% Y+ q" M





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