嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 z- B! h+ G( Z- ^' n9 h. \3 d  _; U核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ f2 Z( v  f4 R2 ]$ J$ u. j. e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) D% g( D& ^. D# R! k$ t7 r9 ^0 p2 _* ^( G# E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* M0 |2 B1 }' H, e: _
7 `: T6 F, ?& [6 S& q: `' {8 K* K: H

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 d# M- }# a# V* g9 ?. [: `; A
/*7 Y! Y% w. x5 t6 N# O
* Check memory range for valid RAM. A simple memory test determines
$ J6 X. {, P( M/ ^1 x  M3 w* the actually available RAM size between addresses `base' and5 |! Y  D, x. Z0 @4 }5 ?
* `base + maxsize'.( b* F4 F! ~4 E6 i0 o6 D
*/
3 F% z5 n: b8 d- c6 Y/ hlong get_ram_size(long *base, long maxsize)  ?7 w6 b. v3 P- v0 B* @
{2 Q3 B* R, k2 Z4 G; U+ \3 E
        volatile long *addr;
9 }3 J( V* t, t        long           save[32];
+ ]5 E' V( C; N" s9 m! C        long           cnt;
  W+ S# J% D# B5 _8 G7 ^        long           val;! C/ I) N0 }# P- j  C9 O  }
        long           size;
9 i2 q# p% p6 D) O2 ^0 g        int            i = 0;3 f: z; x. ?  s# u& {6 S) b

# W2 C& h- {% H/ o        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( q! _3 j& ?, ^' @+ q
                addr = base + cnt;        /* pointer arith! */4 Q3 F" Q. ^' W; [3 s! K( T
                sync ();
# x9 B4 w& k/ I  k" c5 L1 K1 i; F                save[i++] = *addr;
$ v, i3 @# j: A2 x) |& k! w& ]                sync ();, }) ~/ T- ]5 O
                *addr = ~cnt;$ U2 D  v  E7 L1 p  s; m  i
        }
  D% i" Q! L3 p# g7 t
" W0 L* A# v: i        addr = base;% N% }9 U8 F; x8 ?" y
        sync ();! e8 M1 r$ i& L6 G
        save = *addr;6 o9 W6 Z1 P- y
        sync ();. d; a- p3 X+ |
        *addr = 0;! [7 E+ x8 [$ N) p$ V4 J
+ F  W  G8 Z3 E1 C" h. }
        sync ();
* y# ]5 q% ]( p% L0 t        if ((val = *addr) != 0) {. H2 X$ Z/ \8 f+ _" b9 t! P
                /* Restore the original data before leaving the function.
1 l( U: q! s! t2 n                 */, S: f& P# z# j0 V3 o3 @% U
                sync ();9 z+ l3 E9 n* }; @4 S# }+ H" [1 e6 h
                *addr = save;
: L1 u' I8 P+ ?( P0 P* ?& c8 k4 T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; s( I* S) h- P                        addr  = base + cnt;
& ~7 L$ R9 D5 h" N; v; \3 k                        sync ();3 A6 I% }0 y% m7 z
                        *addr = save[--i];
0 G3 `- L# u- P- Z                }
) T0 `) n) K% R/ F                return (0);6 n5 `" O8 f8 f5 l: r7 r
        }& B! ~' p( \+ c: U6 L# T  `
" _; `! _* O) {. I1 z) E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ {( H9 o2 [2 n( @3 p                addr = base + cnt;        /* pointer arith! */0 O# G' g/ m  B% n
                val = *addr;
' k+ u" i% I5 ?                *addr = save[--i];
" ~4 l3 @" v$ a1 h                if (val != ~cnt) {/ e7 p$ T' C2 x" N4 k7 a9 i& O
                        size = cnt * sizeof (long);
0 M% f- K' P* Z3 I& k) I7 d4 |9 n1 z                        /* Restore the original data before leaving the function.* r2 X5 Y8 B- I$ g5 p# C
                         */- @2 v- r" ], U+ W9 y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: R" S. P$ `" M+ y6 o+ e1 a& {                                addr  = base + cnt;
/ H/ n) n8 y/ ~% a+ \                                *addr = save[--i];
+ B' {0 j: [' D. a  ]9 t1 z                        }& x& d" }3 N/ T' W; L: z* z+ w
                        return (size);% c: g  K+ B- m9 Y# e, j3 ?
                }2 w+ R+ A; w1 w, {* p: D1 Z' s; [
        }
' x' F+ Q6 H1 z9 R4 o. |4 i6 J: p  Z8 G" G2 H2 @
        return (maxsize);! c6 r8 X) q9 \" m5 Z! ]( |( O7 a9 @
}0 j6 z8 E; a$ O( a! a/ B
int dram_init(void); u3 a- s. d; x2 i$ e  Q/ r
{6 x! H/ Y+ E( C5 V* p5 \% w; o8 o
        /* dram_init must store complete ramsize in gd->ram_size */# U. J8 e2 t$ C8 ]# R9 u
        gd->ram_size = get_ram_size(
  `1 U0 v6 H% d5 ]) p. u! F6 B  e- z                        (void *)CONFIG_SYS_SDRAM_BASE,9 D3 ]( q  ^, V$ B
                        CONFIG_MAX_RAM_BANK_SIZE);$ f* p- i( b# O
        return 0;
# w# j! U/ w1 r: G2 O' W$ h) _}  S" @! V( h' }3 \  Z. }
4 y8 p  z0 H7 ?( g+ {' X- T: C* i

0 M$ J' {: [, c- I- s( s5 s# K. N% x3 E" v# H2 Q( x

5 _( V6 i0 ~, `, ]# w6 J6 Z+ ^9 ?$ XFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! E$ [9 B% N$ ?+ D4 ^$ J3 ^6 d5 o% [) @7 Z) H3 _" ^  }& j: ^
$ ^* n& m8 }( h2 {+ ~6 K

; o  u0 W! k4 L( g5 u* o0 [




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