嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 _" U8 K( U9 w/ X9 S1 o+ p核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 q- O% O$ j5 ~+ z; f# }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* L' ^& C4 H/ i2 {" M2 G4 _
$ n  L3 R3 K8 P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ h2 k- Q( A$ d4 T' Z5 n/ x
1 e( K( l9 R4 f, ]4 E4 L

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: B( E/ o1 o: Y# b/*' z3 P9 ?8 v" T7 [9 ^3 ?, E* |+ N
* Check memory range for valid RAM. A simple memory test determines( F0 @5 I, @$ }1 r7 i1 \# ]) i7 Y
* the actually available RAM size between addresses `base' and
5 u7 H: i$ L- Q7 B( O, r- e* `base + maxsize'.# i# m' |" B; P
*/
  g5 S" c6 C/ t2 |/ M" @0 Olong get_ram_size(long *base, long maxsize). o7 ]: v  V  @8 ^
{
- m5 p# n$ ^4 z1 O0 z8 B  j        volatile long *addr;3 b  }1 w% L! o. i" j, o' I
        long           save[32];6 E0 R( ^. J6 x
        long           cnt;
9 N* t0 |/ q2 g. L; _        long           val;% P" i/ _! z) R
        long           size;
/ [3 @( D" C3 m# p        int            i = 0;
1 k! W. B+ H6 W$ B, r- c: Y* {/ z  u% h) d! p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# V7 n, P- s8 F1 F6 |                addr = base + cnt;        /* pointer arith! */
+ ?, u) j9 }" t                sync ();
- l/ ?5 w1 Z& M0 ?9 R( E, }# i; R                save[i++] = *addr;
) v9 [& C2 s0 L                sync ();# ^/ U! k9 V# G9 m( \
                *addr = ~cnt;* H% g* J) `8 L7 G* P
        }: \. X8 l. r& ~1 q; i

+ \  c) n! M% l+ E/ t5 F        addr = base;
0 z; m( c4 q+ e0 `; h        sync ();/ l. y' r& x: Z; p: h
        save = *addr;
) W" v  w. b8 l9 S" _; k  ^        sync ();
) V" A! D; w: w        *addr = 0;& Q* q* p0 R) N& D

' w1 o4 X% g2 n  b6 d) i        sync ();
  \( K7 `0 A- t4 f, q. K        if ((val = *addr) != 0) {
$ k" n( B1 n: U) e+ h                /* Restore the original data before leaving the function.
& u, p! A( Q5 K! V5 ^5 e( j                 */
2 u5 ~: E! l) f( ]; r: K: `0 S* O                sync ();
& i& `- C" Y/ T% @" y7 S                *addr = save;
. U3 Q& U4 h; C8 N                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# e5 F; g1 [) b+ ^; C4 q0 C                        addr  = base + cnt;
- g" S" {- B; D7 `$ o- e' v6 Q                        sync ();2 w; \% n, @: e- y: S" K  W. }
                        *addr = save[--i];
6 Q- o' D$ j+ o3 x                }+ U% _' H2 F3 b2 L3 {; d0 v
                return (0);& b9 z# S3 `, [0 w
        }
3 h0 Z: H9 F3 A* z2 P5 p! z6 W8 `' N& P8 [4 ^6 M
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 E6 |  q. g) b0 z( ~) A6 \* S% {+ l
                addr = base + cnt;        /* pointer arith! */; V  }5 w' m8 ]1 Q$ z' S
                val = *addr;4 v+ E; g8 {) K
                *addr = save[--i];7 e0 S$ @7 H2 a) L& M
                if (val != ~cnt) {% w3 x1 L) {7 ^1 f  {0 @5 e
                        size = cnt * sizeof (long);1 L6 L8 i( J) z  k; U( L7 u
                        /* Restore the original data before leaving the function.
. s; h8 f! Y" N, C                         */
4 O9 i( U; l- Z6 p/ D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h( f7 |+ J- `# Q# ?                                addr  = base + cnt;& m5 Q' T2 {( @
                                *addr = save[--i];/ f0 F* W5 K3 X8 m0 x) f" E* @( U
                        }
  _3 z& _- K+ P$ x& }3 e9 ]                        return (size);# J9 m+ @& ^( t( u$ A1 v/ f+ m
                }) \, C/ j1 M5 D9 h* H
        }/ {3 e' y* ~2 u+ S/ j* b. S
2 b4 J+ }8 B1 y' E! U
        return (maxsize);
6 J! a$ e1 H8 Q}( a" B( a' `9 j1 H% g: i5 c' l
int dram_init(void)9 T- Q# Y2 Y( a; X  j: j2 X
{
7 z- r9 I& G: k  ], P& y- K( `& P        /* dram_init must store complete ramsize in gd->ram_size */. [6 I! s2 |8 z+ C5 o
        gd->ram_size = get_ram_size(
1 j/ l# R: c" o. ]- Y                        (void *)CONFIG_SYS_SDRAM_BASE,9 F# q& h* G$ M' A% I
                        CONFIG_MAX_RAM_BANK_SIZE);( p( s4 e& c, P% d+ ]$ ?
        return 0;
5 i  Y4 N/ t, f}9 Y- Q4 l9 ~) `, O3 U' V* b
) ~3 H& T8 J; ~; t- a5 R
9 O8 s# q' j4 Y/ {9 w

1 N! g. t( |  h0 y+ A
/ x$ Q6 z. j( {/ o; d  XFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; a$ a3 p, U& K6 Q9 \6 o
9 B4 @8 p$ G7 P* S& D/ ^9 a

: Q7 i3 Q+ A$ e/ \3 K& j

# [% Z% T3 f+ r0 T) Y+ ?




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