嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 k) i5 [* S$ ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 k! s. P$ S% d) w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ T: i; X! {$ Z( n

% k  j$ J' B6 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 j- o+ q7 S* G1 h

) {/ v) h& G3 [1 n4 w
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 l" O; S, v, j$ g% ?) }; ?
/*
5 H. g, I1 m7 g/ Y+ D4 a* Check memory range for valid RAM. A simple memory test determines6 r" q' V3 @# E* P, i- _( `% A9 m
* the actually available RAM size between addresses `base' and
5 n+ x5 r/ ^( Z& z* `base + maxsize'.
& P! G: v0 C% c$ W( v*/$ W; ]7 \  ^9 F# D+ M# s" A
long get_ram_size(long *base, long maxsize)( I( h7 P5 }9 `- L/ g, R
{
3 r6 d) t4 K! q3 w- a1 Y* k        volatile long *addr;
  R" o& x: c0 l. u% G8 s        long           save[32];: k2 R& Z  B* J6 T$ z3 c) Q
        long           cnt;/ _9 g) J) C- j1 R5 ]: N! b0 D
        long           val;: g0 x/ M  w9 l6 f$ I
        long           size;
* x7 d+ F. W9 _9 K7 ?5 S        int            i = 0;
  r' D) P! L" \5 [$ i3 d7 j, P
% Q) i: o! X) v7 M8 A        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! K: q+ Y4 }9 I2 v1 v" c  `  J
                addr = base + cnt;        /* pointer arith! */
& r2 T2 l" w0 c9 }3 K% Q- `                sync ();
" T3 K+ y. @7 d# W, t, h- P$ V2 M                save[i++] = *addr;" E4 s" d$ Y; |; @: x: A4 c- n
                sync ();
) w$ w+ W# Y8 T% b: R% U                *addr = ~cnt;
( o7 z# o* A) u4 @8 ]7 f4 K, G1 ?$ N        }
. e( z/ e5 r9 @, A
8 C7 i! Z0 c; i7 R        addr = base;
; K( ]2 Q) x3 |8 y& I        sync ();
  ^. e* P9 S9 I* ~        save = *addr;, ~/ i% u1 a4 ~" l0 Q7 l0 ]
        sync ();
3 F, j, L3 g- C3 F/ h        *addr = 0;
  H! }+ j' V% C& V: R- _  M9 R# J
/ T! v* t$ E* W7 D+ A1 x        sync ();! B0 J/ d8 V2 t* Z8 T8 _# t
        if ((val = *addr) != 0) {
; t% Z' N0 v4 b8 I+ C# I+ U/ X                /* Restore the original data before leaving the function.! ?) Z, n; W7 d$ \
                 */' U, R/ z8 o' q+ w7 ~) D8 _$ P
                sync ();
, M6 O$ o' K( O5 O3 G% M0 c' F7 S6 E                *addr = save;
* `3 j7 s7 f1 w$ f- t; K                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# P& `' \; ]% X" l4 l
                        addr  = base + cnt;4 C; X: d) k6 m3 s, Z$ \
                        sync ();
# v7 d. u$ M) I# J/ A4 i( l                        *addr = save[--i];8 @* P% z5 F+ J# @! [6 d! L/ d* ?
                }/ n8 R( v- c4 m- S3 M
                return (0);2 R3 m, ]8 i" W% {
        }( v: ~8 k/ {1 V2 ~, q! m

* Y* [4 a) u1 c1 H" W) n; L% g; J* n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 k) @% ]" c  @! k
                addr = base + cnt;        /* pointer arith! */
5 n8 X* b9 v3 ~6 J' e; n                val = *addr;0 m2 P0 G9 o1 ~# q& F: C/ |+ i) t6 F
                *addr = save[--i];
6 P9 u0 k& I0 M+ B                if (val != ~cnt) {5 F4 D0 V. ~8 b* u+ F7 h
                        size = cnt * sizeof (long);8 A$ w* X  s. `6 E6 n2 a
                        /* Restore the original data before leaving the function." ~0 _) {( @5 y. V2 p: K
                         */
2 X' Y  s( `2 y* Q3 p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# }6 r, f- v& P  G0 C7 k$ |6 Y# I                                addr  = base + cnt;
7 {% h- \* c- s' D- I+ Z1 L, `                                *addr = save[--i];
0 J: q' y: n" U6 O                        }
% I7 g$ K; A6 w                        return (size);/ ~. |9 |+ a6 A! X" g$ v. A
                }: d: M) \4 \2 k/ h
        }
9 W  i7 E* X* D7 i+ L. k, T, n7 L1 a( b
        return (maxsize);
, \8 O: Q# e% x) g* S3 O( j6 m* F}
4 U) l; G8 o* V/ T- Aint dram_init(void)0 \9 u3 [* C9 a% l& }3 a3 e1 K
{5 {; S/ k) B& R/ J" @. s. M
        /* dram_init must store complete ramsize in gd->ram_size */
3 G# _; F* @& {1 p        gd->ram_size = get_ram_size(
" c8 O* j) ?4 E2 t8 q; F$ s                        (void *)CONFIG_SYS_SDRAM_BASE,: X8 u- P, n" V1 y5 B1 v1 v  h" X7 h
                        CONFIG_MAX_RAM_BANK_SIZE);& \; e& A0 o0 E
        return 0;1 T8 b* z6 g$ Q8 H4 a
}  e( b+ q7 a1 `6 u& y

* C9 K3 P7 F: X3 z2 d: a4 ^) V, B

! V7 Z8 M4 v; d& `& [; v$ |( y
. t6 {/ [5 Q4 W+ g; PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 K& [2 s' L- T8 S! |: J  k* N. _" J4 I+ X
: p+ O) e8 f! w; o- O. ?! l2 V
' k% e0 Z9 ^2 ?. N  b( U! D





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