嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 |4 _  S8 d# H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ J" Q  u" u  h. |/ Y5 H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 o5 c, e8 g. H$ i6 p; K
2 j/ O' R6 Q) z# L0 A是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 O9 R$ a' l) \, N6 {/ U
: D* F/ `8 a( ]/ A
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 k6 a# S" c4 J3 p4 Q  S7 C
/*/ z! n  a4 W( H/ g  |
* Check memory range for valid RAM. A simple memory test determines* e  H% _* A$ f% G! n" l+ r
* the actually available RAM size between addresses `base' and/ s( t0 G7 I7 N; D8 A, Y! P; l# p
* `base + maxsize'.
6 P9 ~# o, U' U$ P' U" ~' @*/% ^5 X% n1 X( x# X  R! `' j
long get_ram_size(long *base, long maxsize)
9 r7 `) I2 {0 P: o0 ^{: }3 S/ `4 ^" ~2 P
        volatile long *addr;5 K0 I: ~9 k+ s* \' U
        long           save[32];
0 {' P: i) I2 C        long           cnt;: q1 a# n; _( O9 G  i/ N
        long           val;( H+ `4 u$ f" g1 p$ O. x" K1 b6 J
        long           size;' z" `6 D$ J2 n+ _6 r2 M
        int            i = 0;
) C. H' N% T3 S% M5 I9 Z( n  m$ D3 r# b
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 y2 c% x3 @% ]: m) C6 y, d                addr = base + cnt;        /* pointer arith! */
3 Z, w) q7 G9 _0 a% l                sync ();
; e1 |$ u! m3 K& e3 ~6 r% q                save[i++] = *addr;
* o; m# _; f6 C" j2 v2 K  u1 Y                sync ();
5 E) U0 l& d8 r. f9 |                *addr = ~cnt;
; w9 J7 E8 m$ ?  K, p# U- U' ^        }
1 {4 p, K" r1 U
1 h3 N5 {, V( l( ~        addr = base;
' e9 [; \. O) Z% O( U: o        sync ();
& s, J% Q+ |& r4 q% h        save = *addr;1 u' C& n/ J+ c; t
        sync ();
: {' `3 `) B; \" u2 M5 h' ?0 }        *addr = 0;
& ?6 y( k. i' O6 `- V* \) o7 ]
) |# M6 X, Q1 O( A9 C, K! v        sync ();
& G& s! H. H/ J8 k+ n        if ((val = *addr) != 0) {3 \5 ^+ z! @8 C2 N) _5 ]$ u! Q* T
                /* Restore the original data before leaving the function.
5 j$ a9 u4 }- o, `5 ?* m8 Q  v                 *// X6 y+ ]! J* `" l) a- q
                sync ();
! z; @' t" T# b2 W                *addr = save;/ N) b2 H0 n; x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 ]1 ~& d4 D8 `% b6 M9 g* k
                        addr  = base + cnt;/ o9 c$ m" n, W- q5 F
                        sync ();
" [* W5 n9 J; a% r, d" L                        *addr = save[--i];
) k/ Y4 `7 P0 T4 K$ X& d                }
: W- ^! v  N% v8 M9 p                return (0);
- H! l# e, |$ N        }
6 ~1 t- {7 L3 ^
; y) i- r: t  C9 N; Q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ t" B5 M0 e0 `: d$ ~2 U                addr = base + cnt;        /* pointer arith! */
7 n# `% r; m1 P# N7 K                val = *addr;
' w9 S% E9 a+ L! q' Z9 v( ?                *addr = save[--i];
5 y) ]' K: b6 B/ G* v4 x                if (val != ~cnt) {
; D. Y. j4 H9 k# Q+ W% J6 O9 U& z7 y                        size = cnt * sizeof (long);
3 z7 D3 Q1 ?! U  Q                        /* Restore the original data before leaving the function.
( h' L( ~3 R( |, n( Q$ j1 n                         */9 L0 z' o0 F! x- I; |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ _, T5 k. C1 F4 c( O                                addr  = base + cnt;
8 G' M& G) O1 C: @8 e+ p                                *addr = save[--i];0 x( _0 P, q/ G& q* p- S0 ~
                        }' J, g4 f$ J, p2 K
                        return (size);
0 k3 B* m8 ?( m- A) l1 ~2 Y8 Z                }) Y4 `- p5 ]5 M2 S3 V; b- ~+ ?! r
        }& p1 B' \2 }2 k% M

0 H0 @6 @6 k  F* P! }        return (maxsize);3 ~! q: Q# Y9 I
}5 t2 u4 W" K- n& R
int dram_init(void)4 ^& `( w( p% ?" J1 {
{( j: U, y+ R6 ^- C$ \
        /* dram_init must store complete ramsize in gd->ram_size *// w0 Q4 Z& a; J' b: a0 r- t8 o
        gd->ram_size = get_ram_size(4 Q4 F' i% a, N2 _/ M4 ]4 b8 {7 j
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 ?: [7 O- B) |8 [7 h6 \% _) ^                        CONFIG_MAX_RAM_BANK_SIZE);( E; `7 }8 y. F  u
        return 0;
; F" ]- l! G: D( b}
6 q, ~: r2 H/ R7 a$ T3 f8 |% c& G' p  [0 i! v9 ~1 E0 |" w

, d- j  o) X6 K( I( O+ L/ r4 X  I) L/ r- M/ E* q  j
! g8 J( o5 E6 L% Z7 w2 H. n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- F: C2 a3 I1 Z2 l: Y

* G) q! y8 \0 R) P! q, E& a9 ]- r. \' ]4 T  c5 x

+ c- `. e1 f0 e




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