嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 N3 w4 R5 W! e* G! k. Q$ f1 G
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  p  ?+ e& w0 b* Z' p) X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 I2 V5 A3 p6 \) l
- }; o, A& A, E1 l6 ?" G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. S) I) X1 @& ~/ e$ a

* ^9 q+ P2 V/ I$ d. U
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. T+ T6 b0 v% I" A2 ]  ^3 [
/*
4 L" t$ g& H1 M$ W; v+ N! {* Check memory range for valid RAM. A simple memory test determines: u% n; o/ B7 G& W' o. S
* the actually available RAM size between addresses `base' and
9 s* I  x, \6 i% l& B* `base + maxsize'.( s  e( r3 |# u, Y
*/; D7 k3 z' t, C
long get_ram_size(long *base, long maxsize)" N" X! r% k+ L4 w, o! t+ {
{3 {; _0 ?5 f* l* _; }
        volatile long *addr;& `1 N1 C+ \0 z8 w
        long           save[32];
) @9 J7 g4 I7 a5 I, D0 }        long           cnt;
% v3 T; }) V8 g/ U5 m        long           val;0 ^. g( ^2 Z% f, _0 p  R
        long           size;  T% e$ m* C. w8 r, X* r4 [# X
        int            i = 0;
9 h& w( h4 Z. i3 o/ Y3 x$ s8 Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 _2 U; i. T* X1 Q) Y
                addr = base + cnt;        /* pointer arith! */
8 M- y% r  h9 x4 D1 y. s( n2 u                sync ();7 E% c+ |) _" c0 f
                save[i++] = *addr;
' r/ T6 i, {- C$ N                sync ();
  |$ V" m6 u8 [9 A                *addr = ~cnt;
5 G( l! w8 P- `, `( O' b        }
# \4 G: Z' s# N( ]2 O: S9 Q+ w5 e. f" q  {
        addr = base;
% e- e+ [- H! M) H        sync ();
- r+ Y% H4 _; Q        save = *addr;4 E4 s  p- _/ d6 g0 p, S2 c3 u  q
        sync ();- ]7 j' i6 x" `! j* V
        *addr = 0;
/ H  S: H& R+ P& _0 U! g
9 {' W; S; e/ G5 Z( t+ |* a7 t# F7 J        sync ();
1 Q3 A# T/ ?2 G1 k6 _1 E% U% n1 p% K        if ((val = *addr) != 0) {
. K* h0 {! `9 h8 o                /* Restore the original data before leaving the function.
. {! Q6 h# X- \( _% M0 h: G' T3 i  }                 */
: H' Z7 A; R7 F9 a# B  k                sync ();% A) p/ V- m( P3 X- K7 C& d
                *addr = save;
: V9 A0 U- V  F) K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! u3 _* v+ Z6 r& `
                        addr  = base + cnt;3 O/ q+ F  Q% w: \8 w$ {$ \9 z3 T4 ]
                        sync ();
- O. G" E. F1 u% s( c                        *addr = save[--i];# m9 Z9 J" f5 k- t
                }
/ Z9 E* g( a  v! J                return (0);( E& ~& \0 i$ e5 G. G
        }3 ?% b" e, D/ B  R

! ?% B( v7 c2 o( r! _3 h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; a5 h* z" w" D5 H; H+ W* l
                addr = base + cnt;        /* pointer arith! */
0 g7 |( M# N1 D" f/ U2 u                val = *addr;% a$ H* v/ C. a
                *addr = save[--i];$ H) Y1 t9 ?( S& S4 v
                if (val != ~cnt) {
9 w. w; _( W% L# d1 m- v# ]3 P                        size = cnt * sizeof (long);3 J4 }) A! m9 h6 u
                        /* Restore the original data before leaving the function.% a4 g" t! ~0 L. p1 [
                         */4 }2 I9 ?0 J% }7 C2 s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 E1 r8 A' \# e( Z: ^                                addr  = base + cnt;
6 L  ~3 @9 Z. r" R7 h3 ~5 [                                *addr = save[--i];
+ Q( |7 @3 q4 K6 Q                        }1 K2 ^# F" C! p* [3 D
                        return (size);
+ L  o& n$ f; g5 ?# D: B                }
- s( N; Z% {) E! G9 o8 X4 h' g! y        }
  r1 s' N# M5 [$ p+ x/ D+ l! b% H3 f. J2 c' P- M
        return (maxsize);
, F3 h6 X$ Y0 s+ {3 ?: ?}
! ^' B% j. b6 |1 G- pint dram_init(void)
7 x) `/ i0 }- I3 d2 e( a! ^: W! S{1 c. c4 W8 s; ]# E
        /* dram_init must store complete ramsize in gd->ram_size */4 p+ I+ X; t- l8 b# A3 Q; c
        gd->ram_size = get_ram_size(
8 }' L7 p3 n" g% G, X; h! [                        (void *)CONFIG_SYS_SDRAM_BASE,
3 E! r3 ?5 G8 ^+ {                        CONFIG_MAX_RAM_BANK_SIZE);
) P) i( R9 U2 S        return 0;2 G- A4 x# M: P8 s3 }8 S
}8 w: i/ k0 i1 n' J) G$ G  v/ Z
& ?5 w2 W8 r0 y; \$ h: h
" `: z  f2 G% h. m( c% k8 x* Z- }- _
" ~" s' K2 V" b' g

3 Q: k/ Q" b  u/ C$ j0 X" [" ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; r' s3 Z: {; M6 B
& ?* h% f5 T$ {/ m; z
2 Y% G" t( w4 q

$ m0 k6 r- R! p2 T




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