嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& E9 H; G0 v0 e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# R0 e+ A+ e; B6 e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 s+ B: H$ ?$ J7 D7 q  k
" \' V: \5 G8 P" @$ Y# Y1 x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( T' I  u7 _+ Q5 j$ a  Z
) W- }* i" j$ ?$ b+ w

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, E! f. e2 J  ?) [1 J! i1 B/*: P+ G1 I( ^. t- ^4 ^
* Check memory range for valid RAM. A simple memory test determines' v0 S: X/ O7 N& K% `
* the actually available RAM size between addresses `base' and
5 D; `* R) c& F7 B9 W* `base + maxsize'.
8 t+ m3 |! ^) `' v/ ]8 N3 r*/8 {* S% o: I9 o+ E* ?
long get_ram_size(long *base, long maxsize)4 v6 {$ H9 x6 G& n* ?0 \$ j
{5 b; O% D; ^" _) e" P* E
        volatile long *addr;+ h# P# l9 `& G; A5 x' @& [
        long           save[32];3 Q. w' N. @4 x# t
        long           cnt;
/ _- d% n  d1 q+ t7 g9 q5 h* g        long           val;" u7 q/ F  p' D" u1 C5 ]$ q
        long           size;
5 ?/ h$ V( ?: C, n7 t! I        int            i = 0;
, Q$ m% {5 O3 g2 ^7 H: G$ [( I$ {7 p- y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# N7 p" }' O, b. H9 [
                addr = base + cnt;        /* pointer arith! */) m7 z" _7 D& `0 p
                sync ();
8 m8 A0 r6 ]0 N                save[i++] = *addr;/ a0 B! e3 z; k, w* T
                sync ();. a* j: k# _, x3 H- q3 N
                *addr = ~cnt;
; x( d% |) M8 p( ]- o        }
/ s  b0 Y5 b! o0 z8 {! w
& Y7 C3 f$ [' K1 W  y* K$ y        addr = base;
( j1 H# F3 |8 C9 X& u) e( \7 m        sync ();/ J% r5 e( x( |  b6 p8 A
        save = *addr;4 Z1 ~( b2 c" ]' d1 M& t! b7 Q
        sync ();
0 V1 ^/ v  Q/ Y1 o2 j        *addr = 0;" E9 p6 F: [2 _
9 K2 C4 O4 P! Z  |5 S
        sync ();+ S& `# S6 M8 f/ X
        if ((val = *addr) != 0) {
" d: E- F, u5 q3 q, [3 M                /* Restore the original data before leaving the function.1 p6 l& S) p. Y+ q
                 */
# z/ q# \6 f4 Y: Y. |, E0 e# \                sync ();
. `9 ^! [0 z. ?9 V1 T                *addr = save;
9 ?# D; k- w5 g$ a$ E8 d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ T$ Y3 t3 P/ k1 ]                        addr  = base + cnt;
+ A5 t. m  t% h, W8 k                        sync ();0 a; E; {3 Y3 Y8 Z/ S
                        *addr = save[--i];
$ z9 u" l) C5 D/ u' [8 l                }
. m( M, X2 z% [  K  Z$ g                return (0);2 I' Z! C% m' Z7 p" {! x
        }: \  X5 ]0 y  v* i, f
) L$ F: t0 M/ i  O2 r
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* F9 Q0 [* i# B6 G7 N0 f# |  c                addr = base + cnt;        /* pointer arith! */9 L2 N2 o; }; l% i( Y; S
                val = *addr;7 }/ W) b) Q! q/ i' ]
                *addr = save[--i];1 v0 ]6 L0 x1 ?( {3 {7 ~5 ~/ S
                if (val != ~cnt) {
+ I* T$ Z+ X! Q( N                        size = cnt * sizeof (long);3 B5 Q. y' }4 W' d7 W7 c: n
                        /* Restore the original data before leaving the function.- a' v1 Q/ c1 q
                         */
( w/ b4 ^- x' v, N6 ?8 f$ P0 d                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  f: x; b# Q' ]$ E
                                addr  = base + cnt;
0 r" N) q* K( I, M$ X                                *addr = save[--i];+ ^3 _! b, [* g2 C+ U  j; u2 |
                        }
* Z* w! T' P/ |- F# h9 D                        return (size);
: {4 g' q/ U6 g                }; W% I  {$ s) @+ z3 F* G
        }* s6 `' _! U$ \. S1 r# h/ @3 k$ U

! Z4 c. _2 F$ P, l8 H$ `1 U        return (maxsize);, g" t" v# X1 k
}& t2 u5 K9 k' X) j: k
int dram_init(void)7 [3 Z6 L: o. T+ V
{
! K6 Y- `- F. _6 R8 R: B        /* dram_init must store complete ramsize in gd->ram_size *// W- d# Q9 c& v3 h8 D
        gd->ram_size = get_ram_size(% b5 B' ^) F. r5 k" N. X2 v. e
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 {0 K$ x  j4 K; |                        CONFIG_MAX_RAM_BANK_SIZE);; t/ E, P3 N. o
        return 0;5 r- M8 I* q! j) }+ i. b
}
, L5 K( y2 v8 W2 C
. `* R, G# ]" @$ e* o/ P/ @( C! _
' T9 m& i( O. |' L$ V; [  o' z2 n5 ]1 X
% r9 Q4 g  f3 F9 Q& T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! p* a9 u! I) }5 ?2 X8 E, J
; \% e# z. k2 K1 \( r) ^* r7 G

" r/ y. j* G& O

9 x$ t. B4 A# l! S0 h




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