嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  w9 B4 d. _* I4 ~/ M核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ T" x4 {* ?; C2 Q7 h5 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- E5 y& V& X6 A( d" c8 k& `$ `4 J2 d# w7 ?! B/ H0 y5 M5 q) A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ ]2 m, u, D& f, l/ k; \% M9 T% |
# O( @7 W* x0 A; Y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) w0 w% S0 u* y8 m6 k3 R* q) b
/*9 ]2 W" M% O7 Z4 x
* Check memory range for valid RAM. A simple memory test determines
' t6 O2 L: w* ^* T* t1 [* the actually available RAM size between addresses `base' and% x' k! H+ ?0 X+ h0 `+ H7 b
* `base + maxsize'.
- D9 ^/ d9 b0 J3 @2 s' A* C*/4 {6 A" J  V: k
long get_ram_size(long *base, long maxsize)
; X2 E  `$ J8 D& v' t4 A, B{/ P4 t( ]! J) V$ o' L! P
        volatile long *addr;% l; u& A: S, c1 g& ~( D9 Y" u( k
        long           save[32];! y' `4 B7 S. x" A0 m4 d
        long           cnt;
! ^! B; C- `! @7 K2 Z. m) D        long           val;% E& H: g* n) P  _( T7 v
        long           size;8 [/ K: Q! ^7 x, D5 M/ K% G, s! @  L
        int            i = 0;
& S; ~+ y% ?7 p9 D# Y) m  u, ?- |; u/ ^6 I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" }# u: E+ m; J) a                addr = base + cnt;        /* pointer arith! */2 A8 R% H& L5 b# |1 n/ y; Z
                sync ();9 m0 Q) O2 D! P+ U1 t8 }
                save[i++] = *addr;' Z; v8 m- y# a4 z0 c/ W% S" Q  Y
                sync ();
! G8 U9 n+ D6 Y, O                *addr = ~cnt;
4 v4 W7 @) P7 E        }
/ z" \0 k) I1 Q' A5 q& }
0 M& V7 _8 Y0 J+ q5 Q% o        addr = base;
* E% [% o; T6 o7 N% D        sync ();( z: t1 }- |1 o9 Z: z) L5 D
        save = *addr;( h3 n7 Y$ f7 r8 m+ @+ \
        sync ();
6 d, j* ^2 G  v        *addr = 0;$ T! Q$ Z: ]0 t: C6 B

4 l# P# Y/ k7 I( |3 {        sync ();+ ]' }' S' g6 K6 K  ?3 L% m; \( Q
        if ((val = *addr) != 0) {5 l5 k; A  P& M' Z: _, r
                /* Restore the original data before leaving the function.% z% ]1 x% {. X' a. k* d2 C
                 */
( U1 A$ I0 G3 ?) V& Z( V                sync ();
& V0 K  u& q* m! h( d$ _                *addr = save;
0 p% O/ i4 \( e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* J* |3 @; e2 l- G. B" S  M                        addr  = base + cnt;
' |- T" D1 ^9 C; m                        sync ();
8 [0 ^; F: E; }+ G( p                        *addr = save[--i];
. W( f4 z: _3 ]* n3 B                }
8 Z/ R% }' [5 z1 @; `                return (0);* t& S! D- G, e% x% c" n1 x
        }& Y0 j% L  [# r: ?
( }9 j$ A" ^2 V$ f" b2 b, x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, k  x/ X( z4 Q0 M1 R0 s) n
                addr = base + cnt;        /* pointer arith! */6 O8 |% C0 a% V: p' Z, R8 h) G
                val = *addr;
; l/ u6 x, B0 w, W; E% ^                *addr = save[--i];& }- l1 u; _4 z
                if (val != ~cnt) {9 M, w2 {: Q' U6 S* w9 |& m
                        size = cnt * sizeof (long);' K- m% q0 z0 ^; K* e
                        /* Restore the original data before leaving the function.
: c: U( ~6 d& o: }& ?. f  g                         */
' B6 f6 Q; q- N+ f: v1 ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' p1 a7 f, g, n1 }! [                                addr  = base + cnt;
/ A4 P, c6 t% r/ s0 N7 C! r                                *addr = save[--i];
' ]: s3 z; u/ q7 x- Q; ^                        }
- Z( K  ?- A, A$ [7 e2 `                        return (size);
8 S1 a6 X+ v  D# {) n7 `                }
$ z" I7 g' p: f        }
+ d1 w3 ^. e; T+ K
' A) |# p" U$ m: }* b% F" S7 n        return (maxsize);
# z6 m* e4 E1 i) a" g6 P}" z' y4 O9 X+ z/ k
int dram_init(void)6 J5 c! X) X8 ?0 h7 W2 [
{
7 @6 [0 N2 m8 ]  K        /* dram_init must store complete ramsize in gd->ram_size */: Z9 ?6 l( w  n  {  w
        gd->ram_size = get_ram_size(& H* }4 u+ b  S, g" C# `& X' L3 F
                        (void *)CONFIG_SYS_SDRAM_BASE,
$ C9 ~& o+ ~' o: n' Y' o/ s                        CONFIG_MAX_RAM_BANK_SIZE);% }* @" A' `7 D
        return 0;
: s( p  h% G* H9 O; w/ I}
# [8 A5 s$ A! W7 [( V2 R- t/ L/ q" f& ]0 c  Q' o3 B. T4 s

- F, @' s( b3 ~8 ~$ y$ h: ^/ e3 a1 g! E' J& A7 p4 x; o! f

, h% W( q$ a9 L; I* ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! V; r$ I' w- ?9 N7 `; p

. p8 f3 i& C& z: r  g7 K4 |) _: H, F5 h, }, K% o0 C# y1 h

. G' J' C6 K# c, m  B$ r




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