嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& B- r% P. {( E$ X核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 y6 |2 ]% Q7 O% [' @2 H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 g, U* T2 n- E. f) _$ m' e  c+ m% o3 Y, m8 c9 H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. c4 c- a& R+ \5 H, I  x0 ?- L1 n# Z) Q$ ^' c+ r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 Q6 y1 Q" h0 p' N& e0 ^! ]1 T6 B/*
( L! i) i7 Y; s' ]: N( O* Check memory range for valid RAM. A simple memory test determines
# D: k9 V! q- D, C- x* the actually available RAM size between addresses `base' and- n3 ]8 ]" g) d* v0 B; B( n
* `base + maxsize'.& {/ {# b: ?- q9 c; h3 v4 _
*/* b6 \$ p5 k6 s. w# t+ b4 X
long get_ram_size(long *base, long maxsize)- U# Z# Q" }( ]: z5 K1 b: _# b
{
* [9 T& \% l' w        volatile long *addr;
% p  v- j. K8 s4 K7 [6 v        long           save[32];; l: G0 ^# a3 G2 W
        long           cnt;( {  S! i5 L+ |
        long           val;
# B3 E5 c7 I6 V0 |# T' L& t        long           size;
: u5 F$ n/ x" _- T0 w        int            i = 0;0 m1 T  _* [$ @
: _0 F& y/ y) m8 u4 M. [3 S# Q  H
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 u8 A, L0 e/ C. m. @! c" M                addr = base + cnt;        /* pointer arith! */
, U9 v2 q, M4 M                sync ();
$ U+ h% g! \# L, G  b' N6 j  B" H" v                save[i++] = *addr;
1 k1 d& l: m+ k( y8 }                sync ();- H/ f# {) R7 E6 Y9 P& Z
                *addr = ~cnt;
) n& t5 T& f+ c6 |% I2 G" [8 T; J        }# D0 k1 d- B5 Z) [
1 C  P: G7 V: e4 u: a. R* \( E
        addr = base;, b6 I( Y1 N% _* c
        sync ();
1 L9 H8 E$ y# D' i. c% D* B( N        save = *addr;
0 ?0 [. ~4 Y  s0 C  l. p        sync ();6 e; F# j$ p& I# A6 D! `' @
        *addr = 0;
* N- U  d9 o8 k% B* `- ^, F( ]7 ~; K; K8 `$ E. r
        sync ();" c. }9 O$ [' B$ f1 ?7 h
        if ((val = *addr) != 0) {8 u6 M- I0 f% l  ]
                /* Restore the original data before leaving the function.
$ Y' G1 B6 B+ D& H0 }9 S                 */
; w6 u' Z, P# q: j) A# c/ ^                sync ();
% t$ V# m1 @4 K0 {- g+ I% k! a                *addr = save;
- e2 Y  D% U/ F9 T3 Z! f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 k, V/ c8 Z8 j                        addr  = base + cnt;
! Q1 I) B! |) \3 k                        sync ();
& v0 }" C2 ~. A5 Z$ [9 L                        *addr = save[--i];
9 ]: ]; b& a& V2 ^$ `                }. X+ d+ n! ?8 M
                return (0);" b! H/ S0 h/ k
        }
* f4 v& p" X& N* \0 F# f4 i" `4 ^4 ?$ ^+ l9 b1 ~: ?  i# l4 {, j
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; K3 r' ], L% c0 E% E4 B                addr = base + cnt;        /* pointer arith! */
* r8 l, a( A, i                val = *addr;, t7 F1 }8 S; m& g
                *addr = save[--i];3 X; w+ u- Q" L9 r
                if (val != ~cnt) {( R* `* D3 U$ p. K
                        size = cnt * sizeof (long);
: k1 M1 H  c% C, o; x                        /* Restore the original data before leaving the function.: i# O; j9 U, y" H* J8 @+ y( @: J3 y
                         */
& u9 g2 X6 X0 K, q/ _4 K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* B2 T; e( f4 F  X4 |
                                addr  = base + cnt;
" g) h( ?2 S5 W& z                                *addr = save[--i];  V% ?$ A% K& t9 Q) o
                        }
% S4 u9 `- ]6 Q  L                        return (size);0 {( V" }4 p9 U5 R3 ?
                }5 B( E; ]( S" \/ Z
        }
3 k! [3 Z9 z% q( D5 {) ]' @7 l+ T, q: I5 y  v  A4 Z
        return (maxsize);
/ Z, {2 U9 K( E}; P! E. i4 j7 z0 Z
int dram_init(void)
/ g- G; j; _* u3 A: z2 `& Z{- }7 f" ]! p" B1 x9 p0 R1 ?
        /* dram_init must store complete ramsize in gd->ram_size */, S$ R/ E( Q4 K/ k1 N+ ~- j
        gd->ram_size = get_ram_size(
5 N7 h* _# p3 k( N: A                        (void *)CONFIG_SYS_SDRAM_BASE,8 [8 A6 V; \% W* Q4 F) j% w9 l* X
                        CONFIG_MAX_RAM_BANK_SIZE);3 y& D; D8 [: t: o1 D( S
        return 0;2 Y$ [- J+ l2 E* Q; f) M2 z3 c0 n
}# \3 N! b" U- |5 v

6 \1 R  `" X# ]6 {* L3 c0 X% c& \. d/ k/ c, g

& ]# [" {- P/ p
3 K8 c" W1 _/ M6 v/ zFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% u* J& j3 x% v% t6 W/ l) s# ?* }. q: P; ?
+ R/ \# ^$ T  |  X
0 X: M! F# w9 D% w





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