嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ b: u* y0 m/ t0 m核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; V; L. q* @/ C1 D# ]' L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  I( |  _7 M# O; x7 U4 Q4 C4 Q. n3 n) C+ X; P9 A( J9 X( _: S9 ?/ m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ q: M5 S5 b/ S  V" P0 y7 Z/ [1 \
. `% e, }/ J2 d" f) N# Q0 Z# ?

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:7 A: v1 W% N5 G# s( w; o2 ]
/*
" R. i* D! V, J$ J0 l, H' w* Check memory range for valid RAM. A simple memory test determines6 e% g: X& [# C, D4 S
* the actually available RAM size between addresses `base' and
5 V: Q+ T+ C7 j, I* `base + maxsize'.) ^1 t3 |+ i$ V4 y' N! }3 J
*/2 w$ c4 _) ^  |0 j; v
long get_ram_size(long *base, long maxsize)
3 u5 F/ e; e  k2 o$ ]; N2 Y{# ]8 U$ J0 w3 z5 @  m# X) Q' J
        volatile long *addr;
* k2 [4 \2 S: k        long           save[32];
' N. k1 r5 m1 y$ f) m. n        long           cnt;2 a+ p5 ?; @. h7 F3 I0 a0 Q: X
        long           val;" I( e. c8 z; F2 a$ I1 n4 D
        long           size;
' W# n" M0 d1 ]0 m8 J) l        int            i = 0;8 I- w% e3 w2 I/ I/ Q1 Y6 ?
& a* w+ `# z% n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! `9 L+ o1 M5 H6 d3 l8 @7 `
                addr = base + cnt;        /* pointer arith! */
% I, R3 ^9 F" J% u/ s% }3 r                sync ();
- c! l; t$ K2 ]8 P                save[i++] = *addr;
6 I* `( d& |& W. c                sync ();( ?( h3 Y, ~" J1 Q
                *addr = ~cnt;
0 `7 t; {4 L% `6 Q% O+ j        }
" Z6 y5 [. N- P% b: P+ G; P* k2 Y& |( ^9 a3 @
        addr = base;
- y, l4 P: D0 ?        sync ();
( x1 O  v% A' Z. S        save = *addr;
  `- o3 T* R, t( {+ l        sync ();
% c2 M4 |: A  F; _. V0 B        *addr = 0;
0 m5 G) G$ k( |% |3 Q7 c1 C5 ~7 T/ f2 {
        sync ();/ L: R: l* G  D* |
        if ((val = *addr) != 0) {( R) \: [  h$ h
                /* Restore the original data before leaving the function.
6 ~4 B- T( T! z8 l- W                 */
7 I8 E- z7 N) Q8 t                sync ();
5 ~8 ?# A. k& A& i9 z, i3 Q( C                *addr = save;* K$ Q' I  {/ L
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 e& t; w, f8 C8 o
                        addr  = base + cnt;7 F5 Y( \+ f; i9 E, b7 j: h  R
                        sync ();' l; G) K1 t3 r& {. @0 N- n
                        *addr = save[--i];
: t- ^1 `! w( _* X6 R" g5 [" J* X4 n                }
% e, I) V; E( h                return (0);
, V( n4 l$ j0 K' |9 D        }$ A. W9 D3 U. [8 S8 M' |# _) p; |
" ^  w$ A7 z3 R  a% h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" j& ]3 A) X! M
                addr = base + cnt;        /* pointer arith! */
: t' P+ f' q+ L2 C, l* A                val = *addr;
/ m* i' K. x& [$ e- d                *addr = save[--i];
; a) m/ M9 W# G% J% x0 a0 K                if (val != ~cnt) {
! }" R; O/ _6 x                        size = cnt * sizeof (long);& r: a& h7 c1 C8 D
                        /* Restore the original data before leaving the function.
9 t& V. x1 B  ^0 v/ R* ^$ ^/ q                         */
7 z. e/ e0 h$ }0 a+ y( g, {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 l4 d1 L9 Q  h" t1 W' t                                addr  = base + cnt;$ t7 K$ t2 x: B. k; \$ V+ V2 d& h
                                *addr = save[--i];
$ U. c; d, ]/ ?% `- i) k                        }3 X3 O4 j0 r; F- ~) P
                        return (size);
8 r+ F' V) g$ y; y! o8 Y* ^. B                }- c5 n/ [- a$ L, G7 R; ~' p4 e$ e
        }
2 ~" H! v+ j: v8 j: K6 d& a5 v8 D6 r* j. G. f
        return (maxsize);
0 o. U4 J) I% ?& Q9 M9 K. k}% V! n1 `4 i% ~* \# {- Z" T2 |6 S
int dram_init(void)
' g, y5 `* M' @# ?% ]& P2 s{, C0 F- F6 Y- k/ W
        /* dram_init must store complete ramsize in gd->ram_size */+ D$ u3 E% G# a) {
        gd->ram_size = get_ram_size(0 W4 [* u/ }2 u/ I
                        (void *)CONFIG_SYS_SDRAM_BASE,
- n$ X. W3 v& {/ o; @1 x1 N! {                        CONFIG_MAX_RAM_BANK_SIZE);
4 |" r2 p: \$ y' k        return 0;
. Q6 V" X) x0 i# A2 k. t}
$ D9 y+ Y! S3 L8 u/ S1 Z" K5 N
/ W5 ^, ?- [3 k% W% P/ `! H6 l# [
. R( v' a# x0 }6 |8 x- ~/ D

8 Z0 h9 \4 P( D! MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- J7 N$ z6 c6 M6 R
1 p& ^7 n9 s. c' U6 X9 k2 ^. ]6 }. s; F9 o

9 H0 q: q! z! \& s  {% o9 I




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