嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- }0 R! m4 E8 `7 N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 F8 @$ F: S' a0 r1 q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 {- I5 }! I! l! m& J+ C1 V; b" j7 Q* g7 M# M: ^+ ^6 N  F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, J) w' U( c1 n3 J( y- U
- g) T) V% V& c1 D. p

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 ]+ m% K4 M# k* M
/*8 \" f7 A0 z1 Z8 {+ s4 m
* Check memory range for valid RAM. A simple memory test determines
+ r( I0 p0 b% @& @5 c! ?; |* the actually available RAM size between addresses `base' and4 v: k$ P# ^! O* \8 b1 g) l
* `base + maxsize'.5 Q5 O' Y3 R' T1 ^6 a
*/
# @* D2 p" t% N# W& X$ J$ Dlong get_ram_size(long *base, long maxsize)0 d1 ], r. z( V) ^+ {' l
{
3 R4 ]/ \; E2 H6 B7 \% p6 J$ @" B/ a        volatile long *addr;
. Z6 G( _$ G0 c- s+ |$ q        long           save[32];
3 O8 s7 Z, c# w3 w( K# a        long           cnt;
" d7 B# H8 j  P; s8 F        long           val;
8 E; l5 C2 u! q, L3 u! |' `" D        long           size;0 `* ~+ ?; \! ^, m7 X6 U: P
        int            i = 0;8 d+ x$ m) |7 `  o0 G0 L8 p
" P; ^1 z. Q4 |2 c3 X
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 Z! q2 j1 \0 C* H! ~" X
                addr = base + cnt;        /* pointer arith! */  A6 Y9 R+ G: s3 q& K% g5 o+ \2 e
                sync ();# b+ R% N3 \7 y
                save[i++] = *addr;( X/ a; B0 v) F' |. G1 A/ T$ }
                sync ();* B/ }% ~% t% g6 X# P
                *addr = ~cnt;
# e1 b% h8 t* N, Y3 [0 `        }: f9 z( b) S5 S) A" ]
6 t; Z) n4 k5 w! {. r
        addr = base;
! P' D: e. H% a) z        sync ();
) {+ D" _' R! v+ m        save = *addr;
0 E) Z, S2 j9 k; E        sync ();1 n& r- A1 H% a! |: a; f
        *addr = 0;& ]. u; r' ~2 ?; t
- N5 A' A0 f3 ?- z
        sync ();- G. D( g0 k; Y/ D5 V
        if ((val = *addr) != 0) {
, b. ~- c- j6 T3 m' L                /* Restore the original data before leaving the function." S: o# ]+ S" O: q
                 */9 m$ b$ X% n9 P; y
                sync ();; T. p6 T' ^: v, ?) K9 t; }% f
                *addr = save;6 F5 U1 l1 S% r+ {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 I3 v8 `/ g8 A                        addr  = base + cnt;% L6 E  X9 r$ j
                        sync ();
2 m0 X# P, G: A$ G7 h1 Q$ u3 {" n                        *addr = save[--i];: L+ F  }% J0 r' b0 {
                }7 X6 R0 C4 [( {0 V
                return (0);# G! O; e  U& ?9 X" |
        }; O- E$ W, A8 Z4 a
+ o0 O+ q: V" l! w% X: M! p8 r) @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  z$ E  {. D: \) M& s7 j5 F                addr = base + cnt;        /* pointer arith! *// g7 y7 f( u+ R8 _, r- Z
                val = *addr;4 k& A3 ?8 E2 M9 P8 Q0 z# G
                *addr = save[--i];# v: r" }# {$ m1 V  _9 C
                if (val != ~cnt) {7 B" c& Z3 o9 L
                        size = cnt * sizeof (long);4 a  g( R& X+ F4 a/ ?
                        /* Restore the original data before leaving the function.; {1 F; j7 i# V) P% G4 l0 `
                         */. V' [' _# q: E* W: w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 R# B- @1 _8 ~* j; w1 N
                                addr  = base + cnt;
. R& x/ r* |* _* B                                *addr = save[--i];! y( ?" d3 u& s' @6 k. k* A9 w; N
                        }
0 O) ~! M$ O, u* c2 i1 F                        return (size);
1 t8 J+ f& y, }3 _                }' [- C3 n: N5 e% X# d7 k* w" ?
        }
3 i" G8 E  L6 Z5 `2 l) H+ N, P& O2 c/ A. D5 u1 {( J* N4 S4 R
        return (maxsize);( @. l# O/ F. a* Z# e. e- p! X
}
/ k6 c9 Q; p% _) Q  X7 oint dram_init(void)
. ~; z3 O1 J# L' _' K* F; }7 q{& i$ U7 C3 m1 G
        /* dram_init must store complete ramsize in gd->ram_size */
* r. L6 r. h0 b6 A# R+ Y3 h# i/ q        gd->ram_size = get_ram_size(
3 r; @8 s# L) \( v6 N" U7 N# w+ a                        (void *)CONFIG_SYS_SDRAM_BASE,0 p, G* R2 L  X' ?8 e8 k
                        CONFIG_MAX_RAM_BANK_SIZE);
! E! |8 Y% ]: a1 O- }, @% \8 R, i        return 0;
$ h4 c4 [( _# b- s- G}
3 `+ ^1 h! A6 o  x2 j6 x, j) @& d8 i4 n1 z) K% \9 `4 o3 u  X

( U6 N( A6 f" _! Z7 V) l- o$ C& A3 z. F2 E' y

4 d- G& d; ]% d5 qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. S) }& i' E' \: z  W
6 ~. \' L4 U. C! q0 ]) B# ?# r
$ B+ m* y% Q1 V2 i& G  x9 K3 V

* T$ _( |" J: j) _  v




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