嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
; Q! u3 o3 v- M: O核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 U+ h1 ~8 |% B- X- r; u5 B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* L- I# P# X7 O# D! A1 c; j# o
" s, R* s( x. U' z& e" m/ p2 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 k$ W3 h6 C( F6 Z
, N# h; m& j1 P4 k: k

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:: R- I6 `# Z6 p9 U# F
/*+ S: b1 S/ ?) k+ a0 ]& V
* Check memory range for valid RAM. A simple memory test determines
/ e; _5 r# Y- g' M+ j; L1 J. F* the actually available RAM size between addresses `base' and  S0 h2 E8 y7 v: C
* `base + maxsize'.! r* y7 r& ^# H  j# P7 i% m) e
*/
6 F$ G- {# G) ?& s9 Flong get_ram_size(long *base, long maxsize)) V* ~4 s. {& x  o5 c; u0 H
{+ V$ I* a! ^( ?/ {0 Y
        volatile long *addr;' P& ?/ |* i) Y! W( `
        long           save[32];
# V: Z: R( f5 v6 b1 ?2 u        long           cnt;/ [" q. ?) Z0 ^( D7 Y% Y( Y
        long           val;% u/ Q  E0 J" v2 c
        long           size;
/ P: M  ~- O# o/ h, L1 h        int            i = 0;; A4 ]* Y- x4 I( h
3 e3 U) X2 `* _) }' @8 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 J7 A' L$ V% ]4 J
                addr = base + cnt;        /* pointer arith! *// j" q7 I- q7 F9 K
                sync ();% @6 [- Q' L# t( v- |8 C
                save[i++] = *addr;3 k" g' o# s# o; O9 `& y: Q9 v
                sync ();
1 ^& t! x; E7 ?2 @0 H; ]. U                *addr = ~cnt;( |4 G4 B1 U0 [! z/ d# }
        }+ P. h/ Y2 a1 D* h5 N8 D9 K+ {

6 W5 G, D  O& }# |( r4 b  y        addr = base;
2 ]+ i4 r5 C9 C3 W. v8 Z# G        sync ();8 e' ]. ^* M2 H7 n+ x% m6 }( D/ ~* o
        save = *addr;! J3 Y7 Y! h9 i$ Y" ?* e
        sync ();
4 O! F0 z" r( W6 W4 w9 e        *addr = 0;7 a$ l' }  ~3 b$ k- `! t: q
# D5 q  H& m( @( x  b5 J
        sync ();) @3 `. d, q& K; i) t* r& R
        if ((val = *addr) != 0) {
1 i% D- ]. Z& Q/ c+ C3 f! W                /* Restore the original data before leaving the function.
6 W3 f. i- ^/ \0 `: a4 `7 c                 */
8 b3 O! D6 A" h) R7 K                sync ();
: Y2 l8 j) R, `( E/ N                *addr = save;
! E% S5 I# w8 }' I" k+ f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' ^: t$ J0 F" z  l! a                        addr  = base + cnt;; w. Z& a" W: I( S& }) ^  m
                        sync ();
' S" G; Z3 A4 q                        *addr = save[--i];6 |7 ]* G2 d8 D
                }- h# G6 B8 M% _( u* ]
                return (0);
& U5 t$ Y; {  N3 ~/ x& a7 P        }; l" v2 }" Z" B  ~0 A3 d
( Z# H% F8 q) i2 F% b; |! H  A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& h3 R8 _1 z$ v# g4 I. N
                addr = base + cnt;        /* pointer arith! */! U: U- @3 J, c" F: _: r( E" J7 O2 R, d
                val = *addr;
8 W9 Y# R' Q* z                *addr = save[--i];* b) l' u* `# c7 e/ D
                if (val != ~cnt) {' B: u' z; H4 O- r7 f
                        size = cnt * sizeof (long);
6 ?! U' }; C6 a2 t) N6 S                        /* Restore the original data before leaving the function.. C1 Z5 W" N9 Z' ]" X5 w; T
                         */
$ Q6 O8 Q+ v0 h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( K# v: y, `; N
                                addr  = base + cnt;; @8 q, U$ u7 s0 j; }
                                *addr = save[--i];3 s' q& W1 K* M/ ^+ M) s
                        }6 R% r$ o" d, l! N
                        return (size);8 n+ P0 D2 X( p
                }
( P% u! E, R5 E& z; t# ^% c        }, V6 `$ N5 ]7 B+ [1 O# a' p

  \& p" |: Y+ f, J4 N8 ]        return (maxsize);  v4 F4 E& {7 l$ {" G
}
' X0 J  l" e/ ]2 `: `int dram_init(void)
5 r- y9 _% x% M0 D$ H{" l" O6 @1 G& v. z* s' q' Z7 S
        /* dram_init must store complete ramsize in gd->ram_size */( l' R" \8 [# l' u: D8 ]1 _- ?
        gd->ram_size = get_ram_size(9 R" f4 X+ F: e4 c
                        (void *)CONFIG_SYS_SDRAM_BASE,
5 F7 H- H/ {2 J                        CONFIG_MAX_RAM_BANK_SIZE);
8 ?+ j0 c! F3 C  u  @$ g        return 0;* h( T; |2 D% P; m
}
! ^7 i1 [% t/ S4 A3 v
1 `* l7 t- ?8 `, I3 v) X% s# U
; _6 |" F! t7 R' g$ v$ }) Q
* x0 p5 t% I; L6 D" [6 L, v/ ~
: Z9 e8 g( l# ]! ^6 v- Q4 ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& D8 v* |: E9 r& J4 S' {  f
, d# R, W- `9 E7 [

+ a: [: f, H' y
% ^2 M# Z1 u; o1 N; F) _





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