嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 |# z0 Z1 Q4 S( P) r* W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 M8 e" o& _( W. K4 E5 M, m! c- w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 Q* f6 y/ n  t) d
  t0 v  T) M$ H& p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  A% c: w0 |, H6 M$ n* \
/ Q( z9 I: z& y+ o, Q6 ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 O/ {6 ]- I3 h2 W  p/*9 ?& q4 _8 c" s
* Check memory range for valid RAM. A simple memory test determines0 i' _! C/ q; a( ^2 V+ s7 h
* the actually available RAM size between addresses `base' and3 Q+ a7 T6 I; i0 u7 P6 W
* `base + maxsize'.8 k0 ]- h4 Q0 g8 `8 ]% ?
*/
0 a/ L$ v  J0 R) _4 x# q! ^long get_ram_size(long *base, long maxsize). G0 f+ L5 Q, b0 S3 h5 Z
{
# E' r, o  K0 m3 ^$ }; E# {        volatile long *addr;# E/ j! G) i, I5 d7 q7 U
        long           save[32];
! ]) p. {) p) O( h        long           cnt;. ~. n2 t6 A- N/ N& S+ F4 C0 b2 {
        long           val;9 ]( a2 g+ L1 {; {  D) L$ ~
        long           size;5 E# q  m# ?" p" k+ p
        int            i = 0;
7 k0 i, j. {5 H! Q+ |- _/ V
  }# B1 g/ H- }# S4 k% |, O; p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 U1 @3 d8 d4 J( Q& k8 e
                addr = base + cnt;        /* pointer arith! */0 V# x6 q0 [" a
                sync ();  r5 C4 q5 Y" A$ u& d9 {: n: w5 V! S
                save[i++] = *addr;
0 [/ i) s6 D" ~* }                sync ();
6 l$ e* w7 D; @" Y# A4 g( L1 h                *addr = ~cnt;
* ?6 U5 P3 ]  P5 Q; D& D) _* _        }. t, F* n5 j0 ~8 Y
: `# G* X: C! V0 T0 n$ j
        addr = base;) X/ _8 A' \" C! A9 g
        sync ();# x  r2 k# U% }/ Q" k
        save = *addr;+ L% e: z- C  K$ y; T
        sync ();  e. E) X- y9 }* I6 H5 K% R- h
        *addr = 0;
  k+ T& V) \% Z5 O( P& U& F5 U7 D3 }. M( F* Z
        sync ();! F9 V! q4 t! ~1 i
        if ((val = *addr) != 0) {* I/ ^& I, \3 F1 T
                /* Restore the original data before leaving the function.
! N* I, i! W- h4 v                 */; |0 y7 }" |( o" I# I$ o
                sync ();
! R5 X" J. @/ W$ c# W3 j                *addr = save;0 u! k* N* m4 z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 G# Y0 g7 r' x7 b0 Q& L' B7 m
                        addr  = base + cnt;0 L# M& _. K3 ]$ W
                        sync ();
* ?! K+ Z. u, n                        *addr = save[--i];9 J+ M& d* \. @+ T, C: M& D1 P+ y
                }
0 n0 d( c% o* Y* N                return (0);
/ }8 {  t& g( E6 A: _0 q        }. s; n9 h. T* W/ a
( ?& M% V) _2 g+ K
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 L, ]/ |+ t+ L( K; V                addr = base + cnt;        /* pointer arith! */* G( ^; E, t8 s& W! `% W. ]
                val = *addr;6 Q% ~/ {7 ~" r: V, l
                *addr = save[--i];: F7 j2 a! V3 b5 c: M
                if (val != ~cnt) {; o/ C8 y; W, X  C
                        size = cnt * sizeof (long);
* [8 I7 v, B- ~& w8 @                        /* Restore the original data before leaving the function.
7 N3 U3 y$ z% m9 r, S                         */
) X- V, B4 F9 p7 A8 N/ Q; J# Q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, L/ W' d; G3 R$ h$ a                                addr  = base + cnt;5 ^2 H% L3 ~: ?. V, B
                                *addr = save[--i];6 R0 K  R+ Q# Y2 @6 X& J2 x6 w/ a
                        }
7 i. w* H1 C+ o; f( Z7 t4 @4 b9 l                        return (size);9 r# E( p1 D0 {1 C) @) B
                }8 A% c2 P( @: y$ f. U* `
        }/ ~" ?( b" z8 p8 ?, S. c
7 Y  `& C8 C9 ]: v
        return (maxsize);
% ^( `8 x) J+ w( q/ H}
7 t* {% S$ f5 K" f$ x. mint dram_init(void)
8 J& ]; g8 _6 x- j5 u% p{
$ l. n* r8 _4 u) V- l        /* dram_init must store complete ramsize in gd->ram_size */2 ^1 g' o! V# o- V8 {
        gd->ram_size = get_ram_size(  Q1 Z- S, V# n9 I5 h
                        (void *)CONFIG_SYS_SDRAM_BASE,6 x  W6 a6 h2 F% W9 w5 [0 y
                        CONFIG_MAX_RAM_BANK_SIZE);
+ U% G4 f6 T0 H( u9 j        return 0;
" z4 o( z% i- p" E! ?6 p2 ?}
; B- c8 a* x/ V: i# N7 K! _. h# A! i" }2 p, R
$ O+ F$ `  \# j) \7 G' ]& M  p  s
5 g* H) K: ?2 V, x& ^

( Q7 h2 f( w; j$ @! @5 {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; v# g) o: H* ^* q- s, z
) y: u6 W: g$ a! r" \
1 B) ?2 p1 j; F" j8 m; Y, s

' l2 z) C6 p. s' F9 A' o2 r. R  C# M




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