嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 X% x0 i5 {) e+ w: L8 S6 V+ J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, a- z1 M9 x, X! u9 Z0 p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?! j+ O& O4 |7 F3 G( ^0 P  f

, U0 G2 C# N- q& p  c% U/ z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& A9 y5 ?9 v7 \' ^
2 q. `8 ]  A2 I& B: x2 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! h+ V- K& u, l0 x. g6 W% q/*
& o% u4 s! _3 h; ]* w; _6 w0 s* Check memory range for valid RAM. A simple memory test determines
/ f0 w( o# k/ I* the actually available RAM size between addresses `base' and+ B; }: O5 V) G. f( O+ R7 ^! D
* `base + maxsize'.8 t  U! {$ I' ^, P2 c1 s. n" U; r9 p
*/0 O2 p- \+ f) V* D% F+ y
long get_ram_size(long *base, long maxsize)+ y' G/ e! `9 p& d, E& h
{
% C% ~0 v/ ^1 c$ _/ |( H        volatile long *addr;
: R0 s' l+ R; K4 v1 ]6 ?        long           save[32];, Q1 [2 e" g( i  E( w* y% H
        long           cnt;
& y3 t2 u' e. z& P- f        long           val;
3 z' W' D' m: Z$ x  k        long           size;" L! T/ b4 [7 W$ d* Q5 Q7 z
        int            i = 0;/ [0 K5 v7 _/ B: l
/ L( g; K' z0 z3 x$ \+ }3 ?7 q# }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, p! p/ x' h! c/ R                addr = base + cnt;        /* pointer arith! */# n6 J' L$ n+ T" v7 v( L) |( U% D
                sync ();
* W9 c/ [5 D& Y& m% q1 B  @                save[i++] = *addr;& m! z+ H3 c* i- Y$ }. a, o; Z
                sync ();
2 E) o5 x  y5 ~% y                *addr = ~cnt;
5 X9 q9 |# K$ g) ]  ]/ @# B5 D        }1 C  i. g3 Y1 {$ L
2 d" a' C1 [2 q3 c
        addr = base;
9 k, Z9 {- q  X% y' l7 \; D7 W        sync ();5 l! R; C  h: B/ V& V+ \% m6 o- L
        save = *addr;
; I+ |3 {! D) t' M# H        sync ();- a2 o% _$ M: s  C2 W* A6 Q
        *addr = 0;9 p/ Z  o: `# @6 W

% [/ e& R% {# n* I( h0 P/ s        sync ();8 A3 l! k4 o' A
        if ((val = *addr) != 0) {/ G) N! ~. q6 J7 B0 b) t( v
                /* Restore the original data before leaving the function.
2 S" @: n2 l2 M& ]+ W/ T' Y+ ?                 */
1 S3 Y; F# R, I8 Y                sync ();" Q4 |) h$ T/ S  O* ~
                *addr = save;
5 U+ V6 g2 z7 [6 R) ^% C5 W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 [: F6 Z7 u& o. E$ m
                        addr  = base + cnt;2 a( _  X) d  N& r% w/ _% \
                        sync ();
( S* N+ ^3 X9 N: ^, H( ~                        *addr = save[--i];
8 O' w) E: T/ }0 ]1 e                }! G: R- h3 `7 M0 b: i: W# j& U
                return (0);6 u! b3 s7 x) J- i/ f1 }/ `* D. Y
        }
. F$ w6 ^3 G* q6 \8 A; P- R
7 C0 q, V2 P( |        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 w/ C' C; f! ^                addr = base + cnt;        /* pointer arith! */
" }$ }0 s% {, f5 x, z( {                val = *addr;" K& J- j' A1 p3 T2 i
                *addr = save[--i];
; G/ c5 R5 O- m8 P                if (val != ~cnt) {; q; B# ?2 J4 t
                        size = cnt * sizeof (long);- @2 R; {9 b6 y- e5 H
                        /* Restore the original data before leaving the function.
  a; V4 L- J+ o                         */
$ y5 r$ n: w# l6 b- w- \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 L+ k2 h6 T: t  K
                                addr  = base + cnt;7 k3 S' H6 C* a& p, G
                                *addr = save[--i];. x& j, |, ]1 I* O2 j# N
                        }( k% \, @- h8 q/ n1 Z
                        return (size);3 l1 J! c: T5 i7 {2 {: \, H3 I" C
                }9 S  u* d/ d$ U% n$ R3 s( m: c" |6 d
        }9 G; W; ^2 m; [! @+ E) h9 l* k

4 t. w" h2 ]: N; [/ j        return (maxsize);: I" u' I6 D  U! w* H! ^( o2 S4 X
}
7 \% ^  R% y) }2 ~% G- Wint dram_init(void)
" i& \: d' Z6 q{' \! o  f. w3 p4 \
        /* dram_init must store complete ramsize in gd->ram_size */
2 v  |0 e! M6 X: E        gd->ram_size = get_ram_size(1 B3 d; J$ Z$ [
                        (void *)CONFIG_SYS_SDRAM_BASE,, W" R% r: u+ `" K. v/ f& S4 E/ F  z
                        CONFIG_MAX_RAM_BANK_SIZE);
& A+ s( V8 ~5 J$ J) k1 B        return 0;+ }, J, n5 ?7 v/ q
}
. m4 w0 F9 d4 _; v% ~4 \# g! R: H: _" n$ L7 J+ P, ~! G+ U
  O9 [0 U% ?& \- p

0 n) j" F( c, O7 ~
# A, Y: Z. {( W6 vFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# R/ @5 k4 w6 F

6 J, |' A& T. d3 \! O1 G0 \& {( H+ Q

+ O1 U8 O: K# P




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