嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 q, k& Z* w4 V2 t, e核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 t7 I" u; _# t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 |3 T* k( d0 `% l
& m1 K) d$ D% X  ]8 k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( @( ^( N( _0 M- v
% P( b$ V$ E& Z  h9 T+ k

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" s2 i* m* v7 }4 w7 Z7 S1 P
/*! {' y' ?  Z! h2 G/ _/ B4 ~
* Check memory range for valid RAM. A simple memory test determines# L% @) I, ]% ]' Y/ ?8 S
* the actually available RAM size between addresses `base' and
$ {9 H) C: p5 l2 r1 i$ U8 Y- i* `base + maxsize'.
5 d7 t  S) V% o*/* g/ c6 ^. y: r
long get_ram_size(long *base, long maxsize)
' l! n2 z. e# a8 h1 c7 i{- h- \; }, ]1 ^2 t  V
        volatile long *addr;  _1 J0 o# S6 S4 ^2 l
        long           save[32];
5 b" K$ v7 y! j5 @$ F8 d        long           cnt;
+ }: a& y6 [! Z2 n! |% w9 s        long           val;+ w& a7 B3 @8 V: f+ V' I/ x
        long           size;
0 y1 g6 T+ a0 [+ C, K" S' z        int            i = 0;- D1 F/ D" k' C1 [; H; M

9 l3 w7 n/ B) l  r% V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# R# k8 t; g- z. |) Y+ L+ C& K2 q
                addr = base + cnt;        /* pointer arith! */& m3 N) j7 w# h& w: k- k1 Q
                sync ();
! C: z5 @! n+ c9 W" g9 X$ s                save[i++] = *addr;; O9 p8 b  w3 S% ]6 N8 l- [) |
                sync ();
( V6 y6 J- N: T' v' C, V                *addr = ~cnt;3 _/ L3 V6 Q& P. C$ T$ o
        }3 Z6 D8 f9 C; h) J; f+ u

* a8 M- V" f5 U- _        addr = base;% v1 d  c9 O6 r+ _$ S5 s
        sync ();
4 {8 V5 b" A: \8 p& z; j        save = *addr;
! O/ Z1 @  q9 L4 _7 @' n  Q6 R        sync ();
' ~) @6 T, l$ m' m        *addr = 0;
' y: t6 B  r7 U: M' {0 g6 O& y4 h: x% p2 N) c
        sync ();" p# c2 r8 {4 c
        if ((val = *addr) != 0) {
8 \1 ?$ s6 ?/ k$ y. R; V% Z! j                /* Restore the original data before leaving the function.
* c; n/ v$ L; ?1 v3 O0 {                 */
  X6 {6 p$ N& [# |4 z; z/ @! |+ y                sync ();
) ]6 x! r7 Q$ N                *addr = save;; G/ g! c6 x) C- x7 ?
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 k* a, |: ~% g* C0 }% S4 }. x
                        addr  = base + cnt;
& H4 P. ~  c8 n' [3 B$ y) n' y; P7 [+ Q                        sync ();+ b' K& d% D8 u9 R' Q3 I+ n$ t8 f
                        *addr = save[--i];% Q1 c6 N8 w- u' q
                }
8 D+ {8 w. F+ Z                return (0);' }* c  Q, F9 G6 z
        }) H" X4 p1 J; d7 c8 h  Y! ~

6 n6 D* `1 [; V! x+ }* P7 s) q" E. V        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ R5 x% M7 |) h6 x  ^                addr = base + cnt;        /* pointer arith! */
- A. I# d7 \: [: ?6 p/ z                val = *addr;
: D0 r9 G0 R6 I                *addr = save[--i];
. Z6 v/ c& u6 L0 }& B) c- ~                if (val != ~cnt) {
6 v; i& e/ p$ a2 x! Q; y& I) W                        size = cnt * sizeof (long);
' R6 ], l# T* I8 j  t9 N                        /* Restore the original data before leaving the function.3 }6 h+ U% ?( u4 E6 m) p" f
                         */
2 ~* Q6 P; _) q0 K; g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 c2 I# c: n0 v
                                addr  = base + cnt;
; G6 b+ ?; N# m7 X/ [# a3 T                                *addr = save[--i];
* H* n9 V7 |# ~# c4 i                        }# y4 Q2 j9 a2 {" b+ W
                        return (size);6 v, g( N& `) n: {. M
                }0 B1 e. N8 V* @  T5 j" h' J& k+ J
        }3 Q) ]7 ^3 J- e9 A- O% k
+ [* Q6 j! J9 l9 J  g) H
        return (maxsize);, h, M8 S$ _) X8 I$ c
}
, W' i- Z; t& R6 t1 q9 ~$ c* @int dram_init(void)6 ?- G, W6 f  X
{
* l1 R5 ~0 ]8 k7 O0 z# t        /* dram_init must store complete ramsize in gd->ram_size */" j2 F4 ^5 U3 a5 j2 ~+ G$ l( ^
        gd->ram_size = get_ram_size(1 k$ h& o' W( ~. Y4 ~
                        (void *)CONFIG_SYS_SDRAM_BASE,: y* X9 ~6 z4 m9 Q, F8 l' S; n
                        CONFIG_MAX_RAM_BANK_SIZE);
! Y. H- M! j  W+ U- T        return 0;
& P2 _; B* a0 v* M! \  M}% B6 [0 x, I* y/ L  s' n

, O; [" ^6 K! k3 j5 l+ @4 M* `5 f% I) ~3 u
. S" m, G  z" @  b( i5 E8 J. X+ k$ U- {9 k9 ~% m9 H4 g5 C# Y8 G
  z" L" V, a! T7 C1 m3 Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. I* Y$ N9 y7 Z6 n) ^8 P" Y+ Z
! c$ U0 E0 |; [% B- ^% b! m! X7 j& h; j9 C

/ {9 W, Z% ?8 a




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