嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 h1 B6 V/ N% K核心板2:DDR2 256M Byte   NAND FLASH 8G bit; U; G' g' h+ n# Q; s) K  Y0 r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% Q* h8 F" G, }2 J& Y
9 G7 c9 M$ P6 w" n: s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) O+ D9 I8 w; s% u1 s7 u9 t

) g3 }, g- u- S- z! c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; A/ T/ u7 T% i! G* z
/*
0 \: I8 w2 R/ `6 x- E" ?. E9 ^* Check memory range for valid RAM. A simple memory test determines& m+ r( z% K" }
* the actually available RAM size between addresses `base' and, h7 {9 k- H9 r! K7 ^+ ~4 E
* `base + maxsize'.0 s; d. F, n: y. [2 T7 J
*/
# C* z/ b: N" u* m3 J% ]( _9 H9 Hlong get_ram_size(long *base, long maxsize)) D4 q# p% N4 E4 U% l. y$ ?" D
{' Z( I+ f! l6 g; W% x+ n
        volatile long *addr;
/ G* N3 r" ~/ G$ {& z! g5 m. w: B; Y        long           save[32];
3 r+ J- ^& G7 R/ S& R' k$ K5 f        long           cnt;
" m. [  k5 V$ A        long           val;+ F2 u2 T0 y  h5 }( ]; S' l
        long           size;) i! d8 X; Y& _) |$ z( U4 ]$ G" d
        int            i = 0;
4 T4 [/ l, u1 ^! c: p# w& ~: g6 o! Q  o; b! B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ M, u- w6 a0 l' f                addr = base + cnt;        /* pointer arith! */! F2 J% C8 e# a" f2 Y$ j
                sync ();
& o* l- `' t$ N. ~4 O8 g8 `                save[i++] = *addr;
( c: M) Q$ h5 d: g8 j                sync ();
: O" k# u: [# O! W, d                *addr = ~cnt;1 i/ i+ p8 _& @& k; L& [- d* z
        }- g+ g& L4 h. E, @. P
2 M. Y, v( p4 ]" V  S0 t; j
        addr = base;
! A$ Z- B' c, k: w9 `4 u, p        sync ();. R! n. B0 ]  u! {2 Q! y' U+ x
        save = *addr;
/ W" g/ T. W, r- D7 i4 s        sync ();7 g$ {. Y: s+ G
        *addr = 0;
) X  O; K/ ^* o/ o% z' P) f( g& }0 N5 N$ N; v$ S5 N+ v* r
        sync ();
- K) s1 C6 }. t' o/ a        if ((val = *addr) != 0) {
, Z  O+ I' h% k                /* Restore the original data before leaving the function.
# g; G' `  U! j2 L7 o2 a( r9 E  S                 */
. j$ i* F& k* x: ~, g                sync ();9 f! i4 l$ q% e7 `
                *addr = save;9 ]( d' d* }+ a7 W
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; r9 t2 W- H/ z: A* }3 W                        addr  = base + cnt;
  M9 B, K' u9 l$ @                        sync ();
' L0 q( l8 N  Z& _" z* G                        *addr = save[--i];; I: a* H8 ]% R/ z8 I
                }6 j2 G" N0 d$ v: `' ~, w
                return (0);" c6 q& o$ e' A: T8 m
        }# l% X9 D2 `/ o" B( f- o

+ e& Y! L, M) \+ u1 V; u9 X        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# P" Y: Z9 U5 c) s8 G. P                addr = base + cnt;        /* pointer arith! */
5 k; V, y3 N$ @                val = *addr;
9 R$ e" b+ r: ^5 P1 p  c7 \$ ?                *addr = save[--i];
% N( i" r9 |1 ]' k8 r7 P                if (val != ~cnt) {: v1 U3 o+ ~  {! ^* z
                        size = cnt * sizeof (long);
: e7 `3 f7 A( @- c3 \                        /* Restore the original data before leaving the function.
* x* K6 d+ s9 }) m' N3 e                         */# O( o9 ]3 B5 z5 e: E2 N" o0 ~
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% ^/ d) Z: n8 V8 v; u                                addr  = base + cnt;
8 q5 b) t4 `% i  j( m- F                                *addr = save[--i];) h" b- W, b& a# `- \
                        }' u  m$ j4 N4 D. u/ T1 s
                        return (size);
: N0 y& [* V2 }/ t$ ~0 m                }
  }. B  w0 x% _5 r/ B2 H        }5 w- c% ^( l* q
6 _& a' y: m2 E0 {: c7 P; L: N9 ~4 q
        return (maxsize);3 G$ B0 z5 v" [3 J) \5 r) K
}3 N8 r7 _5 N: a, |  m. z
int dram_init(void)
  j) `* \: v' B9 a{
. G2 v' Z5 r6 ?) q5 e( E2 x        /* dram_init must store complete ramsize in gd->ram_size */
& X( l8 Y* H2 z+ l        gd->ram_size = get_ram_size(
; w$ h& I& h' `' s( X& L                        (void *)CONFIG_SYS_SDRAM_BASE,+ m( o8 X9 ?  e4 t. h
                        CONFIG_MAX_RAM_BANK_SIZE);: \3 v! s6 E9 k3 i( h
        return 0;* d8 }7 @  ], q7 c* L
}; z; R, d" ^" T0 L" S1 W

% I  k) m) o- C5 b% v
9 c2 Y* |. X% V3 ]' w. A8 D# i) _% `! @: N: n& o  D! M
" j* z1 B3 _5 W0 i+ P  o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 {8 _$ Z; f9 B
  P% n4 O; v' p9 z

3 \. g2 T7 t) e9 y

9 Z8 ~. a1 ~. b7 N




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