嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- ]0 j( v2 l6 j$ d8 b6 `
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, C/ P9 V0 L  h# u/ D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" Q; H7 h9 q+ f. F7 {& F! i' |8 m. A% b7 [! I' e; `* p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! V* u$ j& |+ G

8 k6 d( _9 i6 x) s- @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- `. p, W& O6 H; k: q
/*- J" u2 a7 [% P! M2 Z% O
* Check memory range for valid RAM. A simple memory test determines
2 A3 l* O+ ^- s1 X$ f% Y* the actually available RAM size between addresses `base' and
0 k: V- `9 M. h+ q& D7 T* `base + maxsize'.9 o& |! R( M: J* V) ~: B2 \- E& ~
*/& h% X* d- v% D! X
long get_ram_size(long *base, long maxsize)
% [0 x2 A# \+ R+ K) }{  o" U) y' h( g0 d4 |
        volatile long *addr;6 w, e1 N' D% C& U. t
        long           save[32];
& G9 x3 }% a, c3 w; x% @9 Y7 Q        long           cnt;& [: L/ O3 o+ `3 n3 o" c
        long           val;, ^* d% I" w  w* E8 X8 `
        long           size;
: g7 `* A: r  J2 V5 V% X        int            i = 0;, g6 W: n9 A; l8 {7 F  K) ~( D

& y3 R! u8 W+ N5 P2 N8 [/ w8 p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* Y9 P& p- t4 [+ Z/ }, G+ Y  W- r                addr = base + cnt;        /* pointer arith! */
4 c. O2 `! L7 h                sync ();: O& E9 E8 P" e
                save[i++] = *addr;
& \0 R, @" W. R3 z8 r                sync ();$ C8 ]6 F/ n/ o6 `
                *addr = ~cnt;# ?! C. W, P* Y' c% a, D
        }
- a! v9 z4 r1 b# O' f9 H& F6 C* {7 o# h/ Z) z( c! C* N
        addr = base;
4 y# }! R5 S+ N        sync ();5 f4 P$ v6 s: H0 ]" s
        save = *addr;* H0 [, v  f% p
        sync ();$ S& s; x0 T) V' g$ z: D. o, n
        *addr = 0;
: p& A( }+ a9 n/ s2 H$ o, h; {
# h! S4 ?) `0 `$ {& d4 ]8 w        sync ();3 _. P) ]# |+ \5 C3 E# W2 a6 @
        if ((val = *addr) != 0) {! v" E5 [! b: ]( M& q# G
                /* Restore the original data before leaving the function.
& o4 I$ Y/ H6 _                 */
! u- G  x" K7 U, ~8 e1 k                sync ();
0 {/ U$ U' u# }: q                *addr = save;3 Z$ B  I) W2 {1 M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 }3 }, y$ f$ A. |1 F8 e                        addr  = base + cnt;$ c6 v5 ?' ^& r. h
                        sync ();0 I/ s0 b( }. h8 I$ q
                        *addr = save[--i];
; i) r( X, ~6 @                }
) ?/ x% {) g8 F* ^" J: H3 d                return (0);$ V1 E5 G( e% w1 M; f
        }' S! W7 H3 T. C) e* r7 U  k+ v
6 f8 |/ A# P$ X5 {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& f* T3 k& V! O. x$ U: f                addr = base + cnt;        /* pointer arith! */2 Q* b2 c! v7 w+ H" j/ W
                val = *addr;
) v7 ], S& N1 o2 [: Z                *addr = save[--i];
, b+ V  e4 K$ U' B/ P                if (val != ~cnt) {
. z7 X0 p$ O, w: _  [* v                        size = cnt * sizeof (long);) h6 a1 y1 C4 W3 m
                        /* Restore the original data before leaving the function.3 h6 m/ H% j+ U! i
                         */
! y+ a* F/ X' J* f1 v                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! a9 g- P% B7 _& b, B! \" L                                addr  = base + cnt;
. W; G$ M2 c, `                                *addr = save[--i];3 u; m. }% h; X
                        }* P3 G5 E8 U6 P, I- _) ^+ L$ R, p
                        return (size);! K% |* l- X0 o: W
                }
  u& r6 Y5 I* H, W) L; M        }
% N3 E( D( y' l0 M6 E' e# W
$ a% d- j1 E6 j        return (maxsize);  ]6 K3 _. U" h5 {
}
2 L* d0 T( E2 B+ r& z  s8 ]4 Tint dram_init(void)
6 e) ^$ {: t$ Y4 U{
" d1 H) ~8 a) U% R        /* dram_init must store complete ramsize in gd->ram_size */
+ O& X( d& z  ], l4 p+ H        gd->ram_size = get_ram_size(
, Q" z% L: p- ~                        (void *)CONFIG_SYS_SDRAM_BASE," n$ z$ j4 r: ]! K
                        CONFIG_MAX_RAM_BANK_SIZE);- J, ?) \' {& ~% t  g
        return 0;# E3 l9 M/ ?/ }
}) X) f) @6 ~$ j% r+ X
( ]; v+ k4 }7 L: g" w* l$ `: G, [1 W
% O8 y+ a- b- M% W" q, E
  R& c% y- P5 B& r* W, I
: a1 x1 P5 y: S0 p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# E+ Q% D" W- i. C: D" F

/ ~$ M& {, y) B& ~; |$ h$ J* b0 B. m4 V+ t
* z9 h+ b* Z) K





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