嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" ?" Y6 x  U! E7 O4 ?核心板2:DDR2 256M Byte   NAND FLASH 8G bit
! A; |9 t* P+ {, U- c1 A( Y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. e' e* h+ Y  M1 a+ h
9 B* U. v2 q; e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 K7 F# c: y/ {% A
8 ~7 F- I' c% `5 @1 P: \9 b
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 {0 W" ]% j! e4 v
/*& D& ^, }6 i1 G5 ]* q' b' S* }
* Check memory range for valid RAM. A simple memory test determines; s+ r( C6 [! B8 C$ }7 S
* the actually available RAM size between addresses `base' and2 b- E( H* o; Q0 @
* `base + maxsize'.; \- F: E. I! m- ]& u
*/+ e- Z9 P7 ^4 w
long get_ram_size(long *base, long maxsize)0 C7 m, ]  b, W" z2 u
{
5 J' ]& M. @0 ?: x2 o' r6 ]        volatile long *addr;/ K8 S6 z/ ]6 k+ E
        long           save[32];
8 ?( y! W/ ]8 b        long           cnt;
5 S0 b8 R' [  l9 X4 K+ Y9 J        long           val;
3 q- S" ^0 |9 B# w        long           size;' K5 U) l  \& W* {
        int            i = 0;7 T6 E3 k( E" B: N2 n: @* D9 }* M+ e
. M, o/ c9 S% }1 A
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& U* O. S% \& U7 m. P9 s8 B& L) z
                addr = base + cnt;        /* pointer arith! */; b- P- j/ u+ m2 U% B% i3 Y
                sync ();( k* ^0 m7 A  M  {
                save[i++] = *addr;0 B" o0 F! U* x4 Q( N  H
                sync ();
2 l. g8 B8 ^8 I% ~9 X                *addr = ~cnt;
1 m' J, P+ a4 g7 M        }
2 D! K. e, K+ x2 J% \: X- A+ ~* l
        addr = base;
: P' n4 D0 k/ J3 }1 m: Z        sync ();5 W- u$ g+ l) [* }- S" n
        save = *addr;$ x4 e; b( v1 y4 C$ s$ s9 P
        sync ();
8 i' [0 d7 j2 x; J% i7 N, U# N" P, ]* F        *addr = 0;
; q' t5 P% x' ?7 J8 r( w  ^
6 v8 F4 q. |$ d+ Z/ ?        sync ();
" N: r( R' J( y" M  y        if ((val = *addr) != 0) {; ^2 v, p3 S& ~: Q9 q$ ]
                /* Restore the original data before leaving the function.# U# E( ?5 x2 q2 E% w  _1 y
                 */, ^" t6 m7 L7 s7 I% ^
                sync ();
& ]7 _' U; @( w9 W                *addr = save;1 l5 W# |; P3 s1 O3 G' h6 ~' O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 N/ l  h) W3 p' t! q
                        addr  = base + cnt;
& K- G  w1 O( g: |' N                        sync ();) a. G# L: h) T0 N$ u
                        *addr = save[--i];
: f7 b9 C: h- e' v' r                }0 v% `" h$ }' [3 {1 S3 z
                return (0);, w* n  d& y. p. ?3 U  }
        }6 F+ _% X* X/ `4 _5 \0 N
: f. L# e- T4 [& P( M
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! _  ~( o$ _! W% u& C
                addr = base + cnt;        /* pointer arith! */
: Z+ s0 x5 G) C$ W7 v3 m+ z* A                val = *addr;
' K& q4 u' N) a                *addr = save[--i];2 Z& C& }' d! a" d, V) c0 ^; k/ X9 z
                if (val != ~cnt) {8 i& L1 G9 M0 l- ~9 E
                        size = cnt * sizeof (long);; K4 S! G, y- e! E8 Y! I7 J' U
                        /* Restore the original data before leaving the function.6 k2 |& j: Q0 V9 @& I" x7 D* X3 @
                         */2 O, [, V4 q4 o2 g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 C9 m$ d; p, P5 S8 s' |" ]                                addr  = base + cnt;6 C2 V4 Q$ D) a" v8 [
                                *addr = save[--i];
: Y4 y5 `. j3 R1 K" ?2 v7 O0 ^                        }8 q) G* E8 Y; M: ^
                        return (size);9 T/ ~4 P# f$ k( q2 G/ Q
                }
8 U; r8 U& ~+ t* _' W        }
% A: v4 Q3 H. Z8 K2 n: `7 a9 m" v) B9 V* @1 n3 G+ W( m: T
        return (maxsize);
8 W0 N9 ~& N5 A! w2 L}3 s9 H$ ^! m8 c+ I, W# e& w
int dram_init(void)4 @/ r- s5 W1 ?5 J( [: Z& k
{
$ w; o# N8 h$ w, n        /* dram_init must store complete ramsize in gd->ram_size */4 Y- G$ K8 p5 S0 N) G
        gd->ram_size = get_ram_size(
8 y  T9 l1 X1 |% B( G& r& `0 P                        (void *)CONFIG_SYS_SDRAM_BASE,7 t* x$ x& ]* ^
                        CONFIG_MAX_RAM_BANK_SIZE);9 \+ S0 `  r+ T0 u$ m3 M# K$ l( k1 c" M
        return 0;& b' r2 T. e. H
}6 E. ?) K& O2 c6 |3 S0 |

  Q% o6 Y* l3 \! y( a) ^/ w, o) ^' L6 m2 ?

: F0 `) y$ V1 |
5 K% S+ {$ d( F- C, aFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 d: o( ?9 m9 a( ^3 o' [
% u8 P4 w+ s" w& ^' _& C6 ^* I8 a, |$ i: R  p
4 O% }' a& j4 E





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