嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# V; p) h% Y8 M! F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. M% }5 [* V1 b! s' a6 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  |. P( _# U0 z4 n% O( k  J4 I
7 J) ]' s7 H5 ]; z/ W4 a0 {是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) y% _' J' u: ^" O: c9 M) |
% s2 e, k; L* e( q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. r% b1 g$ z( T* N
/*
2 S" F. N* |( o* Check memory range for valid RAM. A simple memory test determines$ b  G$ d  W2 }5 a
* the actually available RAM size between addresses `base' and
5 l& p9 Z9 G; Q! Y# A. I* U9 J+ B5 r* `base + maxsize'.
  @- x3 I4 T; A/ \*/
+ ~/ Q) n# r6 t2 J2 k1 Y, p# Llong get_ram_size(long *base, long maxsize)
5 ^- U4 V3 {: @. s/ A{3 _6 s$ w- f6 G% X
        volatile long *addr;
2 s" t6 w# J, ]* G6 {. r" C        long           save[32];/ P+ t5 z5 W0 D' H, S
        long           cnt;
4 J* K# E* }" f        long           val;
# g- J) O  V/ u        long           size;
# P3 }3 }* U! {7 N% ^  q& S" |        int            i = 0;
6 x. ?. X, c: P- d
9 _( t! Z: @* k6 A0 s6 I  ~; n& }1 l        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 c$ \$ N. X; I# P2 v4 ]
                addr = base + cnt;        /* pointer arith! */9 t" A2 i/ j+ L. _
                sync ();
/ c9 Q: u) |+ }1 d                save[i++] = *addr;' c& p* m! q. ?: [% Z
                sync ();: d0 \3 W5 H: e2 y% K3 d) o
                *addr = ~cnt;
  v1 P# z; Z; I( Y% Z        }
$ R: ]7 N4 ^& B; b7 H' N) t5 I
, R+ Y# G9 a" E0 l        addr = base;8 e( w4 C7 E% T& a5 B+ Y. S
        sync ();
2 o; j: `. {( S% u% e+ M! `        save = *addr;" ]3 Z" A! a$ Y
        sync ();
- h) C) U& H  T% [. r4 j9 f8 o        *addr = 0;$ ~1 k8 l' @$ S+ x5 Y
" y3 P' m& [( x7 M7 }' G
        sync ();8 G9 R: F# {6 Q+ Y6 S: X# V
        if ((val = *addr) != 0) {
9 {8 {/ m' H$ L$ P$ d                /* Restore the original data before leaving the function.
' y/ n2 q$ @. E) n' y                 */
: N' `; m, F$ e                sync ();
3 _, Y2 S- C! X& }                *addr = save;! ]7 v: T9 u5 p* E- H" g
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ U  G0 D* i; X8 M5 g                        addr  = base + cnt;# _% j$ u  c: S) j0 y: m- @) f
                        sync ();
1 @0 d, ~7 B/ o) W8 `- h                        *addr = save[--i];
% g+ j  I/ m* D$ }% s                }- m1 T* ?6 S9 X4 q! I& V
                return (0);
4 F+ G; F# \; E2 T' B        }% |7 j; A; S) n9 W: F- m

% J% W8 I" B! I2 J3 F- G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( l, q! p6 o, P- V3 h; w                addr = base + cnt;        /* pointer arith! */
" `4 \, [: x. O, v/ l                val = *addr;/ G5 l0 F- L/ m: f
                *addr = save[--i];
6 J- \/ @( k/ ?                if (val != ~cnt) {
: r& G2 F* j% y5 E                        size = cnt * sizeof (long);. {; C4 l0 i  a! c- S, M
                        /* Restore the original data before leaving the function.
9 v/ m) }5 P2 Z3 c                         */8 L7 e# r# W& `# a+ r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; s, V  W. B* g; p% {" w
                                addr  = base + cnt;
, y' n' u8 V, U6 Z                                *addr = save[--i];
+ K9 E. ^1 n% ?: ~                        }
. J7 Y6 W) M9 w1 Q. g$ e0 i                        return (size);
+ v# @6 o! q! u8 {5 `: X                }
5 q6 a. \) e2 J8 ~6 H        }1 @4 r" z3 C: e! f

. w* v/ f% l9 H3 Q; |        return (maxsize);# d. R+ b5 J* h/ B: G+ t3 o0 o
}
* O* O7 K3 q: a* X: @* v: g: Z/ l6 jint dram_init(void)
7 q  U4 R. ]3 b. K2 w{
# }6 |5 u/ X3 u: \' G9 u) u        /* dram_init must store complete ramsize in gd->ram_size */) G5 z" J- l- f$ A# M7 F
        gd->ram_size = get_ram_size(0 Q' D3 j6 X  U  j
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 v- q) i" ]  P4 ^                        CONFIG_MAX_RAM_BANK_SIZE);
8 {2 ?" q$ p1 x/ p$ ~) n' _, L" m        return 0;2 ?+ r- A" a. p( Z8 Z; t) m" {& V9 U
}
$ G0 b9 X9 t% Q% k( U+ L0 n8 b9 y
6 {5 W) s" N% j& _

0 f. b! O- X2 C+ `# J3 v# O" K' o( }$ L% Z! w6 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 ]8 q5 _; s/ i5 b' S

' Z0 u, z* j* Y2 N* P" v
+ {4 {: b. ?5 l8 X" v5 W

* i+ T7 _% b0 w




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