嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( L, L1 C! ^. \+ H核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ |5 t/ m- i. w( N7 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; v+ [3 {/ f: r! U1 h; m+ K" k9 W) y  i4 O+ r  H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  O* P- f. k3 ]" k2 ?  p7 I) ]- {

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& L1 Y! L2 A' R/ O; |3 B9 r
/*4 C# H1 K6 z* ]* u& B1 [1 W
* Check memory range for valid RAM. A simple memory test determines
. S' r4 H$ `9 y. E6 y  o, d- N0 i* the actually available RAM size between addresses `base' and" d; g. {5 G/ V! P6 `
* `base + maxsize'.: w# d. Z8 u2 V7 V: l, S/ u
*/
' Z: F: o8 W2 O& along get_ram_size(long *base, long maxsize)  [# p! l2 c( j' C
{
, L! |4 W+ W9 G+ l% X: F        volatile long *addr;$ Q0 C: A' i7 j' c
        long           save[32];6 A% q8 q& L) e7 x
        long           cnt;7 h" y) A% ]3 E- \8 V3 }
        long           val;
8 k+ x5 j# [0 H8 o4 n1 |$ b7 _        long           size;$ {' B/ g& ]) Z/ p' }4 o
        int            i = 0;3 B( d9 H8 t/ G6 s3 d. W+ ~, U$ k" i+ T
. @, ^6 ], Z  Y1 j& \2 P/ `) p/ m0 @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 n+ J+ K' |% o
                addr = base + cnt;        /* pointer arith! */
, u! U( [6 K# {2 L* y) \                sync ();
2 |, [( A0 \8 Z+ a                save[i++] = *addr;
# O$ T) N) Y* b2 b+ A' d  t, y6 D, `                sync ();( m2 m) _+ }) b8 D' h
                *addr = ~cnt;
- l, q2 c" G% _' q% N        }) U5 f& z% [" W! w

& D* |# m/ k, J7 t        addr = base;0 X( d6 W  F8 z( e% b; ^* [
        sync ();* H5 ^& w5 l8 j5 n. m
        save = *addr;3 i* _- K, c- w! z# |) Z
        sync ();- F" o  W  Y3 M* o/ X
        *addr = 0;
7 g  M% C9 u. \* W
% m8 E# A" c# u! [# v7 ?        sync ();- N3 X% l! g" q* T
        if ((val = *addr) != 0) {
6 G+ H; X0 I; W2 A" \                /* Restore the original data before leaving the function.  Y6 Z* _9 \, ~3 T# }& m, a3 y
                 */7 E' j0 a1 r7 C
                sync ();
. z. Y( I4 r! M: U  D                *addr = save;
5 p. v. b4 D, J1 H! }8 [' U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: c3 c+ _$ F+ Z9 g8 G4 ~0 i                        addr  = base + cnt;6 w1 H1 ^5 u& m; n) @4 [) }3 m' J
                        sync ();3 a8 G+ X! w* w( Y0 o) D
                        *addr = save[--i];
) m+ D! N- H$ C9 W                }5 s8 \( P. j4 C2 c0 M5 c$ |
                return (0);
$ {* C& ?" f5 o& g; ]" I        }
* n/ X( `3 |; C0 `! \
2 Z' H4 J3 G4 P        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 d1 t6 g4 y$ f( R, u* V9 w
                addr = base + cnt;        /* pointer arith! */% u% R; I) K; M* ]9 x% A4 m% h5 n
                val = *addr;
( c0 a1 ~7 p3 P7 N+ q- j  x                *addr = save[--i];
+ O) X) S: k0 }2 t# ]                if (val != ~cnt) {
& w0 T5 Z0 ?2 c" t" X                        size = cnt * sizeof (long);  H3 ]! O* q) }9 X* _& [- ~% I
                        /* Restore the original data before leaving the function.. |8 J$ l1 b/ j4 ^
                         */. Q+ s% H$ w# r' c1 b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) w2 j/ m$ N4 G3 ?* p/ B                                addr  = base + cnt;7 {) {+ v9 X# D& D3 C+ @
                                *addr = save[--i];
$ k$ P5 r5 z0 w) K# z4 ^                        }
$ p! a# q1 ~+ u  l) u$ M                        return (size);# I$ w  F2 ~4 n
                }
8 m. A. K( N, j2 N6 d5 o        }7 a8 l5 O* s  H+ k

7 Q9 _$ c4 }. Q2 F+ [6 P) {6 Q        return (maxsize);% O% S& o' \  J& w$ r
}
: q/ B8 V: G+ Vint dram_init(void)
7 j( z8 H$ K1 l9 y- Q4 H  P& ]5 u{
! }: b) I6 i* e" k  L7 U; O* A' |        /* dram_init must store complete ramsize in gd->ram_size */
: a/ |3 i& R9 A# Z; E% n        gd->ram_size = get_ram_size(* U( S0 C3 }4 s+ y+ K4 I2 L
                        (void *)CONFIG_SYS_SDRAM_BASE,+ c4 ]; @0 s! a" t6 h; }: k3 v
                        CONFIG_MAX_RAM_BANK_SIZE);, N) n. i! d5 |+ r
        return 0;8 {& K' I& Q$ g! u8 X9 @) G% V8 Z
}& {) B3 }1 B8 [/ u
! S8 G* t, ?3 `7 U' _8 x; [

/ [1 _. r  L/ E1 q8 p! Z$ j% y
9 ]% q( _0 M' S4 c2 m0 t1 l7 B+ _8 B# I4 {6 y9 x; @; z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* s1 J( b+ |4 y; q
% A7 g0 g. s, j( Q" a: o0 l

) @: c9 _$ `( |/ V. }9 G& ?

+ c- [1 B! I, N2 G9 \




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