嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ C  B6 U/ z" z+ I; X6 s1 W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 U6 S: V. F. @, O# j# S这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 E5 n) l$ t" ?0 H5 |! R- T* Q0 d% E" @+ c* g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! {; a. ?( u+ r0 v5 L! G4 Z+ l- a3 q
. `8 B9 E. R& i( y# y2 t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 J& r4 ?. F. G, \# E, _. R
/*
8 B8 w6 C+ i, H* Check memory range for valid RAM. A simple memory test determines
7 Q! o1 t2 [1 Y* the actually available RAM size between addresses `base' and
  e$ Q0 D7 B' Q1 |* `base + maxsize'.+ G+ n8 o/ ^, ~
*/
7 N! N* o3 c) I% glong get_ram_size(long *base, long maxsize)' F4 y) M+ d  @3 w( a) W
{
- Z0 {5 j; J* o, Q- H/ R+ c* ^: b; {# z  z        volatile long *addr;1 O9 @; h  Q% c
        long           save[32];# Y2 p/ y6 ^* g) j% ^7 p% v
        long           cnt;# x& ~4 y  k4 t) M1 X
        long           val;
* W9 r# F" d* K        long           size;
3 O& ?- t4 \' P/ G$ Y% X% r        int            i = 0;) R* }4 i$ W- H- E5 G3 o( v

2 x* J: f( m& l+ E$ o# ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 f: ^- B9 d4 p2 V! O! }                addr = base + cnt;        /* pointer arith! */
5 |  X& Z* t, p                sync ();9 ]" ?8 X8 {# d, m
                save[i++] = *addr;5 E: w' Y$ L# m: s; O6 j  r
                sync ();
7 {& d) x; R! n* J0 v8 Y/ s- R                *addr = ~cnt;
; {8 M! p( W' Q8 [' A4 W. o        }
& y2 Q6 V( n+ z4 C- h6 g7 ], _: @! J  y% G
        addr = base;& l6 n$ m$ y. J) q: V* U/ b
        sync ();
  _1 X5 ~" `+ m9 _$ J4 I1 q; ]        save = *addr;
' D* W% w5 ?: p( {        sync ();% W, Y" r) C! i" k
        *addr = 0;) {9 o: A. q  R4 M

/ G; l+ [' ^& n7 Q        sync ();" m% T5 ~8 @5 ]* |9 A  R9 ?3 O
        if ((val = *addr) != 0) {" n( D# j0 }+ G* ?3 C6 X7 \
                /* Restore the original data before leaving the function.
  z: s# @3 ]. A+ U                 */
3 L3 p6 A1 H9 c- G                sync ();
+ ?- ^4 j. Z7 F! o, }* A' J) M                *addr = save;
1 ~0 d; x7 o6 @3 [, F, U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 u& t, t9 p9 |5 M% F
                        addr  = base + cnt;' a1 s' Q3 q: O* y. L
                        sync ();
9 ?% s1 M- W+ u% L$ e) m9 ?) t$ Y, b                        *addr = save[--i];
4 D. }% _7 d  y2 J% v) a5 f7 h                }
6 ~# l9 S# ]# b                return (0);
( R4 W8 b# p3 C5 N        }
0 @, }' I+ d; ?
2 c7 R9 h+ H  Z# I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& a2 _  f: W& U: Z( q. E! `                addr = base + cnt;        /* pointer arith! */
$ X$ i3 O! x- m5 v                val = *addr;
9 y$ S" V, Q6 Y1 _2 w% o                *addr = save[--i];8 P! S* y$ c. }* s7 C0 X
                if (val != ~cnt) {3 |5 C' x- N' f* Z1 w7 q
                        size = cnt * sizeof (long);/ i6 |# Z$ p4 r5 M% ]3 j
                        /* Restore the original data before leaving the function.. W; K0 b. U) a) ]- L$ A" z
                         */
* C1 _, c' |4 n% X/ G8 C1 }                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# u  q9 o) M7 m* R4 s8 B
                                addr  = base + cnt;
3 q/ T: t6 K) S$ E0 O9 w                                *addr = save[--i];/ Y/ @, [4 O& {0 O, p* y* g% ?/ f
                        }
2 L; x- `7 c5 g8 V3 e. O                        return (size);( r4 {$ |* _4 J) ^0 G4 A$ `$ i
                }0 u+ J0 L, N% L( _
        }. F: u, d6 H+ A$ w  r& ~

' j2 T$ M8 S  @4 E( q4 q& w" {5 {0 F        return (maxsize);
% _0 z' }2 m' I7 }; P1 u3 N}
; u( A  y; |0 h* R7 \int dram_init(void)+ H# b1 V. J& @+ o2 }' m
{7 h9 s$ f; `3 z
        /* dram_init must store complete ramsize in gd->ram_size */+ R- ?' F: \" P9 u* G. b5 H
        gd->ram_size = get_ram_size(+ Y6 R. C. i% y5 f; W
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 J& k( u1 o1 c2 b, v                        CONFIG_MAX_RAM_BANK_SIZE);
7 v1 l/ q; w- x) l        return 0;! m! C6 G7 M! T, u
}1 Z5 o1 G8 @, B
+ J4 C. `! o# T. Y* v

0 I) I9 C+ ]) l
: z5 S$ _* `  O8 z" E( a' ?# |( }
2 f2 ~; M! [6 l; _. j9 k0 lFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 x# ~1 E" c! T6 J! \1 A' Q

2 ?* D5 p& T( H, E* l$ T; f/ x+ r8 {

8 m  A0 f; D: e: {% F




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