嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; l! r/ A& p" P% F, D- v: t
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ D; A' R- Z; f1 M/ m* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ H' S9 h( ?7 r4 P8 @
" B  `+ j3 Z2 u% z: G( |* Q6 T是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; c0 K/ R% R1 ]+ X4 _+ R# k6 L4 J1 |5 ~8 `5 l! R7 _0 S0 o. D

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 [6 i( v' i( k! \# k/*/ b& S/ w! L" l8 z! t; n* a
* Check memory range for valid RAM. A simple memory test determines
. ~$ N; g4 _1 t! G( n; r* the actually available RAM size between addresses `base' and6 k2 O: K0 z6 @& r
* `base + maxsize'.
4 G3 E4 p9 x8 _: o*/
7 ?( s' U3 p1 U( G9 Z! B4 h6 Xlong get_ram_size(long *base, long maxsize), A8 M- x; E$ I1 w  v  C
{
' g1 ^* i' S5 i! h: l4 f        volatile long *addr;6 f' W8 N' h$ T  B& g0 F* f) B  Q
        long           save[32];
, G$ E% q6 T! R$ C& @+ u) l        long           cnt;
; H, J) X5 A6 T        long           val;$ S, m, h. F; t8 _& q5 K
        long           size;( c: e8 v% M6 s, x
        int            i = 0;) ?4 U5 d- s' k0 n

3 E" z* E6 L$ |+ @$ M# Z+ |        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. K2 k4 t9 [8 r* \+ c# s# o9 b                addr = base + cnt;        /* pointer arith! */$ d$ |& X& g. H2 X6 C
                sync ();- F0 A; u: o' V5 R
                save[i++] = *addr;! w" B, x; p( i# M  p3 v6 m: a, p9 T
                sync ();' f9 W: @- B' F7 t8 }6 z
                *addr = ~cnt;
7 F) y  G  V! ~; G+ o        }
/ W% j* V: k# g" L: q! N, n1 D8 U
        addr = base;4 P4 @0 U, g9 m) C. ^
        sync ();
3 x. z: x* i9 p# A( |        save = *addr;, ~' @: V' k& [4 S  V+ p# q. G7 \
        sync ();5 p! l# N" S6 R
        *addr = 0;  P8 @! N7 ?6 C! C! t7 }1 I
0 I; C* i. @) ~3 c2 [
        sync ();9 |# q1 ^# c& P- j& d/ T) ^$ e: \
        if ((val = *addr) != 0) {
5 [& ^4 E6 k) u6 P% `% X$ C- E                /* Restore the original data before leaving the function., E2 l. Y! w% h5 x& P# w6 B
                 */
( S- p2 }" P6 ~  @$ x* G                sync ();
3 H. `. [& h/ A, [$ @& A' z# z                *addr = save;+ B9 ]; P! }, N; r" D6 V1 ]1 M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 N, C* u; m4 Z, D- o6 v2 A
                        addr  = base + cnt;
, F4 ]6 r& }$ t; ^  t                        sync ();
" x0 B5 h& O6 ?+ n. K                        *addr = save[--i];$ s- G- s! G0 M0 _
                }! Z! e9 Z6 t, k3 Y4 _
                return (0);; d; q& p; E( l$ J3 F+ X# B7 I
        }, I5 C" j  X9 U. B) b% P
8 a  X! S9 S$ w* K
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 C, c0 H$ m; C% @% F
                addr = base + cnt;        /* pointer arith! */
8 a- ~. U9 J& [. n! }- I/ D                val = *addr;
+ F2 R0 J* w2 |: k& S( H/ b) k/ F                *addr = save[--i];
  f8 ^. \& V; c% P' V9 T                if (val != ~cnt) {
1 U/ D7 B! J# I2 r$ Z                        size = cnt * sizeof (long);9 K" B# c2 k! H% F/ q4 H3 `/ |  r
                        /* Restore the original data before leaving the function.
, b; R# w1 U1 h0 ?/ T                         */3 g. c) g  x6 O$ ~0 e. v0 h1 _  a
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 L* ^! ?# X2 u  ^2 Q( Q* U                                addr  = base + cnt;
* B+ m$ g$ G* a& o3 s  ?                                *addr = save[--i];: @* _& ?# W% H8 m
                        }
3 g8 ?* j2 T; ]/ I: o3 ~                        return (size);
! {! Z* h/ c! A( F                }/ |! K/ z) d8 \- S, s0 n6 F
        }' t3 @7 ^1 g2 }4 r9 D" Q3 F+ ?
- ~& S7 R* M6 n. A
        return (maxsize);' I0 J4 v) m) C& c& J
}7 y* h! D/ ?1 A: [; k8 _
int dram_init(void)
: n! H2 H/ }# Z/ {% C{
% G6 l1 ~& Z" l) @6 F        /* dram_init must store complete ramsize in gd->ram_size */) @, ?/ h, \+ E& m/ Y3 S& }
        gd->ram_size = get_ram_size(8 U4 ~  v7 N6 p+ N8 O
                        (void *)CONFIG_SYS_SDRAM_BASE,& ]% ~5 L) J% Y- G
                        CONFIG_MAX_RAM_BANK_SIZE);$ ~; [% H/ f$ d7 m3 e
        return 0;
8 d+ b+ F' N. E+ V! k+ `}8 e4 S% ^: H/ f% u6 b: P  ~

8 T8 l: l# A3 k# j
( q& w" m5 D; V
5 O! V5 ^: r0 W0 |5 _0 L% j$ b3 B' B+ P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% u/ O. s- m" y# ?. @& w7 t- {: M& n- z9 u: d, c; y
9 l* O! w6 r/ v

4 o/ Y: ]7 E7 @




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