嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 u- R3 s1 l7 a; r7 Y9 v核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) @7 t$ Q. h; T+ v+ v  N2 A+ ~这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& F, ^1 Y5 r6 J, h; e: P8 M& f, ^$ _2 i, K4 h' P3 t) g, q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& H- T: r* l$ q) y5 ~9 @

6 c- w( N# {8 c0 Y* z+ C  K; ~
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 m% ]$ k% r2 }6 \# Y6 K/** h2 {7 t0 d0 o6 R+ y; j
* Check memory range for valid RAM. A simple memory test determines
! h) Y1 _) Y" T6 ?: G0 X* the actually available RAM size between addresses `base' and' H2 C0 ]0 b+ p
* `base + maxsize'.
* {. g+ g9 ?+ f2 u3 ?) i9 A*/& L* A8 _0 E" Y% l- \
long get_ram_size(long *base, long maxsize), K7 T/ W. q$ Q; W
{
; [. T( t; M$ g0 G1 Z  ^        volatile long *addr;$ b0 x' g6 b& W9 m) W
        long           save[32];
6 T! h/ |4 b  G        long           cnt;
$ _' q2 a. O2 K6 ?0 g" ^        long           val;+ G( h! Y+ _5 P$ n
        long           size;
& f& W5 V* L2 `* F6 \) u        int            i = 0;6 p, ~$ T4 f8 @" F. k/ u5 I
/ h# p9 {- ~# P% u3 s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, z& h" i7 u6 _
                addr = base + cnt;        /* pointer arith! */
  g7 ~/ H% ^  ~1 f" `' t+ G                sync ();
5 d/ p4 N. V6 G- G& W/ p& i                save[i++] = *addr;0 e1 t! ]6 E9 f0 [
                sync ();' R0 R" m; A( v2 b
                *addr = ~cnt;- C2 A2 ?) L$ d  W# v+ D
        }, G% ]0 a& q- n4 U; v5 m- @& i) S. V
; `2 T8 ]& K( M( c1 D' }2 d
        addr = base;: B  z3 P: v- l8 r3 q: C! d$ C
        sync ();
+ N7 s! V$ [9 W3 i3 Z; e3 l! b        save = *addr;3 P. b( ^# r& B! a* L) f
        sync ();; a1 q$ K  P+ o. h; t: s3 S) B
        *addr = 0;
+ ?  o( p: q( Q# z5 o( W* {0 [
# a+ B! \* z+ Z/ I6 k% z7 u        sync ();
( H" ]/ v: G/ Y5 N1 _        if ((val = *addr) != 0) {3 i1 |& @3 f7 G
                /* Restore the original data before leaving the function.1 z- ?/ n; }( |2 k
                 */
, l4 L3 s) k# L$ M* u8 F. ~0 M, A                sync ();
. l% i& e" u9 z/ C" F* u" _                *addr = save;7 Q1 r- O1 g/ L6 e( b
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ |3 q  ^4 @, S/ o                        addr  = base + cnt;
7 q7 M5 K+ G* G/ ?9 G: ]- ]                        sync ();
4 v! g% ]  F" t: w* g6 Z                        *addr = save[--i];
1 X" f* Y" a& H3 `) Y                }/ N& @) K* f5 M5 {1 x6 ?
                return (0);9 s% _; @; M  h7 \, Q
        }  ?' k3 R, i$ J' ]2 H1 a, t

- B2 i# s# N- i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# H! v7 ]- T! I) }. |5 k                addr = base + cnt;        /* pointer arith! */0 T% q0 j3 k2 m. s9 g" r- h
                val = *addr;
; M0 U- q. U" s                *addr = save[--i];1 k, R4 }' Z# T9 b( E/ M
                if (val != ~cnt) {* g  R+ U$ o$ \; n  K( T
                        size = cnt * sizeof (long);. P6 _. ^) \9 Q, Q
                        /* Restore the original data before leaving the function.( n1 Q3 M4 |- m, m8 I8 o3 d5 g9 f
                         */0 {' \6 r1 N' ?
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; ?$ M, o" D- [' n% c; s+ _% Z                                addr  = base + cnt;0 O  Z  J& w4 ^- h6 z: ~
                                *addr = save[--i];
, z2 `; l- A( a7 m  h6 N' F3 [                        }
0 {. L3 M: I, c/ n0 B- @2 X4 ]# F                        return (size);
) ~7 u9 b, @. u3 d! N& U  B                }) C) T$ n( r* l! k' X  t+ y
        }5 f4 w8 K/ q( p, d2 I
  ?1 D9 }% _3 m9 B$ {/ |
        return (maxsize);
: m, s! Y. W, d; Q: V}
" s( Q3 l( w3 E* i7 U" }int dram_init(void)! {! h% P0 g! G, V/ {+ @/ w8 |
{/ m$ O9 N6 R+ O+ _% }
        /* dram_init must store complete ramsize in gd->ram_size */* ]. }3 B& X% {& Q' R5 y, W
        gd->ram_size = get_ram_size(0 ?. t' F8 B6 i  D: A
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 q$ }9 n% l* ?/ E9 Z5 }! t4 _                        CONFIG_MAX_RAM_BANK_SIZE);
: ]' }* y: y4 T- s8 z$ W8 ]        return 0;
6 a% S6 `9 V% p. Q' V: Q8 S* X}, \6 h: ?& V( N

) C; H+ m2 d7 X
- W7 h! k- s% n( N* V0 M) t5 H- W* Q! i
2 S+ i0 V6 S7 I. w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 q4 s" L) L( o6 P5 Y3 }- f
9 {$ m' X# E+ L: A2 |7 i) F
; N4 \) P/ [4 S* I9 Q9 {9 Z

( p* }4 o2 {% v/ g& {6 W




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