嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) L  Q. _2 @  }核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ r# i; V1 K- s" ~这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ Z. k+ ?8 s( T9 o$ `) H5 t) [

/ S1 c2 y: I8 W4 M: C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; r! R. w9 ?; A* {3 R
) r( n$ \) u: [7 v2 n: `4 M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:/ i) B( P: O( J9 s
/*
) `5 O7 y9 k# s- t2 c8 F* Check memory range for valid RAM. A simple memory test determines8 m" M9 R4 t6 Q. q
* the actually available RAM size between addresses `base' and1 Z6 q/ d! ^+ N, S: i
* `base + maxsize'./ E, Y* _5 L: M3 c$ v: X9 E
*/5 R. }" K4 z7 W7 f, m4 n# H7 M
long get_ram_size(long *base, long maxsize)
% F9 a7 R; m! A* [- [{! x( ~& q5 }" B- C6 v" ]
        volatile long *addr;
* X8 m8 H/ _: S        long           save[32];
6 k& _4 Q8 E6 L* g# P- B        long           cnt;
6 U# x! R3 W- w0 `2 }( ~7 I$ Q        long           val;! N% s3 a8 P! Y& Y! r' }% ^
        long           size;6 n8 O( z. E* r
        int            i = 0;
1 X! s# h/ ~+ t- B. ^5 C' X5 D$ E3 e1 N+ ^4 G& s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: E" Q: R" O! T+ O# o# E2 O
                addr = base + cnt;        /* pointer arith! */- x$ g' U5 N# ~( [9 ]
                sync ();
) @3 q$ `) [% r2 ]& Y                save[i++] = *addr;. V; v2 b) `* |: X! w  Z
                sync ();) U! v  X+ J+ M: \) X! k6 ?
                *addr = ~cnt;. I! ~0 }1 v5 ?- U; H- U
        }
. c  z5 Y# B$ q7 C5 @; j& n. C" @
        addr = base;
( H0 V' x- \2 ^- {2 V" }0 z        sync ();
  a' H* t1 o' t9 g5 @$ Q& Z7 H        save = *addr;
0 q. V. n# f2 z/ `4 P# ]! e        sync ();3 d* K' u; z: J  ^
        *addr = 0;
  W! u+ P- z* y5 j* U
( t- z0 ?& H7 w3 D$ M        sync ();, A5 G' X4 d% k6 V4 p/ S* f5 `
        if ((val = *addr) != 0) {. [; U: m; }4 L% C( }
                /* Restore the original data before leaving the function.
. V  i7 V% o6 q# K                 */5 y' F. j0 q5 P# N/ O  [. p
                sync ();, a+ ?! @) i; z/ ?0 x, X6 G( \! b4 [
                *addr = save;+ u) L- U, R/ a5 y' A7 y! M' f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! o; H3 D3 l! k
                        addr  = base + cnt;+ y" r0 ?* h7 j' l4 p2 U
                        sync ();
6 R6 t2 w+ ]: I% Q8 Z                        *addr = save[--i];( Y* W7 h( c, C4 x2 {0 M
                }
6 Q* w" L0 B7 }9 E, m                return (0);
/ D/ X4 g% i+ {! G        }; s6 A! K8 G% S

" `, O1 ^, O2 W* g4 k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 g* c9 \5 }8 x2 d& h
                addr = base + cnt;        /* pointer arith! */' n- x$ S% m2 ^) e1 f
                val = *addr;" q( h# L/ g' m: a4 H! `
                *addr = save[--i];
( w& x" x# M, D& v3 b                if (val != ~cnt) {) d2 s: o% R- S& o
                        size = cnt * sizeof (long);
/ p/ o0 u( R: @" Z                        /* Restore the original data before leaving the function.
0 a- ]4 a8 ]5 G! |                         */  h0 Z5 D+ g- Z9 [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 Q1 W1 l- s' j                                addr  = base + cnt;8 R! Q" e: r# F$ B/ z8 C/ |) x
                                *addr = save[--i];3 H0 ]' ~1 D1 p+ a# v; N* |5 [
                        }; r6 [  m/ m) I) h
                        return (size);
: P, |/ v; D2 J) ~4 r                }
9 a- A( n; B# b% }& t2 ]        }
  X! Y, E, N" A7 [4 Q1 }0 t$ D' Y' }3 M' t3 a( w
        return (maxsize);
8 O/ o1 Y$ c4 e9 ]( ?' B8 W}
5 a; A! ^3 Q5 rint dram_init(void)
5 [4 {4 [1 m0 U9 O{
+ x4 q7 v% J. j" a        /* dram_init must store complete ramsize in gd->ram_size */
8 K5 r- T  q$ c% g8 T  z: n        gd->ram_size = get_ram_size(
# r: v! j2 N( ?5 R. `                        (void *)CONFIG_SYS_SDRAM_BASE,
; }4 s- C5 _$ c- ?" D$ W; F7 c  i3 [. }                        CONFIG_MAX_RAM_BANK_SIZE);
1 _! |0 p- t8 c! z) Z        return 0;9 q! Z  e' B' p8 {5 ]
}* k8 s+ c4 k) q! n. k6 i2 Q! k4 Q9 I

  _2 T* q9 Q" I& a2 t- j! e; g* Y9 z
$ R; Y6 S1 j. e

) R: \' Y6 x. q2 P$ SFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' n3 v) s- U% |+ F5 _
. O$ b+ D! ^7 e* d8 z* ^

  n& N7 f2 O% w7 u% d: R6 G# H

9 P& P$ x$ K. s; \; i0 a& n




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