嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. Q6 D6 O+ q! F# W9 r: A( F核心板2:DDR2 256M Byte   NAND FLASH 8G bit. C3 Z) |% n; p+ p# V
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 V6 |7 n4 @3 L# S
, k& J* [. V( p7 Q2 t- Z0 ~1 A是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 {& s7 h3 ?* \- N( h
' P0 J6 a: G% C9 W* \

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 y$ e) E4 t  t/ P- X  ]( [. @
/*
. f1 _/ ^( v+ T/ S! ^* Check memory range for valid RAM. A simple memory test determines) E2 C' b' W2 q
* the actually available RAM size between addresses `base' and7 U7 H; }" m1 r$ |
* `base + maxsize'.
& B  l% l- J, Q; D  N2 f*/
% W+ G2 R( R  \+ ~$ Jlong get_ram_size(long *base, long maxsize); q! }! r! h( W4 ^. p5 {- Y
{
* Y' K& F& k7 z        volatile long *addr;% K+ C) S$ @+ p
        long           save[32];
2 y" l/ @8 d& x) g# r& M/ R        long           cnt;" t' D/ H* F9 H4 X' U" {
        long           val;' Q0 j: S% B; {5 X5 l5 i
        long           size;
  W4 w+ z% C, }) X8 [        int            i = 0;8 `  j4 T! ]. Y+ [% e

. ?! w. v  @" o3 ]0 D, z: n- P        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! e: _9 G4 n, O, g. M  {- F                addr = base + cnt;        /* pointer arith! */" W% I: }9 A! {) W0 P
                sync ();$ E* p) Y. M6 p/ ?3 b
                save[i++] = *addr;
$ {+ C$ T! x3 I8 l# {+ K1 S; U                sync ();
' V5 Z, v+ L* o& U0 X1 L, V                *addr = ~cnt;- U; E/ `& D6 F/ c1 `2 w2 ^; d
        }
* W5 O, v  P: v* o; `! @: y$ E3 E* U1 ~) V
        addr = base;
, I0 G1 O; u( }! b! n        sync ();
3 m8 [( E, o0 s( R. I        save = *addr;6 b" t) Q9 s8 a; F  m' P( V( ]1 V
        sync ();1 c8 L% h7 D0 x! j. u8 k
        *addr = 0;, f+ O. M, ?. F
* _& r, v9 D+ i9 L
        sync ();( @; P+ Q1 t8 r" @
        if ((val = *addr) != 0) {
5 F6 r; o9 I" T/ `                /* Restore the original data before leaving the function.$ T2 U! k1 E# N# y" ]# F. o
                 */
. G7 [) J! n8 Z: x' }6 d$ I1 D( d                sync ();' ~0 n8 @* P5 D. {& i) r$ l  n
                *addr = save;
% d+ ^/ H. {+ a7 v* A. R                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 U1 K' P8 Q& @" b- M- Y- n                        addr  = base + cnt;8 q7 A0 b+ m: A$ b( c$ _8 v
                        sync ();* U8 K  r% ]: ?; M# R
                        *addr = save[--i];, ^+ R+ W# H2 c# v
                }
8 U& `1 D$ R1 y7 s( U                return (0);
2 H! G" v7 Q1 K) {! ^        }
( b8 M+ q& F' T- S
5 S. z# u, W# _2 ]( a. G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# C4 c& ]- L+ {$ `) g7 V6 @
                addr = base + cnt;        /* pointer arith! */
' w7 i7 I  ^! ]# s1 t; C                val = *addr;
" f. J- d  E' v/ A1 Y& I                *addr = save[--i];: G: f. X$ m. j3 K1 R$ ^
                if (val != ~cnt) {
5 p! h4 K/ C3 U' }( r                        size = cnt * sizeof (long);
* V' Y. `% _' v( ^0 ?                        /* Restore the original data before leaving the function.
. c; ]" Z# t, V4 e4 k- Y5 @2 f. D                         */$ Z  y. g7 q) }7 i/ c) V" [: _, B7 E- u
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' w4 F7 a3 ~) m# m5 a                                addr  = base + cnt;
' z# r2 X6 W8 e% B9 F- Z                                *addr = save[--i];- \8 j6 p, u3 L0 ~; ^
                        }9 \# N0 B* G; O
                        return (size);( z. \/ ~' ?& \* t3 q
                }
+ j- {+ s. B; g" t: z- w        }% H: l; e& w, ^! Z
( ~0 c) C$ ^9 z' n  @, }8 V) t
        return (maxsize);
4 O9 j4 |& i; J  z9 O! ]8 b}( r1 E0 E9 I% m7 x& P$ j( \6 d& r
int dram_init(void)
9 \: a, P/ Z$ A  b% q{& ^6 d! K3 N: k* n: d& J0 ]
        /* dram_init must store complete ramsize in gd->ram_size */7 y  W9 S' B& C3 t
        gd->ram_size = get_ram_size(, F- i; M' c! Q  q: m
                        (void *)CONFIG_SYS_SDRAM_BASE,
, D% R) m8 {3 H4 w                        CONFIG_MAX_RAM_BANK_SIZE);' q' N0 H, s6 O/ M3 o4 Y
        return 0;
8 P+ u3 U* V/ v* m8 z}! c$ T) c( o* q# N- k

/ U3 d2 @+ |3 s# k: }8 t3 ^. U( D5 m0 y$ |7 U& A" A7 B7 N% o

9 _* P4 P" |! F- k' e7 Z+ M& S" {) Z) f% s/ C3 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, i" x* k7 @1 ^9 ~2 N

$ i0 T  V9 _( t) Z
  O: Q! x7 T6 {. M$ y. k

6 \3 C* l7 ?6 ~# ]& \+ J




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