嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 d1 R& @, r3 N( z# J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 {% q0 w7 J. n8 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  ]+ y  w2 I. J+ y

( C$ z" j' L6 d9 \  M" E6 d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% s! i$ s6 o# I1 T; W& R. Q4 {

2 j2 r$ W7 I% O2 s( W) H0 `/ h# I
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:% r1 z7 v7 c. A+ Q
/*
1 t! X" Y4 D; F$ I6 C! G6 k* Check memory range for valid RAM. A simple memory test determines
' U1 \" N4 Z: |0 a- q' ^. c& m* the actually available RAM size between addresses `base' and3 \. o2 m! u$ H& S6 a/ L
* `base + maxsize'.0 n" t$ f2 V9 \2 C+ w2 e
*/
! }% {2 x- D6 \- x* h5 \3 s) |long get_ram_size(long *base, long maxsize)
! h! O5 @6 h0 z1 S{
7 [( Z) e; D9 g# o8 e        volatile long *addr;
, f8 O: z, H; T3 h        long           save[32];
9 |$ h% V' R# z: E, z  o        long           cnt;' d0 t0 @/ X6 L( G
        long           val;
, E1 y/ H9 u$ h' `! N9 l, \        long           size;+ R( ~- u: }% F
        int            i = 0;% b+ p9 D! G$ R7 O9 I- j3 X, M' |

0 V4 y* s: z6 {+ M3 }        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( ~& R+ g5 g# d3 M                addr = base + cnt;        /* pointer arith! */
  V$ H  w! ~* ~9 N9 Y$ Y                sync ();
; y% @, X; _8 M+ e                save[i++] = *addr;
/ e- j2 j! c/ H" J% C6 |& F* I1 ^: e                sync ();6 n  `. D* G0 S* v1 i6 \2 u3 H0 V
                *addr = ~cnt;
8 G1 M6 {# f2 B) F        }; e1 P: }' i: Z

5 s+ Z; D, S) p+ A# o; N+ ^        addr = base;* r- d8 t, y% s; I* Y: |
        sync ();) Y1 t& |* A. H( s8 f; u/ A
        save = *addr;4 X/ a! {. L# ^7 ^4 t  f, |: w
        sync ();6 V% ?# C9 m; u! C; l
        *addr = 0;
2 n' X; E  a' T2 ^  K5 ~% i/ V. u% B
        sync ();2 D* J) B% U( [. D. h; F
        if ((val = *addr) != 0) {3 m/ M$ Z% u6 t7 N$ Z. _3 U
                /* Restore the original data before leaving the function.: t" H) F# n+ ^8 ~
                 */9 x, m4 M/ C. }
                sync ();' k+ Z5 d8 S  H' R% L  h
                *addr = save;/ ?# g. D. F4 j' M# Z" |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 u/ h8 P5 Z! \9 K: b# N& e1 }- H* d                        addr  = base + cnt;
1 t2 S+ R- C+ M# p) q                        sync ();5 k% R6 ]  s1 i! a, O+ m
                        *addr = save[--i];
! j2 ^) e2 T  @                }
; |8 S4 g* Y& o8 v6 k5 a                return (0);3 E6 ~3 }9 d8 {0 {! l5 O
        }1 r+ \% ]6 l& N' n) T

( A* K- ~8 B1 G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* R1 N/ {. X. W5 E: t                addr = base + cnt;        /* pointer arith! */
0 K: [! K' B6 H. N, E8 h3 O, o) A                val = *addr;
: [# _) a2 {0 b# g+ m, G8 B' N                *addr = save[--i];
4 ?4 c: _7 I: q: X# n                if (val != ~cnt) {. C: w1 E; N) ?4 j/ k5 V
                        size = cnt * sizeof (long);
% I# Z# J2 h4 T3 K* b                        /* Restore the original data before leaving the function." r- N( B2 v9 s4 Y+ F; Y
                         */
$ v0 _/ S* g$ G& K; ]8 L+ B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  g2 t' q. [8 t: g+ A. N                                addr  = base + cnt;) G$ g" z, s& m9 j+ F5 J9 T
                                *addr = save[--i];" ?, h! ?' Z- q, A
                        }
$ F4 \: V5 i( ]( ]: P                        return (size);* G' [/ ?# P" d# v9 N
                }% x% |% Q* F. E
        }9 B9 {$ X* ^9 ~' O8 S, D1 ]" f
7 L! b  |6 q8 D# d6 q& E
        return (maxsize);
' j6 Z9 P! ~8 ^}/ p/ D; S8 ^& Q2 X- M+ N3 V
int dram_init(void)% P* D8 D. ]6 r5 v9 t
{1 s; h: S/ M# }1 w
        /* dram_init must store complete ramsize in gd->ram_size */
3 |9 M, r+ @$ S" o        gd->ram_size = get_ram_size(
* u! E" b+ n0 ?                        (void *)CONFIG_SYS_SDRAM_BASE,9 U: N( S3 e3 N  i/ h1 s2 h& a
                        CONFIG_MAX_RAM_BANK_SIZE);2 |' i, Y$ s) ?) j  y7 p
        return 0;
9 u2 j6 D' X  i& z}
( k9 O' y$ r# X9 U, e4 D# H  u& U5 _% E* p1 @: d, u5 Y4 m  l

  t3 {/ l) P- i% r& c6 r+ E& o+ Q$ q) B! r  W7 j4 G' y
$ y7 O" W* v! H5 I, T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& u. ^+ e7 v, B) |5 A. V; k& v; @3 [# F# {" |* f$ X/ ?

) i6 q/ I: I; n! \8 G# H: Q
3 I1 m& D% b3 m8 U% z0 `9 Q





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