嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. ]  `& q9 Z* Q& A# |核心板2:DDR2 256M Byte   NAND FLASH 8G bit; Z: {9 J! V. w& Q! C
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" [9 |  B8 \1 U3 O: D( Y* Z. ?, @" ^, p2 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. u: {) a' U2 e2 o) t
8 j. i$ D0 }* Q% \
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ F: Q3 {5 [6 s; U. T3 s/*
. b% H2 [) s) ]+ |8 q* Check memory range for valid RAM. A simple memory test determines& D1 G. T+ N5 [. f
* the actually available RAM size between addresses `base' and) a) R$ u4 x& R- h
* `base + maxsize'.
2 x, f+ g6 v% }6 o% c( B*/- y2 ?7 |( o* t9 d  }+ A: z
long get_ram_size(long *base, long maxsize)+ S4 }5 p* i3 C# f) B6 k, {! |
{
% `/ H5 x3 x% u" y( C        volatile long *addr;0 f6 o; C3 m# C" C
        long           save[32];3 W8 C, S0 ^' T* W( k. m4 y
        long           cnt;" q- N8 p" Z, |* f
        long           val;4 ~0 H0 U9 k4 P' r7 T" `8 Q2 A
        long           size;8 F; R2 d- y- E9 x/ q0 R
        int            i = 0;$ o, _. W1 S5 ]# B
( W( S' C* T: a4 r& w' L
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 q7 t; l4 M/ \                addr = base + cnt;        /* pointer arith! */. ^; `1 A3 T# C7 Q2 B2 W
                sync ();& Q+ m# }* C  m9 }0 v! b7 @
                save[i++] = *addr;' u. u& e- d8 b
                sync ();
6 M: ?) u/ C  Z1 W. [; |                *addr = ~cnt;
' u0 o" l" x9 ?- x- u/ Z- N        }  Q) g' j  h$ `, O
# O/ r. \  }& L0 \" t
        addr = base;# A& I6 }) [  v9 C& A6 _
        sync ();" n8 C# t3 m3 Q; K8 w& C
        save = *addr;
5 Y2 U& v( p2 L9 D+ U  B0 R        sync ();
) B2 _! E5 j! g% b  F3 l2 B1 R        *addr = 0;% m/ z7 I( R# z- S; O: [

; _2 t/ x% s3 V1 s1 F        sync ();6 }6 r) e( D" |) c
        if ((val = *addr) != 0) {# H) i  O  c# B0 N4 ?" ~
                /* Restore the original data before leaving the function.
* Z) ~" q* @: a$ P& g9 r3 y                 */
1 m) n% ~3 J0 O3 ^' }8 Z# ]- M                sync ();. C; Q- H1 \0 h) p- c
                *addr = save;
- w) o5 C' {6 b/ P# _; E; n: g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 a9 t8 q  G1 p8 E0 H; n# g                        addr  = base + cnt;
; J& `" }2 `9 g5 J4 J                        sync ();
* s% ~1 x+ u2 A; x4 F9 G; W# W                        *addr = save[--i];
# ]) v( D& C$ O% g( A# e                }
4 k3 K2 r: `* }1 ]( v- h& v                return (0);
# H' C$ n2 e; @( h, t        }5 G, F8 g6 s+ X/ v
5 x( j( N3 M, b8 p+ t
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: b4 P* V) }- o; x% Z1 a
                addr = base + cnt;        /* pointer arith! */
1 x3 n0 A9 w2 ]0 t. _                val = *addr;
% r9 c( t  M/ ?  b                *addr = save[--i];0 ~9 \4 N& ~$ ?; i, k
                if (val != ~cnt) {
4 R: C9 K8 s/ M, a8 r                        size = cnt * sizeof (long);. Y1 [8 T+ \3 X5 b3 E' E4 H
                        /* Restore the original data before leaving the function.
1 K( y3 T4 V. }                         */3 H5 `" R) j  O  k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f% B% M8 o: Q                                addr  = base + cnt;
9 \9 V7 _/ m# V. e                                *addr = save[--i];
8 b( R4 x: B% c0 _' E6 h                        }
1 c& |, K$ a1 m! g7 D; K8 l                        return (size);! A+ s2 o$ w# E
                }9 N* }$ y8 i/ p
        }! W2 z  s0 e3 B, }( i

0 F" `) U6 u! u4 O# U5 G        return (maxsize);' d8 D$ H7 W; c' b0 [) e: G+ w
}/ J/ c3 s$ I7 U0 n
int dram_init(void)" j& f, d; N( i: \- U& M8 F4 j
{
' O6 Z# ~0 m0 }! `+ z% z        /* dram_init must store complete ramsize in gd->ram_size */+ s. m( H- J, b2 B* n
        gd->ram_size = get_ram_size(# E" C0 W) i1 Q. V% H- ~
                        (void *)CONFIG_SYS_SDRAM_BASE,% H) s; N( b6 X; f1 m3 S
                        CONFIG_MAX_RAM_BANK_SIZE);7 v0 I; m  R! E1 }; y1 ^/ p
        return 0;, ]9 a3 [& E& O  T* _3 k* L3 o4 k
}
: P) F% ?) ]' N- I; ~8 }. F  |* G6 K, r! [6 X# x$ C( @

/ N3 \2 l/ h6 x7 M+ \* O# y; M8 i5 z8 t6 b0 O- w$ J  L/ b8 k

% a: x' J% ^/ t' `# w" d/ _) l2 YFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ G& l  y  S/ y- X

5 y( _+ D8 [! z& L2 Q6 Y( g. W$ N6 k2 R' ?
' \/ d! D2 P2 }$ C





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