嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 ~2 I0 h* H% w/ g' I' F. q4 e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 t4 V7 N3 Z* `" A" H8 R
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 s' I# Z/ m2 t; b! z' B  A% E9 G/ J" v1 `4 o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; R( f5 ?7 X3 L. g  F" r7 W% ]  j/ _: ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; p) r3 B3 ?$ v# V+ H- B0 u  J. K  y
/*; @2 {. @( K3 g) w+ S& V
* Check memory range for valid RAM. A simple memory test determines
& ^. x; a3 k, @: D( j- G* the actually available RAM size between addresses `base' and) E+ ?5 P2 P4 d! a1 k
* `base + maxsize'.
( o6 I* [4 s+ @4 T*/) z4 I* f* ^/ X& J
long get_ram_size(long *base, long maxsize). ?; ~3 s) R4 }. I0 D; `9 [
{% p6 P* p8 ]' K( k
        volatile long *addr;
2 `5 c4 T1 l0 l1 H; ^! I        long           save[32];
' @% j4 L8 N+ V% Y. c        long           cnt;" g' k" z4 x3 N1 X5 {
        long           val;" L; I# @1 e. i' X- h" s
        long           size;1 B+ B* b$ s3 h9 ~. t& |- V, m
        int            i = 0;! r0 m. U9 s2 d( n" m" o# O1 T& F

8 u4 k7 t3 G* C( N, u( G1 S        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 X( b7 s* b. g2 i                addr = base + cnt;        /* pointer arith! */
' G3 ]8 N; q+ v0 @% {& s                sync ();
/ h- P! Z$ L2 o# V                save[i++] = *addr;4 k1 t- f) }- O1 t" ^' T3 [/ P
                sync ();
. k! F" U$ F7 {                *addr = ~cnt;9 l. H$ ~. L1 T" ^) }8 C
        }
$ p/ c/ J2 L" R" e
9 x# `! o7 ^4 c5 ]5 W        addr = base;
3 L& W. ?5 x% p        sync ();
: q' K, F8 x5 E: I( V4 A# c: x4 P        save = *addr;. W' w$ x  a1 @6 P3 F$ P3 z
        sync ();  K& O9 c7 K. G: h8 ]
        *addr = 0;2 k: R- Q* C6 ]1 |, {1 e
, b- @& v" R$ c
        sync ();: K, Y6 L" f- R* o0 e
        if ((val = *addr) != 0) {5 V1 \( {& }: z
                /* Restore the original data before leaving the function.
) b9 x* n  L; D. m4 T# `. E) ]                 */+ U( q& O; A* F2 X6 [0 U9 s: u/ k  ~
                sync ();0 g3 B/ b0 R+ J4 D) R& U
                *addr = save;, a+ F8 y9 q8 B" V: m/ q8 b* ?  z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, `4 t  Y- z' m7 a; a% r# K, R0 M
                        addr  = base + cnt;8 |% \4 z# a' W4 V
                        sync ();
8 E% X: x1 I5 `2 C. n* X                        *addr = save[--i];
7 C2 p& l) ~/ e9 x                }* ?0 N$ y+ l2 \# b
                return (0);1 \$ \+ m) Y# ^6 L0 Y; V0 @0 e+ c5 y8 H
        }% l3 @5 U" u5 u& {

0 l+ |' z2 E* R7 O, \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 I( m, m. J) R$ o* @6 ^                addr = base + cnt;        /* pointer arith! */$ C* c& h" U8 k1 s( ~
                val = *addr;' [7 X1 u' [, Q5 F6 y/ P0 @8 i0 j
                *addr = save[--i];
9 r9 W7 h0 z( w6 T) g                if (val != ~cnt) {
# L% g5 F+ E& m                        size = cnt * sizeof (long);
: X6 Z4 ^, N7 W. I) w6 v                        /* Restore the original data before leaving the function.
/ E6 I* x: C% ?: K8 w                         */$ x: z5 R: l* [5 t4 `
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( b6 o4 N; E8 U( F) m* X                                addr  = base + cnt;* k, y3 p4 p7 G# ^/ }- H4 o$ s2 i
                                *addr = save[--i];
5 O8 p( s8 u$ ]                        }0 V$ D; ]3 k9 }+ u4 n0 ?6 |
                        return (size);
4 P2 _$ Y, Q+ G' R* }                }
; @% C5 v2 F1 ?. Q4 f; L5 D; ?2 Y$ d3 X        }0 g0 S! H+ L& ?8 ~1 x7 n% O, C

5 N/ e4 D8 d/ [& o2 ~& H. `+ @4 a0 F3 E0 O        return (maxsize);
7 B( k: s* t7 Q7 t& U}
2 x3 k! y4 z6 @7 j' c! ^int dram_init(void)" I) E9 \, U5 d8 M: ?1 }# h' e
{
8 X6 Q' U3 y7 X2 r        /* dram_init must store complete ramsize in gd->ram_size */
  H  ^: l8 H+ N        gd->ram_size = get_ram_size(# S  F8 p2 ]0 }9 c
                        (void *)CONFIG_SYS_SDRAM_BASE,2 m0 P: X0 o- C  N/ C
                        CONFIG_MAX_RAM_BANK_SIZE);
6 U& V; H' G/ v        return 0;
& p$ L! J  R# G}* `9 b0 S1 z/ N; P! X9 ]) Z+ S

4 \# p$ ^5 J0 Q: h
  [! ?5 l8 e( ^$ p" ~, w9 h2 h) b3 u2 v* `5 c8 `6 t7 h# ~
- W8 }5 B2 T( R  }  z2 `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 T( v( C( D$ r' P, U- h

" {2 @6 L! f& o# X% S# K
0 Q- m+ G" k3 i* m- K2 f
4 ^1 ?# _) Y0 n( E! b( E





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