嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) m# d. H/ K4 d4 ~) V) k+ k! {. {- Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& _/ i$ N' V9 k这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ H  l3 Z! H7 z9 c& s

9 T  l; p  Y8 ?, D* ^0 H3 P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( h& L, k# U( }0 x$ j
, q( k, X0 h4 N! k8 P' B+ @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 g0 i/ k- {1 R7 o5 E( N/*
0 |/ w( Q/ g0 T5 }. p8 A9 F, y: y* Check memory range for valid RAM. A simple memory test determines: [/ i9 |' ?( D7 F* r
* the actually available RAM size between addresses `base' and
' V( ]4 _/ y& U) T) s* `base + maxsize'.% X# l  e  q: a* {! c
*/. x4 [$ O9 y& h  [9 H
long get_ram_size(long *base, long maxsize)
0 n, `) a* ~) c3 g% N8 T  D{* _" D8 o# L* G& r3 R
        volatile long *addr;  l1 Y$ ]% t3 T# z$ k* n* n+ X
        long           save[32];
- @- b$ W# I! m        long           cnt;, M+ b  w4 @7 s
        long           val;4 L4 Z  J. U$ }- k; I
        long           size;
/ M* g( i& A% n" e, ?# A        int            i = 0;4 ?# W# d* e0 O( a- A- J! V3 Z

9 V4 n+ J( a5 F; N        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  U* q/ [# j2 H3 I( d8 J- S" o) N                addr = base + cnt;        /* pointer arith! */
! }" z" z: d. N" p                sync ();
3 ?! O8 z3 p# n0 r" Z                save[i++] = *addr;! Y/ t( C; ^& _; E6 C  p3 V
                sync ();4 W0 a1 f9 u- O# x/ S" R# E
                *addr = ~cnt;
: x* a# t0 P! W9 i6 `5 [# |" G9 @  P/ [        }
3 l$ C; [7 f: d8 l
+ S  T) z; _4 M$ `% c& j& o$ R8 |        addr = base;! `) W+ f; _7 F" C2 v
        sync ();6 D1 h- R  S9 c' Z
        save = *addr;' r% I* G& I( I, k' {2 W& m
        sync ();! I6 A: G0 S4 z8 X) I) \+ S* W
        *addr = 0;
' v( B3 O# R9 |, u( e: ^6 k8 G) K' A" M3 r3 I- G* y
        sync ();
* ~7 ~. K6 V9 D5 q        if ((val = *addr) != 0) {7 K! u3 d! h3 J% G% m3 o
                /* Restore the original data before leaving the function.5 q6 u# }# G+ _
                 */3 X) {' q1 [4 m- f7 q9 ]. ?0 p
                sync ();
) K' g# e& O& t4 i. c                *addr = save;
8 q: j: X  P" W: o& H  O: j0 _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" x. B& \8 G+ F. r
                        addr  = base + cnt;
( _2 u; e8 j- O4 N' w3 P& x                        sync ();" M* o8 u8 p- A9 k
                        *addr = save[--i];- Z' ]8 H3 [# B' V  I5 Z4 m
                }3 t- _. g2 \6 r
                return (0);
* n+ q9 b8 a. M* q7 I5 J        }
' y8 U; _6 Y! ^- J" `8 e5 m! L1 `. a* w! \& [
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; h) i/ w2 Q0 a0 `2 J+ v9 ^
                addr = base + cnt;        /* pointer arith! */+ C8 t- X. h2 f
                val = *addr;
# U* L4 g' [8 }$ s" |3 p; C                *addr = save[--i];+ Y1 V# R$ J) K+ d
                if (val != ~cnt) {
3 F4 k. N& F& I/ _5 M                        size = cnt * sizeof (long);1 S; U4 M  i; i& k1 U6 k! m: U
                        /* Restore the original data before leaving the function.% Q( p+ x$ G4 |$ b- h- z
                         */* [+ [* L/ r+ U2 I+ w# B
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 i% S, V( `# M6 u1 D3 I; `
                                addr  = base + cnt;; T0 L( E* n6 d' H2 A! I- S, n, N
                                *addr = save[--i];4 X* ]2 Y. O% f
                        }
: u: w9 J( g4 x; Y0 V                        return (size);& a  u) ~: P$ g: i
                }( Y; ~5 r" c& ]; v! l
        }
) `. J" M1 x3 |  X* {8 c& E8 A" t
3 {, x0 C2 a, o0 n        return (maxsize);9 Y  s7 c8 a4 K
}  G# N1 m2 K1 n, a# N" B
int dram_init(void)# K" v% O( K! r; G* c
{+ Z0 U! I9 l1 P8 v
        /* dram_init must store complete ramsize in gd->ram_size */
0 k) O& b) N. r' I8 R8 C( z- d  _        gd->ram_size = get_ram_size(
$ _. y% x1 y3 J( z" V$ V5 w3 M9 |) q                        (void *)CONFIG_SYS_SDRAM_BASE," n' t7 k& R9 L3 b4 r- m
                        CONFIG_MAX_RAM_BANK_SIZE);
/ J+ e( M8 x" @5 b3 S" O# x        return 0;! X3 w: x& x+ P2 D' z. q
}, u7 i; `4 }& c/ p# R: N3 a' I# T+ [
, j8 r% K4 B5 M, y$ Z! L
' G: {; J9 X! I. n0 c: R
; H- d6 z: y) {$ N

; n0 s4 @+ @/ O- fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 d; ?( ?: Y. S. A( t3 y( e: i. y
; }$ l5 f1 k9 z. p9 R  z' C* o
7 q& Y) y9 z3 Q: _) y# R8 n
. k" H$ n6 e2 @





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