嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 o6 x2 O/ G5 l1 j5 R2 _6 C; Q9 {+ @
核心板2:DDR2 256M Byte   NAND FLASH 8G bit# X/ h. R4 u+ [; c/ j9 Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# f( i. R" x+ y# d. Z/ Y2 o5 T/ U9 {1 D& r  s
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 p4 F* U9 Z) g6 q0 T3 }. S: D% o3 A

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 i  W+ L( x6 Y- t! J% X9 ]; ]
/*( s# A+ U' d; |
* Check memory range for valid RAM. A simple memory test determines
* H- _+ d% f& u, S2 @* the actually available RAM size between addresses `base' and* U+ u3 q  m: I  z8 p
* `base + maxsize'., p) L- }% f# Z, x2 k+ P
*/7 c* k/ u# X- F* L/ J
long get_ram_size(long *base, long maxsize)& ~8 ~9 F7 j; o/ l+ a
{
; n# |1 R; M, s. z        volatile long *addr;
, l: H- h$ n0 E' d9 `! K; f$ x1 w        long           save[32];' G# q  \8 C/ D' R& X8 d
        long           cnt;
  w) a  K" b# o, N% n0 L6 }        long           val;' t4 e+ O  U( O6 K' n7 u: ?
        long           size;
, s% n4 a0 J1 `$ A6 B$ @        int            i = 0;
( ~: g4 ~" D% K, V# H; M* B- h1 U6 h1 `2 h
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 T) I, A" A# }$ @                addr = base + cnt;        /* pointer arith! */+ J! @; ?$ R& Y( [8 J6 V
                sync ();
/ I7 e( N9 N0 Y: `' W                save[i++] = *addr;
& T8 d# ~, @2 x- b3 j                sync ();
1 k1 o9 |6 |* f( L- ?: s                *addr = ~cnt;
5 n2 Q2 U) Y" Z9 b        }
  d" B/ [& [% D! @6 I) o8 Y2 F/ F  C
" q* q5 u4 p3 {" v* V( Y        addr = base;
8 ], ^" W+ b. E/ @' B( d9 [; g$ V        sync ();
8 B" S+ D. b* Y0 A, v        save = *addr;
2 h+ {+ ^" J* P# N        sync ();
* Y3 J9 ~/ @, }  B& N3 x6 @/ ^        *addr = 0;0 r; _# ~: \: M$ ?& T
+ U) Y; a( x5 u1 Y: ~: O+ ?. q
        sync ();
% y2 ^" Y. L" K9 w6 L        if ((val = *addr) != 0) {
9 G: X- X! E" h" L                /* Restore the original data before leaving the function.
. L9 k8 i) e. c  Y4 `                 */
* u; c, ~) Y9 y                sync ();
7 [) H2 [; \: u4 n- ^                *addr = save;
4 A8 Q# y* z( g( e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 Q/ B6 @/ w' h: W+ b( t
                        addr  = base + cnt;
8 k6 M" a' t) `  g2 q                        sync ();8 k0 x5 b1 K- @# ]  ^3 C& j- B
                        *addr = save[--i];
+ g( U% [# m' U4 \: s                }' d0 m. M( Z) G7 s9 s* Y
                return (0);3 G' ^: c# x: M/ `5 b" i5 k: c
        }
$ V; v* [7 W* l# z) T5 J% \! q. c
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. w) l0 {0 R  K: c- q# ?6 n
                addr = base + cnt;        /* pointer arith! */  }% U# E2 o6 q1 l5 N4 B4 b' ~
                val = *addr;
+ y* d6 J  X3 s7 u& F! t                *addr = save[--i];
, p/ R+ Q; @/ T, }" p% J2 k% ~/ S                if (val != ~cnt) {
1 i: w' x+ }0 Z2 n" D$ \- L, }                        size = cnt * sizeof (long);  e1 v+ K3 c6 p! a' ]2 R" C$ a
                        /* Restore the original data before leaving the function.- F) m' d0 O6 Q# ]; i( |& t
                         */* p( V4 @1 M% i( d! i" o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. n5 n- F4 Y; O: o% \
                                addr  = base + cnt;
3 c! z: [$ b6 S4 s5 z9 Q5 ]: y                                *addr = save[--i];
3 E( M6 f8 l+ [" I7 E# ~                        }
$ O; E2 ~4 Y( `! @) u0 R* U                        return (size);0 t. U! y5 |- Q: P" k! c- f% N( p# e
                }8 o, t: H2 }" H
        }/ W- q5 r  x, P2 x. z

0 f3 J" A: ~! m. L# ^: q4 r        return (maxsize);4 E/ _: i" O: P" I9 G* q( D
}. |0 w- D' y3 [. r; s, a0 I
int dram_init(void)
8 e7 D+ J3 }% T+ c; M{- k% i+ x1 a/ f4 H" z5 a% a
        /* dram_init must store complete ramsize in gd->ram_size */: r6 L# B+ T1 ^. X
        gd->ram_size = get_ram_size(# y  Q9 p, q5 @
                        (void *)CONFIG_SYS_SDRAM_BASE,# E1 y; ^1 M& y- G2 c* E) [
                        CONFIG_MAX_RAM_BANK_SIZE);
$ f5 K- D6 W3 i8 b) t& U        return 0;
  W6 S$ ~: f7 {) O}
( |7 r% y# o) [' q: A) E/ c* Y. ~
3 `( \- T- |" ^
! b9 H/ z2 e& i7 A8 f2 F% v9 i9 z# J- a+ [7 W
' y+ q2 R! \% \% V% O7 ~3 O6 F
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 E9 g5 \2 t( E$ a5 [: [! ^  f
9 O6 q1 g  T  \1 h0 O3 D4 c/ r8 U
9 S- G0 X3 Y1 c( G! v8 }: V+ }





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