嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 X* R5 e  t) v" E- F$ \2 L核心板2:DDR2 256M Byte   NAND FLASH 8G bit% W  q0 O6 W  O0 m# G  _3 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ H+ r7 D+ H$ z* ^% A3 w3 P3 I- t
+ B4 {: |+ p9 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 o4 K3 U8 d% P- u2 ~& ]8 n: S
3 K) Q/ j5 {  A5 w) y7 \0 C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 Q9 C6 t( `0 e( Q( K9 H, r- {/*3 P9 z. B9 ?7 R9 y- {8 h
* Check memory range for valid RAM. A simple memory test determines6 b  W1 Z% ^: `: o: M5 w
* the actually available RAM size between addresses `base' and$ O% c0 W4 @" n
* `base + maxsize'." T" J+ D! t7 w! J5 j
*/
2 c4 Q) F! G4 P; g7 Vlong get_ram_size(long *base, long maxsize)
6 |: e" w/ I/ K- @- f{6 H- |2 }* D+ @$ }! a. O
        volatile long *addr;4 r8 y1 g1 H. w
        long           save[32];
4 z7 i  X+ Z) N) s        long           cnt;% k5 X1 a8 ]( y+ c4 Z% L+ B0 Q
        long           val;( L2 F4 g) J4 p$ X5 \
        long           size;
5 p, B8 r+ N# G! X1 l1 n        int            i = 0;
7 j3 p6 z) W- k2 \% w
4 ^: Y  n. j9 z$ Q, e1 G: D% M4 ^0 |        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, G1 c3 L: U9 G, W                addr = base + cnt;        /* pointer arith! */2 v. k* f2 j) t( G& b( l* _
                sync ();
1 T( A- E) ~3 i# n9 j3 y+ O                save[i++] = *addr;) \' i0 [0 k$ L
                sync ();6 R$ ]$ i. v' j0 x6 m) I2 s
                *addr = ~cnt;
! t$ E$ E$ R2 B! I5 D  V        }* }1 H( R; E  D, P* u
6 m2 Q+ G* G3 o8 s
        addr = base;
+ X1 L1 @0 u4 G; C5 k        sync ();/ G: ~2 N5 _6 U; H5 C2 [. H$ y
        save = *addr;" I" f" K; j1 Z& _9 T
        sync ();+ H* m/ b2 A' u# A, a. g
        *addr = 0;6 ^1 Z2 O* ^# F0 \# b. r9 j

0 `1 X& N4 Y) e! X% M3 R        sync ();
4 y& U# i, {- I! P* ^/ N        if ((val = *addr) != 0) {
% k8 L; s/ }" u' i5 k5 [6 D5 O                /* Restore the original data before leaving the function.
( U5 D8 A, ~# N+ k' w* P8 q: p                 */
5 L* M: k& a) T7 c                sync ();& v: v5 N( S" V& @1 q( R7 o
                *addr = save;
8 H! w' k+ B$ B8 @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" W. H; y: y/ W7 I9 y. i4 p. v# Q
                        addr  = base + cnt;' }4 ^( w( U7 c  C; M1 Z/ E
                        sync ();# c/ W- r' J6 |- W
                        *addr = save[--i];
1 |% L7 N- T' {5 i. e9 A. K                }
) I3 r. B; q* x                return (0);
0 T% e% W0 H7 V- e$ s4 Y        }5 q5 M, R& A6 s/ n
' p" t6 d7 R# b: {6 b$ Z' i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; k+ M: ^4 b6 S9 D) [# X  V                addr = base + cnt;        /* pointer arith! */$ S0 \/ W# r  e/ t( L( m0 _
                val = *addr;7 z! Y7 L' z! j; T$ ?
                *addr = save[--i];
2 }% s2 Y! T6 K" J                if (val != ~cnt) {' @6 @/ M) o" Y# _2 m- _
                        size = cnt * sizeof (long);& N! A" F% `5 o" M/ T  h; z# G9 m  p
                        /* Restore the original data before leaving the function.# R* j' e* X- Q$ w* e9 `3 p; C
                         */8 U; l! o/ {3 S, P1 [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( I* b9 z7 s: p2 \" K
                                addr  = base + cnt;5 U. G! U7 K/ y1 t& B7 K
                                *addr = save[--i];" t% ?8 s; N3 E3 b, ~
                        }* a8 D6 T: G" W7 i( `( S. n6 ^( {
                        return (size);+ v0 K; }& G/ O+ N7 b
                }" z7 b% ]2 C9 y( H9 r
        }
' g2 w! i4 A1 A! i& l; O) F! z  N# S8 J2 P& d
        return (maxsize);7 B9 z9 ?0 M5 [1 V# }0 z
}
) \; F6 q, e  O$ gint dram_init(void), l3 J, Q& S% n
{9 c# _! p1 Q  x& k
        /* dram_init must store complete ramsize in gd->ram_size */, o+ m: s- V* z8 l5 `
        gd->ram_size = get_ram_size(
0 H8 S. \' v3 S; @" A4 v                        (void *)CONFIG_SYS_SDRAM_BASE,
  e# M+ I2 ?" Y' ~- o- W6 _* Y! z                        CONFIG_MAX_RAM_BANK_SIZE);$ R  f' X1 z0 X$ _: m
        return 0;
0 H9 C- S$ G2 v) k}4 |( ]# A5 b" V6 k) r
8 H( p% U  o" f
! O" g6 H7 u1 J4 n
% F) Y4 e& s+ D+ w
& u! F& _- c( C9 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 d& k4 R7 W1 f' q, P  W+ S3 r

. ]$ A1 m* b. b' t4 Q( w8 J: e4 y& T# M$ M

0 R+ N$ K8 M# q




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