嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 \3 {" b4 }' a: L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit& z! R, f% W+ c3 I; f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* r) {9 S& K3 D$ {/ ^
! e2 Y/ G9 W. @' g: E2 I* Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! {# d9 V6 D. w1 P

6 ]8 W$ B. I6 P8 Z! A6 J. r
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  ]( V7 O0 w( M- A6 Z; y5 f
/*
5 ]: c3 e6 h9 S- n& S* Check memory range for valid RAM. A simple memory test determines* K1 R9 l- B! E6 |5 |
* the actually available RAM size between addresses `base' and
; O: P0 m4 b6 q* `base + maxsize'.1 d7 C" h& S) L* v5 i
*/
' Q, [' z1 V' elong get_ram_size(long *base, long maxsize)( q: N6 L# w: F8 L1 U- ], h
{
- X/ ^$ ]& ~" w        volatile long *addr;- g8 i' F, U" i5 D2 [8 N; E! C
        long           save[32];
1 a$ o, Q9 V- ^% g        long           cnt;% c& x; \5 q1 S8 u1 ]
        long           val;
9 h$ n! }' h$ |5 j7 O        long           size;
8 p1 u2 s) b& C0 l        int            i = 0;
# l1 N  R" ?) }) k
1 y9 e0 [+ O) {; V* ^) c7 E: `6 Q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( j: P5 K$ z$ K& Q" R6 G                addr = base + cnt;        /* pointer arith! */
; A4 F" x8 H- }8 \                sync ();
- V4 w- X) w& W                save[i++] = *addr;
- g2 X4 a# y* y5 L4 x8 a6 a                sync ();
- [8 e' T; B) B( K) m! b& ?' h                *addr = ~cnt;9 I+ ~/ f9 M1 u/ a
        }8 y" g3 T! N5 ]5 e
( s- k. C  l$ {8 u) Z7 y
        addr = base;( \  H6 {: ?* a; b
        sync ();
! [* g; R; T9 u# ~, K/ v' m        save = *addr;
. D' p; p+ G+ m2 e0 o        sync ();
% M& a. Q! K: D: b- E1 @        *addr = 0;
1 ~8 j4 K8 K+ }
% _  s" O" k; D+ e        sync ();3 B, ?' e+ y7 R0 J6 N2 B) I+ d
        if ((val = *addr) != 0) {  U" l6 y* k2 g
                /* Restore the original data before leaving the function.
9 U3 f  i) N; ~; f5 }                 */) L( g7 r9 X( C" A" g4 D
                sync ();
+ e2 B+ _* x( O& J- _                *addr = save;
: B8 a+ ~% K5 R! ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( s3 B. e; |3 g3 v7 r- ^                        addr  = base + cnt;8 L) O6 j* o2 f4 W4 v/ |9 w
                        sync ();
1 a1 X+ G  @9 e( G5 p                        *addr = save[--i];
; Q) K" ^; Q3 C9 A" H5 u/ y                }* \  ~  G2 j" m1 _" C' {. K
                return (0);6 M/ h" v& \8 _6 r$ a3 \0 Z
        }
7 N) o, w6 f" i4 b8 E, J2 T
. H7 e4 o+ I. W- u/ F- u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 C4 S  m* V4 N8 f" M                addr = base + cnt;        /* pointer arith! *// s6 C+ f# `/ d0 V7 O
                val = *addr;. H, N* h) b7 ~, k) f: p4 [! L
                *addr = save[--i];
; [' q2 q. X* f3 j                if (val != ~cnt) {" k+ F+ C6 c1 p8 o8 U9 [1 J
                        size = cnt * sizeof (long);9 K+ H2 ?2 A+ X) V1 |
                        /* Restore the original data before leaving the function.
' B! \/ k5 H/ k7 t6 |                         */
0 M. Z# l$ B+ D9 E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 k& W2 e3 S/ ~/ L( `; }( @
                                addr  = base + cnt;
$ i6 C$ V! k: g* S                                *addr = save[--i];; a  L* m: `% Z( ~. l
                        }
1 v  M- L" ~! R( N# ?7 h/ {. p                        return (size);6 V1 U& B7 L* p* U, |, P+ ?6 O! b$ e
                }
* M8 Z( `# i" j1 d9 h        }! H3 ~- h6 J# t0 I% d) N- R

9 H6 E! u/ [( d  Q- F/ n+ h        return (maxsize);
3 w5 `; x, t/ m( P& T% V1 z}7 k- N: l- S0 O& d2 r/ v% ]$ P
int dram_init(void)
- r, Z1 ?. B8 Y+ R0 i{
8 H: ]" I- b6 U# ^, e# E        /* dram_init must store complete ramsize in gd->ram_size *// T! {$ b# M0 G- C
        gd->ram_size = get_ram_size(
% L5 {1 s6 `( Q$ c                        (void *)CONFIG_SYS_SDRAM_BASE,
0 p+ c8 L, g5 O4 Z$ o( Q7 [% t                        CONFIG_MAX_RAM_BANK_SIZE);
$ Q8 T: Q! n% f5 W* M: _8 ]        return 0;( Z% P1 |0 E2 P$ v3 N/ Q2 b, f: X
}8 B2 e, [2 p' x  c/ m
9 {0 ~. {  D! ^. l; l! s8 [
8 F( ^7 g0 T9 X# }$ I

# Y: X. F/ P7 ]& C9 Z8 c- m  |& I( M: |' g9 i: o/ P1 {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 F3 ~' n: P3 {7 B. X9 g

  D  R* J8 ?& I" O1 z9 f& u5 e8 c- @% N/ M6 z# J* c7 Y
0 S! E: o3 g% U" O+ w- p; H5 `& O





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