嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" h; ?1 d  N! i$ _* e) P: x核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& H, P! r9 l( s; N6 L$ [这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 L( U  X9 j* Y  |7 r: z

! p# x* b2 R  G+ _  Z+ J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" n+ F( M" {  ~7 A/ e! d; k+ P( I/ C! e2 l1 _5 _

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 }( i  U7 T; F+ L: [6 [$ y
/*0 m0 C+ j8 u- a1 G# J: f
* Check memory range for valid RAM. A simple memory test determines5 Q$ A6 E* J& }% j) D( k
* the actually available RAM size between addresses `base' and
2 o: I3 M. I7 T8 W- L% y; S* `base + maxsize'.
- @% A, W* C6 {*/" r8 V, E/ v3 u
long get_ram_size(long *base, long maxsize)
# ~( y' m/ ]& U, l5 c{- e7 Z3 }' W) }
        volatile long *addr;+ _/ v- G* F# t
        long           save[32];: T5 E) T" O% Z
        long           cnt;
6 e5 Y5 x! X+ @/ ?* q        long           val;# z2 M/ e/ l! _. b5 G: w
        long           size;
; T, U! Z% G) j; Y& i" ^* e  w" }3 R        int            i = 0;& M) B9 m2 x# D2 M, s% j/ f" D
6 m/ t$ B# n& T1 G$ M8 {
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, S5 V& D4 P$ h. H: M                addr = base + cnt;        /* pointer arith! */
: p) s9 U9 U% p& t0 B7 H" M                sync ();$ k; S! ]  u. e1 M3 W2 [0 a
                save[i++] = *addr;+ @( h1 _$ n- F" d6 V; d" r
                sync ();$ m/ s: k# L, N9 k  U
                *addr = ~cnt;
) n- ~. k! w5 V0 T! z% z4 p/ m+ J        }& }5 s" a, M- Q6 Y: Z$ f' B

- l1 [+ ^6 i: E% [& u  `0 Z/ C# C! u7 Y        addr = base;
# ^, ^( Z3 {7 ^0 ?  t) @3 s( f7 R        sync ();; u) G( f4 S- [6 n# K: t
        save = *addr;
* V6 ]0 C- Q  @$ Z3 J- w        sync ();
& h; Z1 {6 ~$ o% E        *addr = 0;
0 G5 x) w  X. ^, M, f! ], b0 R/ O. Y5 ^+ S6 @
        sync ();
" K* E0 w) G3 Z# `. F        if ((val = *addr) != 0) {
4 W% a: s1 D- Y0 E1 p( q/ K                /* Restore the original data before leaving the function.4 P5 R+ ~+ @7 L" T) H
                 *// `. C9 P! Z  _( r+ u
                sync ();
/ Y) ?4 w. w5 B- z) M                *addr = save;" u# B+ B: i  D7 E* |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 `5 Z# U6 W2 q                        addr  = base + cnt;
" v) I) G" f1 n2 H2 U  @                        sync ();
* N3 s3 |* ]* Z+ e2 O3 \+ J9 ~                        *addr = save[--i];( \) S; h* p6 v# l& ^
                }
1 P& B# |- |1 e& r( ]# r1 \2 T                return (0);; z- X, N5 }: j) ~- {" P9 N
        }  i5 [$ y8 x: T. V' E6 F0 l. ^, U

) v$ U7 ^4 |/ k) z- a( B        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ d! Q& Y0 l- l5 j2 V
                addr = base + cnt;        /* pointer arith! */
! e7 \/ V7 I9 m8 p$ o                val = *addr;
1 m2 [8 m6 @4 |  u: ]9 a- c  H7 M7 r                *addr = save[--i];% p. e8 a/ N+ J3 O$ l2 b
                if (val != ~cnt) {
- b) W) F  O2 n4 }. q7 L' B  O                        size = cnt * sizeof (long);# L' D2 w" c+ s+ J. v
                        /* Restore the original data before leaving the function.
4 y  K4 i" h3 M3 e: C6 E" q                         */- W" G1 W3 x% S" U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ c: F  q; H/ x; Y
                                addr  = base + cnt;
& X0 I) p0 F: a, V2 N9 z6 G) |1 U7 s                                *addr = save[--i];: |- B8 z" r* e7 p- G( V' j4 q6 B
                        }
9 @$ L! N# l. M, O7 j) q  v9 T  M8 \                        return (size);4 i: w+ t# v3 J% J3 J0 i
                }
2 L* ~2 Q7 X% d( ?& Q$ Y+ i        }
, M4 C! W3 c9 L5 |0 N7 d& z) N3 `5 h& P* w- l6 t* p3 {8 X
        return (maxsize);
3 C  t9 \% R& ?. G}
* `1 F: ]+ ~0 m) x1 p; c2 rint dram_init(void), W, ?! M5 |( u& g+ C1 W' X; B6 ?
{4 j8 d1 u7 t/ C( B
        /* dram_init must store complete ramsize in gd->ram_size */
) E) S" V& A. u6 H        gd->ram_size = get_ram_size(, @" c. Y. `: u4 r
                        (void *)CONFIG_SYS_SDRAM_BASE,! ], B. P1 u; U# }! I6 v
                        CONFIG_MAX_RAM_BANK_SIZE);
5 I' G6 H4 V7 l# `) C0 f$ _        return 0;
. J. h; Z2 B" a1 t' u7 Q}
& J9 ~1 k$ @. ]! b. u2 J% D
/ x( K& X( C0 U% q5 i" P
1 H0 z. @+ W, W* `8 v" z
. n; ~# d' V- i9 @+ E
3 n' X9 r( `. T6 g$ u6 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ i: W' T+ F# {0 X/ i# X
, c+ P) ^+ W) A9 r. @9 ?$ K( A& K* e3 e2 \9 C6 ?

+ @! }( M0 G9 [7 h5 ~




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