嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 K6 S, F" V) R% }5 {* H  a; z核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 j# ?1 R* U. e1 N( Y$ Q% ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. H7 y8 C) Q- g- O- J0 q, M
9 c6 z9 z+ o- A1 e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 N" ^" P& R% C# v4 [  w  f' s! E! |% g

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( f, P; D0 w) z# y& r- k9 M* y
/*
. s9 i% h# d: q& c! M4 P2 T+ X* Check memory range for valid RAM. A simple memory test determines
0 @. W0 b6 v6 Y/ C' T# b) Y  c+ X) M* the actually available RAM size between addresses `base' and( |+ n+ `, H. y! ?9 O; @2 M
* `base + maxsize'.9 @4 N6 e8 C7 Y
*/
" j5 G% K7 G, \long get_ram_size(long *base, long maxsize)% y9 @# q) k- }& D$ \4 c
{) ~0 N& f) D9 c3 g
        volatile long *addr;
' \0 Y2 C6 I9 k" _' v6 F3 R        long           save[32];* o) J; F+ C9 T. o
        long           cnt;' q; K, k& I9 G; g
        long           val;
+ Z. B/ ^1 r7 T& K1 X# p7 j        long           size;$ F- W. D  j$ Y) x0 ]# R
        int            i = 0;
- m5 Q; z9 B% u& I
; f+ Z; u  i9 t3 q: R        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 l' |  K( f$ F, \; o- C; v                addr = base + cnt;        /* pointer arith! */
2 a8 v# b. y, q5 h* [                sync ();
2 M9 H- p9 P8 h1 B' @4 |* l                save[i++] = *addr;
' t. d: ], i& F                sync ();$ ^4 g. ]& d% ?; ?5 F
                *addr = ~cnt;
* W, r7 C8 g# g  q7 m: B# j9 G        }. M, a8 u% c6 g7 A& O( v7 E

$ o1 Y  r$ S- ^( d4 O/ A: N" w        addr = base;
5 C' T8 E9 e: [' Z; C% ?9 E5 S- D        sync ();8 o) [3 e' y9 N7 G* P
        save = *addr;! a5 k' _9 Q3 M& ]
        sync ();
$ K+ H, j& ^8 `& _7 y+ ]7 ~! m2 @        *addr = 0;
0 _+ u! u* |% g9 M7 T
* f) H/ T1 u! m        sync ();- N* C- z. x; x, g$ c+ o) C
        if ((val = *addr) != 0) {1 Y1 G1 g, s9 P% Z$ Z
                /* Restore the original data before leaving the function.# T7 O! f0 E) E' E& x
                 */5 M; L; `" S1 K3 R" t" [0 f
                sync ();( T1 \% z2 x( ^4 u
                *addr = save;9 d. K& E% N8 V' y, C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 @, Y9 A" \" F
                        addr  = base + cnt;% k2 H. K  w# w
                        sync ();
) r# g) S5 t. q  O2 s* l                        *addr = save[--i];
' K% O. m8 u; q: W8 r, ?; Q                }, x7 J8 t5 l6 o# c4 y+ b) D
                return (0);
* E* T- g2 ^/ s  C; b5 c( W1 l; [" j2 ?        }+ [' l( k$ [. f0 B/ i; O

7 |& X6 U' A% w$ i( F: E- l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 o- S6 V# x& l- f7 v: t! F
                addr = base + cnt;        /* pointer arith! */
; Z1 V! n1 @" Y; s$ M/ z; ~$ P                val = *addr;6 Y. q$ r9 Q2 }
                *addr = save[--i];
' q. ]. S2 D8 d: o+ d1 ^                if (val != ~cnt) {! T' a' S6 V( R( G- F
                        size = cnt * sizeof (long);
4 C! \& v+ d3 V8 r, H- ^. O4 u                        /* Restore the original data before leaving the function.
3 d. ^/ G: Z7 A2 q4 @                         */
& P6 X' o; i) [) ]7 t( i                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' N. O  t, Z4 m2 `
                                addr  = base + cnt;
+ {- {1 j6 ^$ H" j* u                                *addr = save[--i];+ T" |: v+ {6 F9 ^+ m, l' r6 D8 Q1 V6 M
                        }
3 v/ r7 _/ Q) ^& @, \, I3 ]& E# [$ a                        return (size);- t' R; e" ^$ `
                }# X! B, Z; z" L+ R1 B% Z
        }
/ r7 _9 i: Q( `1 `; m" e7 l8 @! [9 H) o" o0 f
        return (maxsize);" m% f% K  \7 r! G9 L% k* I0 L
}' ~& O3 x% u6 x, u+ B$ ]
int dram_init(void)+ I- @! S. u/ k7 g  F/ v
{$ u& g  G. H5 G
        /* dram_init must store complete ramsize in gd->ram_size */
) w, A6 P9 g2 n& g: g. W2 f; E        gd->ram_size = get_ram_size(6 }" T- q- |* T  J9 P
                        (void *)CONFIG_SYS_SDRAM_BASE,
( c( s4 T/ o  S$ t" N1 i                        CONFIG_MAX_RAM_BANK_SIZE);# m/ O8 {8 e9 e% X0 J
        return 0;
4 J3 L& K! I* w# ^$ n, }& d& ~+ ]}
# X/ W8 t1 ~9 {- f  L0 ~7 e
2 ]% b! S5 o" N7 v
, Z3 s0 w, b+ F9 e/ N, k2 q! {: s4 l# z

" u0 K& m; I. y5 }: n+ |* c) qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 @2 f& i. \6 V5 ~: C3 Z  l
+ z* A) M: I) W4 p! V
* L8 B9 n: e( K5 V

. ]" h/ D- i7 L, V




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