嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 f: |  p$ C, L5 l9 }! `3 E
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ y6 Q8 X$ ~! P% z. u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; y! v$ ^3 T& R  v; W& A

- M3 e7 @6 [+ t7 H% H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 n5 W6 }* u1 p0 ^3 D# h
  C  X# `: f$ E2 V4 H$ E) N+ m" \9 ^; c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% F) _2 M% L: w  E1 L/*
, U) p# D' O# s! d' c7 S* Check memory range for valid RAM. A simple memory test determines; R, F4 Y- F" }3 k. c
* the actually available RAM size between addresses `base' and+ C8 E8 G+ |/ E- j$ O; _" E
* `base + maxsize'., I5 Z  V. `6 d0 l
*/( C% @; K8 ~, ?  M) L8 f
long get_ram_size(long *base, long maxsize); S* A- V* G2 w) J. y1 ~3 P1 ]
{
4 O+ g+ |3 @; F        volatile long *addr;
5 h8 L6 c4 o; K" r: f. |$ u. F% `! b        long           save[32];$ [* F- y, q  j5 a9 U
        long           cnt;
! q1 `% t& S: v- K8 X9 v$ ~7 \        long           val;
2 Z' S0 T2 P6 U& p4 W! K        long           size;
; ~4 o# u* S3 ?- P        int            i = 0;
/ J) D% Z  g6 h2 _; J3 u* c8 I5 }& E* ~6 `5 a7 O
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. G. C( z1 }" O' n& `( H7 r
                addr = base + cnt;        /* pointer arith! */. i2 y" a/ A# p5 V
                sync ();$ O- q' x/ ^2 L/ K
                save[i++] = *addr;+ Y% d/ [7 ^  i
                sync ();+ v+ U( v" ^+ A# b( D7 W5 i
                *addr = ~cnt;
1 x  Q% f0 E, }' `        }, s. G9 }8 ]! [# F5 ~
6 V& A9 m1 |# n! Q& b* Q7 L# \
        addr = base;# a* F0 {* d/ l) ?0 e7 z0 z& a
        sync ();: C8 n) |: u- @7 p. ^  `) R
        save = *addr;
  M% A3 _# Y5 u2 k# [        sync ();( _- |  Q" Y9 p
        *addr = 0;
/ w2 q" R2 D! n1 F" Z; r2 s4 Q. [, {# |! y) m* u; K1 R. c3 I! r# y
        sync ();
/ ?& m5 o2 \  h, P0 i0 X        if ((val = *addr) != 0) {
% b* B" L8 U: x                /* Restore the original data before leaving the function.
5 L) c4 ~5 P+ Y+ j- l                 */
0 e# p. j2 \* \2 ^                sync ();  Y6 Y/ k- w$ @# ?% X
                *addr = save;6 n/ ]% }- Y2 _: ~5 \
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 {: A1 e" L" R2 P7 ~" K
                        addr  = base + cnt;- ~8 {# W5 ]' ~5 y' g
                        sync ();- b/ C9 M  O, C5 ~5 m9 u2 u
                        *addr = save[--i];
5 r6 Q7 j1 Q: F9 J; Z                }' F) E: v: x$ A
                return (0);$ u3 s: d* ~' u- |4 V: @
        }
3 \! g" o# e' h
$ y) T3 k* z+ u/ |) U. _& t        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' C# ^0 Y/ x3 h+ W
                addr = base + cnt;        /* pointer arith! */* W( J2 A$ u5 \2 {! J1 e" ]
                val = *addr;( t* P( z" b! o* S9 @9 c( [% N+ x" j
                *addr = save[--i];
% n% ?: l$ G2 g, W: z8 W                if (val != ~cnt) {( n8 f' i6 T7 I0 Y
                        size = cnt * sizeof (long);
9 Q7 U" u0 l' k5 a9 Z6 U                        /* Restore the original data before leaving the function.
3 i/ \) w- K- V5 |* f" x1 x( e+ D                         */7 d. R5 t8 Q5 _( w8 |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( s5 z/ y! _) G3 h& @" Q                                addr  = base + cnt;
# z) w: h/ O( |' o                                *addr = save[--i];
; m! ~" B8 Y6 b6 U7 l" Q# F- u                        }
# C; j0 R0 t; q2 Q                        return (size);! ~% o( Z) F! ]7 O4 P$ {
                }
5 a/ b1 A# p* U        }
+ ^, ?# f1 X6 m4 o
) M; H6 J( f! H+ B* [1 ]        return (maxsize);
6 C% g) X( _) O/ k: W}) v8 ^* b+ y! }3 q, t8 ?5 E" }
int dram_init(void)% ^* D2 m$ Z( ~- g
{
0 F3 \# I$ b) i- s% j" Q7 P        /* dram_init must store complete ramsize in gd->ram_size */6 s* W( |: r; o" ]; T2 {
        gd->ram_size = get_ram_size(% K0 T' T1 h& M0 I1 g0 h
                        (void *)CONFIG_SYS_SDRAM_BASE,
0 i" |  G3 H8 ~9 _                        CONFIG_MAX_RAM_BANK_SIZE);9 s! L8 f/ H* z% z0 Q
        return 0;) K" ^& ?, C9 }% [
}
. Q8 X  ~$ ~! m# p6 M
- U: ~: ^; d1 c) e) d* i; m, j3 }& p
" P4 V( [6 u4 H/ J4 w& o. ?  b0 {! j8 s1 a' O4 W- o
/ o$ }( A7 I! @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ l& ?% Y0 Z8 L# P
9 h& @% x. {8 V* c( t: n2 x0 l
' N' j/ |& Y/ \+ J" o5 `
  w* }2 X  t3 d! r





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