嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, e4 }4 K! e& f  \7 }
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 ?! y4 q; R8 z* y) U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 R9 q- t9 Y5 d0 c5 u# \

& n6 I1 h# t) _, p$ R是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# Q0 _+ Z% ^  v$ n& X+ ]& ?

$ n# u1 [+ q/ ]* w, z9 ?0 _
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ c0 i4 U. o1 S, o* p
/*
: k/ y* o# T' z4 ]; Z8 h* Check memory range for valid RAM. A simple memory test determines0 T& t! |- d# u) W, h9 E) s+ E
* the actually available RAM size between addresses `base' and$ y  |" A9 V8 d0 o! o# d& Q( N
* `base + maxsize'.4 i. A2 s! W9 R$ u) X$ o
*/% p0 O! I* V7 e1 a0 u+ Q% c* C
long get_ram_size(long *base, long maxsize)
$ D# w: I6 f7 n4 p* j{5 u4 d) ?6 I2 x1 S# D
        volatile long *addr;! i( E/ o( p( f7 @3 v+ r
        long           save[32];
9 k, W1 N7 h, ^- }, j        long           cnt;
9 {$ V' u! \5 d3 r5 ^$ V; L, ~        long           val;  }; N) T1 ~& \. v" J6 [
        long           size;8 p. B! U' ]! s& o) [) J  ~% c5 s
        int            i = 0;
/ n) p$ n: @9 D) n4 G; m# X5 p: _' K$ o) Z% [: s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; P: t. u- v" q# I5 ?                addr = base + cnt;        /* pointer arith! */
# j" R& F) x4 p# G  e% P                sync ();
$ q: a- y. R* s, k& [3 c2 b                save[i++] = *addr;8 w! P# v: _  s* B* t
                sync ();: m9 L0 C6 x; u- H* o& n2 L
                *addr = ~cnt;
- ~( I; N! I) j        }
/ k( L4 B7 u$ W7 B  j* e. A5 _. P! }+ U
        addr = base;) V  T1 f1 u, \0 T8 Q1 [4 n- s
        sync ();+ K" |  n& ~$ L5 t
        save = *addr;
# T9 p& H1 |) D) W3 S        sync ();; _; |* F; g& y% G- c* T
        *addr = 0;- v/ \& j6 p: K$ Z

1 ^1 }4 A6 x! f' H" s% K5 t        sync ();
2 G' j' k2 k- ?  r# u        if ((val = *addr) != 0) {
. M5 I! ], |' }- I! c* _, b6 O                /* Restore the original data before leaving the function.
6 Q% @* {4 K' F( J+ B; h+ ~                 */: s1 l/ i2 {& e# s" a
                sync ();* |, b  q9 L. f0 V1 m# a
                *addr = save;
! O) l- M  Q9 ^( ^/ ~                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# V) t  E  q! y& r7 m' S
                        addr  = base + cnt;
9 t/ o& D8 x; x% Z5 W7 @                        sync ();
( l7 A1 I0 |% Z6 q- S  o' S* D                        *addr = save[--i];# x( H2 \3 a  s- {  t# L+ O
                }/ @7 v- C( q4 J3 H; \, g. c
                return (0);1 J5 v: V5 G& {; }; f% Z& Y; @
        }
+ m/ r2 a2 h7 d$ x0 M
1 F) L; h/ h. V* k  j, `4 `9 e        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ h+ ?/ y! b5 [5 D                addr = base + cnt;        /* pointer arith! */0 v8 `$ [: _) h( V
                val = *addr;
9 L9 ~- j) }9 c) @                *addr = save[--i];. R6 j0 C0 R3 F, V
                if (val != ~cnt) {/ q4 f: a' I" k& o
                        size = cnt * sizeof (long);, O5 w. h$ T) W
                        /* Restore the original data before leaving the function.
4 x2 C/ P# P) c' t. B                         */
# R' z( i8 v. h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 F$ q. f" n4 Y3 M; u% f- C8 O* L' m2 h                                addr  = base + cnt;: o/ j* L$ L6 l+ n
                                *addr = save[--i];( X3 C/ [9 ^* a+ a
                        }
; ^1 J7 Q3 r  E. C( u, ~- W* x3 q                        return (size);: V6 `- {- e2 D3 H4 |& Q
                }
5 e3 R* U7 h1 @2 q        }4 ]$ {" f* v4 ~) m9 f$ a
8 ?/ w* N, w% O$ t7 h; r' T; `
        return (maxsize);
( e5 O7 \+ W$ H+ ^1 |* \}& s# D" H( d" d
int dram_init(void)8 S$ T. r) ?8 C/ Q+ h. l
{" Y+ n9 g8 B4 l
        /* dram_init must store complete ramsize in gd->ram_size */
1 _  k/ y1 S, k3 }6 u0 @* K        gd->ram_size = get_ram_size(
- Y. c* r# `! |" Y, k' H' B3 I                        (void *)CONFIG_SYS_SDRAM_BASE,
; v0 D3 |* W7 l2 D2 U8 o! L) m8 {                        CONFIG_MAX_RAM_BANK_SIZE);! E+ K. X' w: M6 y
        return 0;
. x1 P5 u) F% Q0 ]0 V4 e+ ?) f}( f$ B# r, P% m1 H
% k% N" E0 K. k' R3 K) `

: U! H( a4 e# ^: O* L, j4 U: F% \6 m. P/ P' u! V

/ D3 O( x9 A+ l7 U# lFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. X; Q! j' W7 @5 n7 [& P" W" y" C
' i6 u& A( G( c4 ?

" c) j  c8 u& ]( c0 {
( E& o  x& X/ V+ a. O





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