嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: j3 `6 W) B9 S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ w0 N/ R& K/ k1 g4 O+ |* X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% E2 I# Z/ o) j

0 j8 e! z, _3 H  l, e4 f" V9 J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 x3 L7 ]# J, y8 G! r! b. {
8 l2 _# d* e* O+ T

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' s( r7 Z, Q# x$ \7 ?8 S/*$ J1 F) r4 O; \
* Check memory range for valid RAM. A simple memory test determines& K5 X! ~: n; w
* the actually available RAM size between addresses `base' and0 R# u5 d/ t  X% ~0 x% E5 w
* `base + maxsize'.+ H. p, n$ R1 S& n/ m  `6 O# y
*/: J6 F5 p! d' p
long get_ram_size(long *base, long maxsize)) v  ?; n) @) @$ ?6 r$ v% Q" J% v
{
: Y4 c% t. C  }3 S        volatile long *addr;  j: @: x! W+ D" C4 j
        long           save[32];
8 w" B6 B1 U% Y* a% H% D& Z4 U  O        long           cnt;
: U  }' E. P- q. X6 D7 m/ n        long           val;
2 U3 `0 X  g% c! j        long           size;
, t( r8 V9 `1 y; X$ \) T        int            i = 0;8 ]2 }4 _0 d6 C7 z, m
+ F" y8 I# g7 F4 c% F0 r
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# f# m% v# Y, C8 G4 A
                addr = base + cnt;        /* pointer arith! *// h1 E) s3 s! z, G" O$ v) s; N
                sync ();% d* S' R) q0 w. v7 Z( s4 k$ y8 u
                save[i++] = *addr;5 x# P9 ?( x6 B* j; X  m/ J% t) M
                sync ();! d- o; t. e  Y
                *addr = ~cnt;1 ^( |5 e, A( y" U; t
        }
( H6 o% ^- c( W5 i8 K
0 C/ K+ X4 ~8 h  s( e0 C/ v" H        addr = base;
* A& l8 |) `8 d2 q3 z        sync ();
5 B; Y) O5 H. `$ ?: A4 Z4 P        save = *addr;& L: R% C' M- o
        sync ();
7 z, o5 S$ j2 N' x: K4 x  `        *addr = 0;
! Z. e3 r( Y5 K4 d6 l" j4 ]  n4 ]) ^8 d: P: q" G
        sync ();4 f) ~7 D4 O+ x8 N1 ^
        if ((val = *addr) != 0) {
. j: c% @) D1 ~  V                /* Restore the original data before leaving the function.* U0 S/ i( K5 h* o
                 */
# d8 ?1 o4 C0 l$ r$ c; c3 L                sync ();7 l) v) a& }3 j/ x
                *addr = save;8 u+ \7 Z/ T4 X+ i) ^
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 ^3 f! a3 F" i' Y4 P1 J                        addr  = base + cnt;) W: r" g* |/ D" f% ]
                        sync ();3 m2 y7 S" {) x1 }. k
                        *addr = save[--i];$ R6 [  ~$ g" {, H9 h# `/ A
                }8 m' C. j, Q# {0 z' a9 L
                return (0);
& d% M: ]. n" ]; a7 [        }- t1 I8 F5 Y/ ?2 ]

" V3 E% r; c7 C9 p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, F6 E0 O8 P6 ^5 z9 x' ]
                addr = base + cnt;        /* pointer arith! */
! D# \& w6 a- q; L                val = *addr;
/ q# c% \& R) N1 Q                *addr = save[--i];, \4 D5 [: ]( l) V, }6 y: o
                if (val != ~cnt) {7 u6 R7 {0 r- E; Y
                        size = cnt * sizeof (long);: N6 J0 [# U0 n
                        /* Restore the original data before leaving the function.- u" [7 r4 e- A4 i+ n: [
                         */( q, H/ h$ ]0 y4 |+ `) p' D
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 T& W" h- B. D6 k  F                                addr  = base + cnt;6 f7 \: o1 \2 K. f
                                *addr = save[--i];
2 E) q& W# W) ?& M8 @5 R                        }: S! A: H; n9 q# y7 I" c9 Q( _1 V. M. |
                        return (size);
9 c7 X  H/ x7 i9 Q                }1 X/ t" G" Z/ W4 k$ @
        }; }% ?  L; h4 y

( ]* e4 h+ x" E9 o# O) ^$ x        return (maxsize);
% L5 q" t0 Y* U9 O# s}0 [4 g6 k2 _& }! x; ~
int dram_init(void)  T( \" L" Z% o
{
( p; I3 o" `0 _* r+ t$ \        /* dram_init must store complete ramsize in gd->ram_size */
0 l; S. S& ^: z+ V6 S        gd->ram_size = get_ram_size(
3 M6 _1 I( W' Q# I+ _" n1 w! V                        (void *)CONFIG_SYS_SDRAM_BASE,
) |0 {9 Y) @- P* ]                        CONFIG_MAX_RAM_BANK_SIZE);7 }* r% [: L4 C4 l$ W0 C; L' ]5 a
        return 0;4 E4 _: C$ u1 c
}
( F# q4 j3 Q' M
! z; m9 p7 x  d1 O8 f) L( s1 y% n$ P6 g" P8 ~

, C$ w) ]$ q- M4 Z0 R  @% F$ S/ B" x/ p" g$ S1 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 v2 o! q* @: F$ F% y/ B( ?
8 [8 Y" I1 y7 h& C
8 d) z# @- K5 i, |3 ]. t9 r0 ?

( J+ t: c9 X  v: _' N




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