嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 O& W1 D; b+ u, U+ P# ]9 O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 L4 s( a$ I$ O: p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. n% |1 }$ v+ B, b7 t
3 F3 ^- R- C! _4 a& [5 [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# S6 L& b- d, Z7 \4 D5 [1 g0 [
4 M# B" z  G! V( E0 }' i
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; f( C, E! w: O* a5 y% j/*0 h; B0 ]/ G& _) k2 c
* Check memory range for valid RAM. A simple memory test determines
2 I/ h! Z. a$ H: c( ^- d4 C* the actually available RAM size between addresses `base' and: \  X/ u# y  H# z- W  q/ b$ F
* `base + maxsize'.1 r: M) u# s/ g2 J) L+ n7 t
*/8 h: ~3 e4 |, \
long get_ram_size(long *base, long maxsize)! U4 T  l) P- ^  s
{5 W+ o3 e8 Q0 @
        volatile long *addr;
! ^* s$ J/ j; X( G3 K3 D        long           save[32];! i& J) ~2 t& B
        long           cnt;
2 {8 u5 z6 B' P( ?, c% Q$ C$ a        long           val;
3 E* {. D. v3 G, n* f8 g        long           size;! f. c+ e$ ?! j( b! m
        int            i = 0;
: Q, |. T6 e6 {8 I
* Y$ T; s' b: |0 `2 _+ X. R! ^        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& Y- M; g3 t! F3 v/ Z8 |( T
                addr = base + cnt;        /* pointer arith! */( E* U- n$ j( h" O  Z
                sync ();
& o9 d$ Q2 I- ^) c                save[i++] = *addr;7 u( h: u. H, _% c' ]$ \1 w
                sync ();5 b2 [( h: f! S
                *addr = ~cnt;  |0 Z* \1 p0 P( I8 v
        }
' \! k; {' q/ T6 a% R/ N5 v
8 b& Q" h4 v2 M* {        addr = base;
/ {/ G4 [; r/ A' t" X2 g6 @, u. M        sync ();
/ L% r" g' H: P( B        save = *addr;
1 l: n- U% I9 f# t3 l6 O        sync ();/ s3 u# u& ?% }$ [3 z5 v% R$ P" E
        *addr = 0;
1 |$ F# q) X" R5 C' k
; F; j' A' s* {  s6 C        sync ();
1 p4 o# [" X* J, L$ A1 k, r: Z        if ((val = *addr) != 0) {& n# R4 B7 G( a' R3 w; r
                /* Restore the original data before leaving the function.5 I' J6 S+ ~0 F
                 */! I) \% Z+ d- C' ]
                sync ();
( o$ D3 R2 o2 K' X- I                *addr = save;9 O9 y" q& s0 J: m& p( E
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% A( |/ Z( e, ?  Y: f                        addr  = base + cnt;
. ?4 G+ a; A2 @" k% L                        sync ();
' h0 Z6 L8 s; }# V( u. t                        *addr = save[--i];
5 F1 Y8 V  j9 i; E7 c( O+ M% U0 I                }
& ~1 r/ j% @6 G. k$ {+ x                return (0);) ]6 X3 M1 i$ j  v1 I% K; J  d
        }  u# R- {& K9 l
% n, U  M+ w* }$ r9 S* U  z; ]5 p
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% G9 ~$ S* p0 t8 M! p                addr = base + cnt;        /* pointer arith! */" E" A, s+ R6 h; R; ?. X; X% w
                val = *addr;
& I' d. G1 j3 e  \2 x                *addr = save[--i];
% z% o6 f/ ~: O- W. }                if (val != ~cnt) {
8 A, ^. c: L. b* ?                        size = cnt * sizeof (long);
0 H% o4 F1 `: G7 e) b% f6 r                        /* Restore the original data before leaving the function.; t6 M; \% r8 f
                         */
6 ?  P4 Q% _$ J" ]% k                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' P/ x4 \( _) x, [& p                                addr  = base + cnt;( @0 p9 J7 b- w5 X$ v, |
                                *addr = save[--i];
. o' I% _& W5 \0 i5 K                        }( ~2 ^6 v4 m$ M$ u( n
                        return (size);
* C" c- J- X3 [. i' D0 W/ R  x                }
/ C) j( ~; I: W        }/ F* _0 ]3 N8 V
3 D. A. v$ N9 t. C4 i! F+ y
        return (maxsize);
! u  z* A" X) b! {/ s" y8 l" g( _) j}
, v* @3 H' [3 V3 H: n/ U9 g& cint dram_init(void)( i# N' ~* \' c! B- \
{
# k* q5 O" ^$ J0 a4 Z        /* dram_init must store complete ramsize in gd->ram_size */
- _7 C- q7 R9 i        gd->ram_size = get_ram_size(
9 H% d! x, i- S4 ~: p                        (void *)CONFIG_SYS_SDRAM_BASE,3 U  t* h' t7 q) u) \0 H* O" y1 I
                        CONFIG_MAX_RAM_BANK_SIZE);
6 I+ U! u0 g% F* {) ^& e        return 0;/ |. K! Q1 {7 x
}3 N/ Z5 c, L2 D8 |0 s
4 @1 e& o6 F/ o; N& }0 b# L2 [# G* c$ K

9 M$ N  a# q9 F( G5 ~! D& Y1 h$ I8 y* q" m4 E

3 K; |# R' T$ y: W* e5 H) Y$ @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 m( E- n' J" d0 h4 n

. K2 Z) b7 a1 G/ L  q2 L
6 r$ [0 i7 a- }0 t' D: G% |( u
1 ~4 D8 g) R/ z9 G* O4 _2 l





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