嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 O3 K7 Y, W' }8 V核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* E' g: E! _3 G这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% v+ C; a6 l4 ]$ ?& }! v

4 l4 `# z  j' s8 j* B' V是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 m0 r3 p) p" ~. i9 T" U5 P3 q% t4 J1 T! [6 B6 x% P

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! j1 b# s2 n+ D$ b7 c
/*- X& T0 b, ?# Y6 [3 m. v* S
* Check memory range for valid RAM. A simple memory test determines
& Q0 |( E/ |& J* B! x* the actually available RAM size between addresses `base' and% h! ~  T4 V/ o4 _3 s* y* q
* `base + maxsize'.& a6 f/ x+ u. L; M" q2 T
*/% g3 Z) y& ?+ k" U
long get_ram_size(long *base, long maxsize): g; F9 \* y& ]+ r
{9 |5 U: g3 s4 N% [' t
        volatile long *addr;
: I: X, K" e& U( e        long           save[32];
( o3 ]- Q, P" q# K! J        long           cnt;
! X" U& }8 d3 f' U; b1 ?/ t0 e        long           val;
1 O# k" `( T: t4 d7 Y+ S9 P        long           size;' [& C% W7 G, b* N' ~# w
        int            i = 0;
$ u( m7 z7 P% V+ I0 a' q
. d$ W5 O* R( t- d8 t# c! m/ T, C% W        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 f8 F! p$ n$ y( e                addr = base + cnt;        /* pointer arith! */- Z0 h. ]0 ~. p2 a. @! ~( _/ D/ d
                sync ();
" \( ?# H7 R' o/ o* y+ Z" n' b                save[i++] = *addr;
2 O( j& F% Y1 L  @& l                sync ();  B) }5 ~1 m. K4 Q" x* u
                *addr = ~cnt;
( B& t0 h; `# p6 v% T" P- ~        }
6 y9 u" ?( L3 I4 S; E, j& M4 a
5 p0 i% e4 o: E3 M! l+ Z        addr = base;7 Z! Q4 z4 L. s% T. K, K  m
        sync ();" ~0 B( y6 R. l- n& l
        save = *addr;5 d$ y3 _% v4 w- W( ^* |
        sync ();
0 q( d! f  J' k/ Y& j: e! c        *addr = 0;
% X! l, N) U( W5 h+ A. J* }
  N6 V8 E. k& r! `: \        sync ();1 T0 ?. A3 u/ N  F$ y3 G4 _* Z
        if ((val = *addr) != 0) {
3 N$ R/ Z0 w& a, T* s. P9 v                /* Restore the original data before leaving the function.
) R& m9 }7 z" T6 V                 */1 k7 s! j$ ]- C3 v+ N, t
                sync ();: g1 r! d9 t  \9 q6 C7 y. b3 L
                *addr = save;% a0 e$ C  r* t/ c7 O( a  q6 N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) J, j# D8 X, Q, c# N5 F
                        addr  = base + cnt;$ H! Y% f  T' J) {4 `3 \  t. N
                        sync ();
6 [1 |5 i& w- J3 V  N: S/ }! [                        *addr = save[--i];
) \: X3 N0 S) P                }. _; j$ E+ m% x1 {5 h3 H9 {, u
                return (0);# O' ^  X1 f* ^( w" ^: x; w5 M
        }
: J- n: B( I) @" t1 d+ i$ ~! n' G
: W. F# `) H% }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" J. H4 I" Y6 {* u) W                addr = base + cnt;        /* pointer arith! */6 o1 i( y$ J- w% y7 Z
                val = *addr;
5 L! d1 P8 o: ^1 _3 ]8 r5 P% t                *addr = save[--i];2 k. d8 G8 L. D# ~3 N4 |
                if (val != ~cnt) {: I) ]7 C, d$ Z- E9 W% I! z
                        size = cnt * sizeof (long);/ E5 X) M0 j8 z
                        /* Restore the original data before leaving the function.
, Y+ l; v- s8 ~7 j* s                         */* s* l$ m- P6 D1 Z0 \4 _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" v$ H3 d# T5 I" x                                addr  = base + cnt;0 y* b9 s( A0 e/ O# O) d
                                *addr = save[--i];8 R+ _: O% L* Y' E) a
                        }4 _0 |% u) h. o$ U0 T* r
                        return (size);1 f5 P7 O# v6 T% }5 \; y" `6 s
                }
, {) ~$ G3 Z  b, @, Q1 ?  |        }
& B. S% r& F! o4 E8 ~1 k6 E) [2 ?* J1 ]: b! o
        return (maxsize);
3 n* Y1 I, U4 m$ d/ b}
8 R# V" [( o' y* fint dram_init(void)
* l% z' G0 ^) c- U3 B' b{
; l/ o# {5 p8 Z        /* dram_init must store complete ramsize in gd->ram_size */
* N3 [; d, ]0 O7 `3 ~        gd->ram_size = get_ram_size(0 Q, m6 L$ Q8 _1 D/ d. A
                        (void *)CONFIG_SYS_SDRAM_BASE,! p3 u/ D% G; @% w, N! t$ d. y% D
                        CONFIG_MAX_RAM_BANK_SIZE);
; q& Y* w1 L  T. v4 N) j        return 0;# f# l* l( a) \6 ]$ K* r) k1 ]4 E
}
2 v3 G$ W4 A  p' S6 `0 W
7 Y! R; _. g8 g' b# W6 f# }" I- E6 v* f" T

: \9 {0 M( K# ]0 ?( ^0 v
+ g1 q7 @) z+ t0 o1 p% Q. gFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 m0 B4 ]/ w5 Z" s! U/ G
5 Q) s% m4 j8 l% k1 Q6 x* W

" T4 X# G# `- R9 m. V8 [4 b
, }7 [( `" x6 k: N





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