嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit/ j5 X; h, w1 M0 w$ y2 `
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! ?; d0 x  I; s% ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" b$ ?% u9 U& [8 ?0 z5 Y( F: d$ J

! b2 R  o7 V) Q! |: Y- [* L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 G7 V2 ~9 q( e" D5 u+ \3 b+ E3 q8 T  [

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 c& B) d3 _2 |* \/*
# l1 F* {6 n5 O+ }! K$ g* Check memory range for valid RAM. A simple memory test determines
% d9 |9 t1 D3 w" V* the actually available RAM size between addresses `base' and
8 P8 R9 j$ z9 o* `base + maxsize'.  s$ k4 S" ]$ v
*/+ |5 L) Q8 i  R2 u6 v3 \' F, X
long get_ram_size(long *base, long maxsize)
4 }, ]& T  A$ K{+ c% \: A/ l+ Y6 X$ x
        volatile long *addr;) w9 L1 p, V) r+ h4 {$ @& x
        long           save[32];
8 Y' @3 _4 Y' f1 R4 _5 G6 P        long           cnt;
, q9 {2 p4 r* Q1 |        long           val;: w. N$ Y- m- `, a4 s
        long           size;- v" b' g  j; _1 j9 Y- s
        int            i = 0;
" ?* _4 I/ u* U, h* |
  a% C/ F6 a/ x  g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 O( I6 S0 i2 T! y" a. i
                addr = base + cnt;        /* pointer arith! */$ ~. T, O" a9 ^
                sync ();
4 w# ?+ b9 v* R, S                save[i++] = *addr;! o9 B9 Y; S. e) x" H. v2 _6 ?+ D
                sync ();
- f$ B5 S/ p- X% d                *addr = ~cnt;( Z- |3 e6 E/ t" T, h  t
        }
" P- {. j6 b% {) Y3 N8 e$ U
8 q1 ^3 V% }4 J% s/ u        addr = base;5 @! g8 o$ M% V; ~
        sync ();. B( _( a( n/ l( O
        save = *addr;
' p5 J' i. d( |" v- [        sync ();/ e3 b1 B/ W" G" P  e7 O
        *addr = 0;
& b: K% v% ]- T% m* Q
0 c( e8 N1 m# O) P        sync ();
1 L& Z) W5 j6 |: H* p$ X  N        if ((val = *addr) != 0) {
$ B4 c; b& d4 |. G2 l                /* Restore the original data before leaving the function.: b" ?9 F1 o" h/ }' w7 h  D
                 */
8 i/ J& O/ T- j7 H4 N                sync ();
' G: @6 T' m: v( l/ Z9 i                *addr = save;
9 ~5 ^. i: J2 [                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Y: ], z) r" r7 M                        addr  = base + cnt;# @9 ]  `% |% T- R
                        sync ();5 O, g5 ~/ |+ ?1 y& N( Q
                        *addr = save[--i];3 ^: r- [" N% ?) T
                }
( W& n% W8 q/ k9 G" I4 A                return (0);
3 b- Z4 l  Z1 _7 i- I        }; W5 D/ U$ ^( A% R9 B+ t

# {3 r1 N8 W: f/ \6 d& ?        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& N, m( \5 U2 \2 P$ N
                addr = base + cnt;        /* pointer arith! */
+ {! H! q! J/ Y7 V/ U$ s/ W& I                val = *addr;  P8 N0 I- Z+ Z
                *addr = save[--i];0 }: o& C5 s6 O( T' g* }
                if (val != ~cnt) {
% y6 l4 _2 h+ |3 w8 \# J1 T                        size = cnt * sizeof (long);6 F/ g% M" k3 g: `+ V
                        /* Restore the original data before leaving the function.5 w5 g  v# X8 e( c& ?
                         */& i! q' A2 {& A6 h2 o. m
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 ?& N0 `! x7 s4 L                                addr  = base + cnt;
8 p6 ?9 Y! v. h! h4 s, W                                *addr = save[--i];
$ E* i. t# w& h  \                        }
& w+ M" H$ E8 {, k1 [- R                        return (size);9 r& o) h% J5 r9 b
                }) S9 m: J) G  l% ~: V0 W: V
        }' T. v/ I, H4 m0 G% \$ ^

  ?$ i: Y5 o* U5 N2 u$ y        return (maxsize);
# q; G; {- p3 N* g% f}
, l3 o0 e" _2 Z) l. Sint dram_init(void)
/ z# s% x) ~4 d4 ?& W# b{# G3 s: ?8 P9 E: w- Y2 j
        /* dram_init must store complete ramsize in gd->ram_size */" Y2 N1 B7 f6 x& D8 g" w( U
        gd->ram_size = get_ram_size(
. I1 K- M: {+ c  m" z/ r6 @3 ~                        (void *)CONFIG_SYS_SDRAM_BASE,
) d* b, z4 B4 M* s2 d                        CONFIG_MAX_RAM_BANK_SIZE);5 d' |/ E3 Q# v* a* u0 ]
        return 0;
, u& I0 V  q6 @2 Z}
$ A5 ~  y7 \1 a
2 y9 D. q) \0 I8 J8 }3 ]1 p8 N( a7 s5 f9 _; [% f. u; p! V
$ T+ [) Z4 s- s3 n/ ^% i
6 g2 F" L1 r( a% V  S2 W. Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' c/ Y- n6 m$ M0 A' F6 s/ P" {: d2 V  W: M: ^: P

; |5 v, j+ C% U& _
1 Q& {' h) O6 r# z$ b





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