嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit" b8 u6 ?: K' _7 o3 d
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 p7 @0 R% c5 v$ W8 @0 [) u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 Z9 b# d* r, Q
' N* ?- A- l8 h# d. n! Y9 d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 s9 `2 B7 K* q) s: L: ]+ u, @, n

9 G  a1 v+ A. o3 j
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 g" V7 y6 z# x7 ?/*
( v; r5 f* T0 K  e: d. ]* Check memory range for valid RAM. A simple memory test determines9 K. Y0 j5 M+ B& J" M3 ^& K8 f: E
* the actually available RAM size between addresses `base' and$ q! d9 H/ Y5 x9 u. h
* `base + maxsize'.
, E( ^- x: W3 C. h* k*/
$ T; ?! f9 |  m7 U$ ?) G1 ^long get_ram_size(long *base, long maxsize)
, x7 A% i, l9 S) l* r, {! k{2 e: e9 j9 Z$ i" j9 N
        volatile long *addr;
' t) o$ @! T0 C# l6 E! D        long           save[32];# V5 a" H. D7 p7 @) \
        long           cnt;& r9 T$ s2 s/ w4 C$ V7 F
        long           val;
  Y+ b4 o/ n! i0 ~6 w# l. v        long           size;
1 `* B- y! U; [8 y; U2 |6 v& \        int            i = 0;
0 v6 B2 s: `) O; o. e8 Q$ o1 _" y  G7 {* t
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ }8 c! ?2 B8 P% L
                addr = base + cnt;        /* pointer arith! */
# |; Y$ u) ]2 K                sync ();) @! ^0 c) u. d& v! I3 T. h
                save[i++] = *addr;
" Q. h$ W- l2 N1 G& ^* i2 P                sync ();. [; \! X5 C# g8 p  |+ b4 V
                *addr = ~cnt;2 k8 m& A4 A  c2 n( D
        }8 {3 [5 O% g- M. w" b$ @1 b0 e

1 S7 T: o! r+ J) ?$ Y! t: z' ]- R4 z4 Z        addr = base;
: X# |. x5 P- E4 d; I        sync ();
+ Z6 j# ]3 f# q$ m! s! s        save = *addr;5 \4 i+ C  \6 U, z6 q
        sync ();) V" |3 n8 [3 A, G
        *addr = 0;% U/ o2 S1 G, E  c: }+ T, I) _7 i% J

% }' M0 L8 O5 \" j( w1 s7 l( x        sync ();& e: B# r) ]" o/ r# X
        if ((val = *addr) != 0) {  o- Y/ q4 r3 |! h7 W7 L) j% i
                /* Restore the original data before leaving the function.
* `5 f. |/ M- Q* I                 */6 K8 i. O/ y0 A
                sync ();
5 F1 d/ g& Q1 O# X                *addr = save;) D6 e& s" X1 K1 _+ I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- k4 [# C% l5 g" E) F" ]! X
                        addr  = base + cnt;
& i+ R. ^' O- q                        sync ();* ]* K9 k+ `2 g* M: x
                        *addr = save[--i];$ Y: ]  Y3 s! M5 Q5 L; K' @
                }( |0 D6 s; U! v# U
                return (0);" _7 M+ S& A0 Z" e9 [( ?! `5 _; S
        }
- y9 z% x/ x- _- w$ b$ ?, ^( g; E6 \" z- B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 I% F3 C2 D! y, D* J. w                addr = base + cnt;        /* pointer arith! */3 q  j* `. E  {% }/ c* D
                val = *addr;
  H, w7 Q' j! C& }0 Q$ c                *addr = save[--i];
/ e# H# ~3 p! }: C! A* d' H                if (val != ~cnt) {
, S( v. W6 ^" q/ B$ Q6 r+ \                        size = cnt * sizeof (long);
& u8 v- Q# T% b8 R: u# m: |                        /* Restore the original data before leaving the function.
) W; A  D+ v4 n* `                         */
" Q4 @: S+ d( }& U6 f8 T' E" ^- j  G                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 [) K1 \2 Z! Q& Y' p' p, A# E                                addr  = base + cnt;
& ]2 F( L0 ]4 V# w$ N                                *addr = save[--i];
2 [; k/ R' p9 z1 `" `7 I                        }
7 F: d& Z" ~( Q                        return (size);4 C& e7 [2 m# o: A
                }
9 {( G* `$ W9 X. R$ G5 Y) Z2 O        }8 }$ S6 s) T2 \7 p

! A- K: ]$ v# P: @% k        return (maxsize);( \& @% C) _& Q5 O
}
$ R( @2 k* r- w0 iint dram_init(void). z) S) X: z6 D9 R0 j- P
{
+ W& M+ v+ |' \, N- S        /* dram_init must store complete ramsize in gd->ram_size */
: x: P' R4 J. W4 ~) Y" f        gd->ram_size = get_ram_size(
3 [, Y9 ~( ~/ I                        (void *)CONFIG_SYS_SDRAM_BASE,) k, G& ^+ G: @, H% ~+ I
                        CONFIG_MAX_RAM_BANK_SIZE);1 D% U- X' R! z/ \) K+ i& z
        return 0;
8 T' A4 ^: j$ E5 ]4 J}
8 M$ \& \! u* {* `  `0 j9 v$ R; `7 y- M# j  |. W$ k
. f3 a/ v) E% U5 o# s6 t4 K1 E" R
. ?/ j2 O) Q$ z- M  R  W
6 Z& B0 M8 I, b" |( g4 g  Z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' E5 Z! z+ U# {2 O% a/ O
0 a$ U, l1 W8 p( U* \

8 j/ Y0 Z" \& ?- Q" V3 x! {
$ p# W+ f# H" N; f/ U, ?: }





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