嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) k# [; ^7 N# g2 b# ]核心板2:DDR2 256M Byte   NAND FLASH 8G bit' E+ x! ^. h8 Y9 X4 @5 D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* n3 N. V7 T$ y% z7 L* Q
2 ~% z7 r8 y6 Q% |. H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- _2 g& g3 H6 q8 V, `
  \7 g. W# f4 s. F7 ]4 Q0 @3 [

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& k: d; g" j1 V' i/*
+ x" C9 B* Z0 r. A% l/ _: W% v& r* Check memory range for valid RAM. A simple memory test determines; I. E4 H1 y. R" x5 e
* the actually available RAM size between addresses `base' and4 s9 i6 s6 i8 e, o- ~: g5 [4 V4 m
* `base + maxsize'.
9 a$ P: a7 ~% Q, [8 o( F9 t*/9 s/ u3 z+ E( P
long get_ram_size(long *base, long maxsize)# [: ]$ [) o. M
{
' @% q) w3 p; `2 f        volatile long *addr;
3 L6 M0 D/ ^" E% c        long           save[32];) _# N) V3 k8 `# g3 ]
        long           cnt;
& w1 }2 c+ t! \% M9 L2 T7 j" `        long           val;) _3 ]% D: ?: f0 b5 r
        long           size;
1 W) ?: O" l( l        int            i = 0;
# I" t/ [2 F0 j+ S* a# t
1 \4 M5 z; F' {' r+ ]2 d        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 z: w) [, I4 x$ b; J                addr = base + cnt;        /* pointer arith! */7 `8 y* r* {+ _) o
                sync ();3 B2 C  c- r/ C( [" Z( l4 g& v: k
                save[i++] = *addr;; `8 o5 L  a5 f$ n6 M. s# ~" Z
                sync ();
+ i1 b/ I. a; S, {9 z                *addr = ~cnt;
/ M! t8 L9 o. J9 z4 B; \: G        }4 B. t$ G: P; ?

, T; R9 p& s. y. \( m        addr = base;
" |$ i3 U9 h0 |        sync ();
1 q2 N# a( E) g/ s) D% O8 g        save = *addr;. r6 f3 {; j9 l& m
        sync ();
& q6 ^2 Y1 b$ w3 i* J; M/ F        *addr = 0;
1 Y, B/ D1 I! M. S7 u* e7 R
" F" L2 q  P5 s3 D        sync ();
# o* M9 g) ?6 \( A% Q2 T        if ((val = *addr) != 0) {, h6 I/ f9 ^5 P1 a5 y" Y
                /* Restore the original data before leaving the function.
3 C' p, E" F( e- q( N                 */
! o7 ]8 T) X4 A5 c1 m2 V, V! ?                sync ();
4 t5 K/ x' J2 V/ x5 P                *addr = save;
9 I- ?  ~9 @  I0 U' r+ @4 c# ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* G5 [+ q. v) y9 p6 V- W                        addr  = base + cnt;' v4 C, Z8 N  i1 G$ Q$ J  E& b5 @
                        sync ();
! m# E3 ~; ^: t( Y1 A                        *addr = save[--i];
. E3 i. |$ L/ m- x$ A1 m                }
% y* C8 E% B& L  k                return (0);
; q+ P. J0 H0 L" n$ V* I( |5 ~        }/ h- ^) Y, c4 s1 m* a
1 l9 l- O' i  P3 f9 z" R+ L$ \
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) n; Z7 o* J* W; H" L5 ]                addr = base + cnt;        /* pointer arith! */9 C' L4 p+ j; H( C3 Y
                val = *addr;( L" n2 W$ D# }/ P% [
                *addr = save[--i];
6 Q* S; \+ w" V- F6 ~                if (val != ~cnt) {  Y! K) P! a+ f' k
                        size = cnt * sizeof (long);) N2 ?0 v; O1 m+ T7 Y
                        /* Restore the original data before leaving the function.9 W: c  V  Q/ `8 f% G/ ~! @/ o. ^
                         */# q5 b5 N( b# h! [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  u; r0 M- H/ c3 ~( ]4 `
                                addr  = base + cnt;+ D  }) ~% y  h6 t
                                *addr = save[--i];
" v- s6 r( h: P( g                        }: Q+ a; W6 L  F: R) H; {  Q
                        return (size);5 p4 T5 i: Y' t* o
                }: l1 i8 X3 ~6 L
        }* F1 F: I) r6 S- }/ m

/ {" x7 [4 p7 ]4 N4 |4 J        return (maxsize);1 `8 M* b  K' v) ~! {
}
& Z" S. L: m+ o- s$ X3 t8 Iint dram_init(void)* j0 i( N, k- ^- d
{! V+ a3 p! s0 _% B
        /* dram_init must store complete ramsize in gd->ram_size */) k: n& g1 n+ R1 R! u9 M
        gd->ram_size = get_ram_size(
6 V' `! p) X3 y( l0 r1 K' L                        (void *)CONFIG_SYS_SDRAM_BASE,) P' m* g) t% p1 O9 f3 d& j
                        CONFIG_MAX_RAM_BANK_SIZE);+ E' {3 ~' y( a
        return 0;5 N! I$ P6 R& C# f  x8 L
}- c* p9 t; d- a

$ f6 Q: p" E9 ?0 X
$ `* O2 A$ R: e9 e* h) P: z1 T9 |, @" u7 e

* r# H, E: z1 h5 ]" d# o; Z, T! QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ P4 q& ]  L8 S, _3 [( o" b0 f. q: e6 P; b0 U# m' [

3 p7 \; g) k# v! t8 ~
7 {/ d! X/ q+ @4 `) N2 t5 {





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