嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ A" W+ A- X' o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  v& s; f5 @& w: n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& U8 K0 [+ b0 k3 r) ?
: }& \  T! [* z* f是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# ]1 y; s2 n) |, |4 O) c
# y  P9 B3 h* r
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) F7 n  ?$ c3 V* m* @& E8 z
/*# ?' q  ], ^0 k
* Check memory range for valid RAM. A simple memory test determines
7 G1 D! h+ [- y$ h* t) |" v, \* the actually available RAM size between addresses `base' and8 l; e* s7 s' [" C) K0 T
* `base + maxsize'.  S) ]- R- q5 x9 M: e0 _4 v
*/# m/ w7 c( K, a% @" b$ u4 i
long get_ram_size(long *base, long maxsize)5 v( O  P3 K7 S1 V
{
  ~/ [% \. X8 U+ g$ A/ E5 T2 \        volatile long *addr;
' t3 a5 S) z1 @! [        long           save[32];3 ~7 C/ |& u* m5 c
        long           cnt;: j& D( Q* d9 ^  u# t# H5 Q
        long           val;9 s& k# g9 F7 N4 q9 q
        long           size;
- y( m% h/ X6 ^( R- b( G        int            i = 0;2 G; [- j: H) Z3 [

0 k! O3 N! i" ^/ u        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 m. p( V1 @0 P" Y- `3 G; |0 Z2 G$ O
                addr = base + cnt;        /* pointer arith! */
" g. Y" s8 g" K& A3 J) @0 [3 E                sync ();
. D) }1 @8 R0 N, K- r" @                save[i++] = *addr;
( P0 l5 ]7 x5 A8 J9 F                sync ();( @- }# `: S8 ^  H
                *addr = ~cnt;* x# s; d) m# N5 E: u
        }- s; @9 g5 i7 W5 m* |9 z

+ f' \: @9 f! n( Q; a7 y4 g# t        addr = base;$ M' J/ c. }% U6 N
        sync ();
( `3 P- r/ x+ \5 l' b# Z        save = *addr;6 \. ?+ C) a. i. C
        sync ();  R. l/ I+ g  @
        *addr = 0;
# \3 r3 b, ?' u3 z8 [. X$ |4 H
+ o" y: c3 Q0 d6 S4 a; z        sync ();' z) y' N' d% U0 A) C. c
        if ((val = *addr) != 0) {
9 }- I; g+ r* {( i7 V+ N; g" u3 N                /* Restore the original data before leaving the function.& I: R; k6 M. l5 d2 W8 q8 ]
                 */2 |; P4 ^% c) T
                sync ();
# R$ L" j' a2 }4 \                *addr = save;. t; E5 N# _3 A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! u3 d' z( J7 I  F& |! l/ a7 a                        addr  = base + cnt;* v) r6 P8 G7 m; U
                        sync ();7 A8 `% ^; j% B6 _$ p
                        *addr = save[--i];
" h+ m6 |7 Q$ c& l6 D' r+ |9 }                }
& ~: |' ?: w( c) z                return (0);
+ m  w  \# N3 \' b9 }6 J        }
4 {4 P$ f3 j0 q( P+ d' ]6 Q+ e. ~/ u; M: x; J7 ]' ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ A2 ^; L7 ]  z* R# G$ Z3 U                addr = base + cnt;        /* pointer arith! */0 F4 z) [/ ]! u: A; f
                val = *addr;! o0 \$ J# r* @0 x6 |, h; R4 g
                *addr = save[--i];
. f, [) ?* I' g: H) X                if (val != ~cnt) {
# O+ s+ v/ ~9 a- X                        size = cnt * sizeof (long);0 j. B+ ]* @7 W0 ^
                        /* Restore the original data before leaving the function.1 T# h0 u& V$ u0 Q9 \# ]
                         */
4 S1 n: X' j0 m+ S6 d4 P                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ~3 W4 p8 ]. D" ?                                addr  = base + cnt;
1 r( n: C% D9 F+ |$ }' }                                *addr = save[--i];! v& J. a3 ?6 H- D: `* y5 ^  J
                        }
6 S2 J% e) J) m! p                        return (size);  r( [9 W3 q8 E5 Q, q" u
                }0 k+ P( g+ ^( [# c% k5 C7 B7 M
        }- D$ k7 [4 {7 T) B( M, C1 D  P

+ U4 E5 }* \, y5 d' k$ L4 w        return (maxsize);
8 h5 P1 h0 Q6 E}" d- s7 `9 p; |8 e6 U
int dram_init(void)  W- B) i" J7 u* U- s, T5 t
{
' U& Z+ [6 n$ Q4 G0 u        /* dram_init must store complete ramsize in gd->ram_size */
8 G5 y# O/ y% H# K& Q' M# @! s        gd->ram_size = get_ram_size(: @5 |, O( S7 c1 l+ H
                        (void *)CONFIG_SYS_SDRAM_BASE,
2 K- H. G! |/ I! R3 I                        CONFIG_MAX_RAM_BANK_SIZE);
1 I- }  g, C5 a. k) M  x3 e        return 0;
7 I2 g* S. j3 m! _0 _" L}; u8 u" L7 V! D0 X' n' x5 f5 k

% W; X/ n: G+ @* O+ o4 d1 _8 h# w' K
' q8 v/ V# k0 R1 B3 l' L# |/ P& z4 i! i& Y5 f; s" {, Y

' r2 K! n+ Y& f/ \FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: @' m7 \/ j6 p& i( e5 F8 H  I8 \' Z& B# n  h# a( @7 ^

. t8 {$ C& t: q+ A1 y9 v
7 R, y/ r8 H5 a: J; H- W





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