嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 W0 Y' b' S% x+ x1 X: D5 O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* z$ q1 `" l  O  A# ~+ u$ V* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 x1 a3 `! O5 l) F1 H

7 j, W9 b/ z) U/ u是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* I8 B* y, _4 L6 ~2 g4 j9 T* v2 J) U" d2 B8 h# ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, e+ O9 u* D1 {* Y4 z0 c
/*. l7 I/ L. b# l+ [4 D2 _" n% a; {3 U
* Check memory range for valid RAM. A simple memory test determines( m; [6 O& K. ?" ]- m. ~; Z
* the actually available RAM size between addresses `base' and
  X- q3 z9 w( V0 A& z! B* `base + maxsize'.& B' y) r# E5 w9 L9 c! ]4 y
*/
8 ^" B, A* a$ @" F  J: [long get_ram_size(long *base, long maxsize)
; z$ ?% B1 t3 t1 v1 ]' e{
6 T) t7 A: p6 M) C% A, M) j        volatile long *addr;
& p" l2 H- A' l+ h9 u3 S  K        long           save[32];
2 G& G' H/ o# j+ a- G  v7 b        long           cnt;! }" S$ k1 q/ i
        long           val;
' I) \% T/ r6 m: o9 G) z& w        long           size;% _) ?: a  |) |' c3 [' B
        int            i = 0;( ^2 B' h0 R8 d

/ P7 U% y1 F8 w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, |0 i4 H! @3 \5 l/ {5 H                addr = base + cnt;        /* pointer arith! */
# Q1 [+ c: t" s- ^# r7 `                sync ();9 F: o2 T3 \  O; U3 H1 f. Q
                save[i++] = *addr;6 g- c% _% {& I: z5 ]1 w$ ?/ y
                sync ();
# j8 T. `" h3 J/ p0 T; [                *addr = ~cnt;
9 S/ O/ f8 W' L        }8 k3 U% ~9 {9 ~5 I& a+ J
# W  C* c& ]6 t. s( W
        addr = base;9 `: T! g  p' u% `) |
        sync ();
! g7 `5 m! i& t        save = *addr;; d0 K  C% @2 g0 u0 Q# v4 `
        sync ();% Z: d. L3 |( \% P8 y/ z- A! g* }
        *addr = 0;6 t; ^7 C8 @1 k' v# p, l. Z

. n$ R. ]4 G: w; E' C        sync ();4 r+ H& r& w; O
        if ((val = *addr) != 0) {
! }# j/ \: `' W" w9 u                /* Restore the original data before leaving the function.
( m7 _! Z8 t- h2 U8 L/ m                 */
5 w6 x0 \- |9 T, C- F                sync ();; D9 F% Z& a6 c& z" A: N* r
                *addr = save;% t. h4 x: C. [+ `) F. N8 r3 z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ {: ?( R: b/ p: Q9 J. @                        addr  = base + cnt;
' a: E. X3 `; D( B                        sync ();
7 u! k, g+ y8 i8 f. Q( P% Y                        *addr = save[--i];2 l' `5 u& B$ w6 _
                }
$ V% _% H6 n( h4 H                return (0);5 b: V& ~( J1 f4 d, W
        }
) g: u" L7 N$ c" I/ |; T; s9 x8 H, u6 j/ L0 q+ x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 }; V' H4 y( N' x6 C% h
                addr = base + cnt;        /* pointer arith! */
$ d. V9 f0 S! y5 E& ~                val = *addr;
: R5 w9 \0 {7 ]& `+ f& T9 z& f4 _                *addr = save[--i];) `/ a" n) A. N$ W0 ?
                if (val != ~cnt) {
, N; z5 e  _  ?: J% t1 {+ y                        size = cnt * sizeof (long);
1 B  x6 q9 _. J+ ?9 Q                        /* Restore the original data before leaving the function.% j" K4 N+ }# ~% {' j3 f& f" k
                         */9 [9 g" F9 q/ R" N2 }' b5 ^! Y5 h
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) s0 a! D9 p' d5 V
                                addr  = base + cnt;) X* s$ F/ s9 W
                                *addr = save[--i];% j3 C  |0 S% o# Y  W2 a
                        }  \! g0 `7 u% Z& @" s
                        return (size);9 Z) n8 J5 Q2 k
                }
: G2 D% w3 O7 h% W. y. ^0 l        }
3 c: Y' N8 \$ B6 s$ D" {" X7 ?
  e- p) i: l5 _% }! U2 `1 k        return (maxsize);& d# {7 b$ F8 p; f, R: [, r
}
$ ^% ~$ |* g6 Cint dram_init(void)7 J8 c( T( H; r3 K% j/ s  }0 x: w& ^
{% c& r2 ~, b. J1 }+ O6 U; i
        /* dram_init must store complete ramsize in gd->ram_size */
/ w1 U2 ^9 k2 |( M0 \  V1 x2 O        gd->ram_size = get_ram_size(# i$ L1 _: `9 C" U" u1 {- c& m
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 U" ^2 U2 \6 y/ h% s9 [; E3 i                        CONFIG_MAX_RAM_BANK_SIZE);
0 T, Z  p9 Q7 f9 Q9 S        return 0;& `, k- e8 w4 Y& Q7 Z, R& K9 U# ]( s
}5 O8 a, L+ C$ V& I! X

; \& ~/ W" D, t* l6 v) U* E
9 r$ Z& F; x. X" r! f  z) P& m
: S% E* ^# U& g1 T% Y+ z- J2 j- ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 y( d' c) m" A& i" Z5 `

: ~' T% r& B' f0 o/ j
3 _1 ]5 b7 Q" l

- f6 v! P- V% z. @( r* f




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