嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( ]: w7 o$ e! A  d2 h& k5 l' K
核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 m9 H; P. y2 s8 k  [2 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 y. H4 o( S& u1 _2 j
7 w$ g  q3 @( p& t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# K% w2 F: \+ S/ b
! a6 J. T7 @1 K' ^6 X8 U0 c/ F

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& f( Y5 i) b0 ]7 z8 M
/*
9 o/ y! [+ P; Q* Check memory range for valid RAM. A simple memory test determines
" w! s" E: Q' R% Q! `* H* the actually available RAM size between addresses `base' and
) E; }6 z$ u1 b* |3 R* `base + maxsize'.
& \; S1 S& }* J7 _*/
2 H7 A4 [4 L1 v! |) }0 Ulong get_ram_size(long *base, long maxsize)
" f5 k: F, C% z6 E" K) j1 b{' ~2 X7 U* m' O0 E3 ~
        volatile long *addr;% T& I9 k3 D* X9 x' o2 E
        long           save[32];
0 L8 V) V9 v, Z2 h& p/ F" _        long           cnt;( b5 C: C! ?3 b, `
        long           val;: S5 t3 J& X$ J6 ^9 V
        long           size;9 n7 |9 n0 c' p9 w. r- R+ g6 u; I
        int            i = 0;
4 S, _/ p& U; v2 p; R$ m( h0 k8 p8 a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. g& d4 e: Z1 O                addr = base + cnt;        /* pointer arith! */
% |$ \9 v) `5 X: B- c                sync ();& r& \" X8 o3 ]4 C
                save[i++] = *addr;
( ?. T9 S2 D8 B* r                sync ();
; l( q. w, x- p2 ~                *addr = ~cnt;
+ K& \8 ^( _, S# L) _1 j5 j. V        }: n9 ^" U1 V, c1 G# D! W2 R& C5 c
0 y3 E" R( ^+ p3 G
        addr = base;5 e' i% X, L, ^% \
        sync ();/ X2 o9 M8 b! u, |/ E3 l( o
        save = *addr;
4 x  z- G7 L7 p9 j+ A. O        sync ();
( |5 m5 o' I6 I+ P" Y( D& ]  @        *addr = 0;
' e/ \  Z  ^- s5 h1 g
7 w7 m$ c, c1 b2 S% H. C: `2 O        sync ();5 u( P& C# ^% ]
        if ((val = *addr) != 0) {
3 G2 m# W: ]7 h! g' u: j5 `                /* Restore the original data before leaving the function.* o3 L" p# }" B/ F# [( h1 `# f2 x5 g6 X
                 */. r: f: r/ T: s; G* \
                sync ();
5 v$ n' T. k* `) E                *addr = save;8 }( o5 w. q- @5 ~8 f) a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ `6 G$ Z# d0 A) R- |1 l
                        addr  = base + cnt;0 L, P$ ?7 e: A" O4 f0 }" O+ G' `
                        sync ();2 O# Q* I# Q! v# w
                        *addr = save[--i];: ~- S. K/ @3 ?6 i- i1 l5 v
                }; E; C6 z0 _( z8 X  E% I
                return (0);  I4 o8 Z) d! _
        }" h, {. M, E8 l' `: C, P
, E2 u; G: h' I1 [5 `7 G7 w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& F  s# S8 z% T. e% E3 V
                addr = base + cnt;        /* pointer arith! */- F; Q+ C. |9 @3 P) k
                val = *addr;
; G" E! M+ t1 l                *addr = save[--i];
; B# O1 q+ b$ S! d                if (val != ~cnt) {( c: G3 d  G' Q9 b9 P* w5 O
                        size = cnt * sizeof (long);
/ U, {* ?; s8 H/ u                        /* Restore the original data before leaving the function.1 w9 v' |4 Q6 G7 p$ w
                         */( |, Z" p/ o! f0 {# |) S4 b: b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ r2 J8 n3 [- ]
                                addr  = base + cnt;. Y( H2 ^) C) P3 j8 ?& {3 H9 `
                                *addr = save[--i];$ `7 P8 c. S1 i. J2 {- i* d7 b
                        }
- e: u9 I/ k  m6 n" S! M3 @                        return (size);* N: b6 u# Y, r9 k( C
                }/ r# s' g: O/ d2 w2 [+ T: ?
        }
* P: u5 @% `- f3 J. {
$ s# {& U" |4 r        return (maxsize);
5 B$ X+ l( N- W* v}
" B2 h& F% {0 d  c$ c0 |8 Mint dram_init(void)
, R5 J) v, G$ b, M) c: [3 I; ^3 z2 k{! u5 N* \% v; T* {
        /* dram_init must store complete ramsize in gd->ram_size */' I" f' X: n3 D) s
        gd->ram_size = get_ram_size(! n) z9 h* ^4 Y1 O) _5 s
                        (void *)CONFIG_SYS_SDRAM_BASE,: F" i9 c$ f0 G) O
                        CONFIG_MAX_RAM_BANK_SIZE);: W" {8 v# L& y8 X6 p. ?6 F4 y
        return 0;
5 X& i  t) }0 q! ?; J  l, e. B}
4 {; N. W3 h0 c2 q7 j
7 O5 f0 x& I7 K2 P" \% e
' |6 u/ \& N9 ]' l- l3 H. w/ N- U. q
8 s6 }: K/ z3 z, w' j8 e; V0 O2 w3 E5 U' @
' R9 R' R9 a- L! G" {( K; V+ c$ aFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: _3 X5 L8 i9 v! `9 `0 D
: B: |0 n7 t$ o" B8 V3 Q% T% r6 z+ h

% W" F9 _3 l5 H2 t# D% N$ m2 B

7 j7 {$ I% Z: ]& H/ v5 `




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