嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 g2 o. U3 n* \! O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. b! o0 `6 \$ [& D! a: o7 W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" N  T2 l; O3 b( e$ W

  ^5 n# B; c" h0 b- ?是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 x% t% b5 O$ D" e2 i% b# m+ a  L0 e5 \: d

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: U$ ^# k5 [0 L6 Q% G, D
/*" y. o0 \! W6 |: r9 J
* Check memory range for valid RAM. A simple memory test determines
- C" c5 A0 ?* B* the actually available RAM size between addresses `base' and
( n& I% F! F! q/ h: o* `base + maxsize'.9 B7 E8 a/ k/ ]& b
*/' m7 l' W" L* S% e
long get_ram_size(long *base, long maxsize)$ ~/ \7 p) i- d9 H5 |9 `* v
{( y1 n5 T9 C# h! f- w( E
        volatile long *addr;
5 r# R3 ]" ~- e/ Z        long           save[32];
1 N+ T% D+ A; l( ]) ]        long           cnt;
1 |' U. Q2 M$ I9 t2 T9 C        long           val;1 y* r% R( s& Y  \( O
        long           size;
2 q" }1 P1 C, u1 D        int            i = 0;
: A7 \! i+ `* v' T" S
' G* \4 A  I- ]8 Q8 `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  P+ P+ ?) c2 `                addr = base + cnt;        /* pointer arith! */
" f2 C6 w& _# Z$ o+ |5 W5 @+ e, s5 s                sync ();
  X- M4 Y: m1 ^, o% h) L1 Y) F                save[i++] = *addr;% `. u0 v: b7 p- W: B" C1 b9 ~
                sync ();/ d. ?# \8 Q8 h  S
                *addr = ~cnt;" ^8 A# Z" U0 o. M6 y4 }
        }
! ~1 O$ r( E% u, l3 x% m5 J
/ w4 Z: i4 l& g; x7 l        addr = base;1 o; u; w0 \5 G( z
        sync ();# T1 N( ~+ W: I3 E" R* ]! i# i
        save = *addr;: U* f* ?1 A9 _; r, u: o' q
        sync ();. w/ f: n. C. e! F! y, t
        *addr = 0;
/ B0 E& M7 e% E( B& @7 `0 v, D( h1 k7 z1 R0 g
        sync ();
  B- Y0 x  K4 W) L        if ((val = *addr) != 0) {
( E  \6 X3 B9 r$ Q0 X) Q3 F                /* Restore the original data before leaving the function.
/ Q* @: R7 \0 F                 *// s7 G6 p- x) y. @+ Z7 {  x
                sync ();7 @* E' K3 X" D0 J
                *addr = save;2 Y# F# \, J; [6 H; N) ~- ~
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 g6 s% t0 G# ]" F) v0 C                        addr  = base + cnt;
5 u' S3 H* p! l, b& m0 B                        sync ();4 U$ g$ i) k+ _1 ^/ I# h
                        *addr = save[--i];2 @4 V; [- ^8 V6 z( u
                }0 P0 f$ \. U+ }( D, ]6 q6 D( v$ G
                return (0);% E9 H! `4 F; Q( j5 c
        }
& I& l* z2 Z& ^1 M) M9 S4 U5 R6 v+ o1 G; Q1 v( {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 h( v2 Q% l$ H
                addr = base + cnt;        /* pointer arith! */
( f6 u7 K* ]2 h; Y! u                val = *addr;
( h8 g. a) X+ ?, K  y                *addr = save[--i];
. D" j9 Z3 T3 D/ W6 @                if (val != ~cnt) {+ N2 h$ o0 a$ `+ i# w8 l
                        size = cnt * sizeof (long);* S& d* D1 h4 B( _1 o3 ?
                        /* Restore the original data before leaving the function.
! w1 n; b. e1 A( l- @% q                         */* x, e% q: ~5 K% P
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 S$ O! Q, T% w) G5 b2 D( U                                addr  = base + cnt;3 A5 H  K/ ~8 ^
                                *addr = save[--i];
2 q9 f& y4 t! @/ f. K                        }
. z# K8 L# o7 U: e0 x+ D$ ]                        return (size);5 s/ T2 A" A, V3 J. Z- y
                }0 v" Y) t: u; k7 |0 H
        }! O# h! E: E, F4 B' B' X0 J  U& W
6 g* e* z8 w0 i, c. F1 o# ?# b
        return (maxsize);
* }( K; K9 G4 e3 u}
; t" v6 e: k, u" k4 T, Fint dram_init(void)% `; I% O; D' U; R# C/ v4 B+ n
{4 H* x; `1 I" ^' i
        /* dram_init must store complete ramsize in gd->ram_size */. E* p. L1 s5 {$ i- Z# s1 O3 z: h
        gd->ram_size = get_ram_size(
: U0 L& X- j0 q: V* v                        (void *)CONFIG_SYS_SDRAM_BASE,
: T6 D2 z$ F' Z( V                        CONFIG_MAX_RAM_BANK_SIZE);& z2 M& E3 v, O8 i( e, i2 M. e
        return 0;( k  f/ k) U: G# t* T) u
}
/ C6 t) l: d- f' ?3 d9 G1 c6 R6 _" W7 o8 H5 _, ^
4 Z/ B, [; g# O5 y1 I# j& U

; w6 \0 N' T  f( z7 u# i) W" c, O9 B! x, d9 X: p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# s* d3 s5 n5 ^" A! D; q
; v% O" }2 x& m( R" G- f& P
+ y% T' a. u$ ?1 Z

  E/ }7 ?; |& g, @( E. X% g! x




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