嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' P% z( a' Y6 Q3 c0 m6 C
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. b2 w2 a1 {. B5 }) M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( Q1 R5 ?7 J8 i4 u
# ^* T: B* q/ H( c. B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ E; E, \0 u% t* [' _! }. p

3 D8 Q5 z% S0 R. d. |, x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) Q: A0 B0 _" e/ e7 _) L/*
! l! L$ t* U8 W# r7 u* Check memory range for valid RAM. A simple memory test determines+ n: k7 k- v& R+ A' _0 S" C
* the actually available RAM size between addresses `base' and& x& |$ ]% I& c/ i2 ^* q
* `base + maxsize'.+ V6 Q- B4 B3 J& p8 b7 Q2 o/ Q
*/3 w, a& [. ~$ m! w" P1 _
long get_ram_size(long *base, long maxsize)
% o& S) R7 g1 b( H& a0 g# J7 C{" g8 H; q0 T) O3 ?
        volatile long *addr;
+ r9 y& u7 B! V+ ]3 C  F        long           save[32];
; S5 H/ b3 M; s) b. ~! C        long           cnt;0 P& ?; y' c" X+ s' {( U; Y, v
        long           val;
% v# P+ ^( K4 U3 S+ g        long           size;
4 x* j0 X! w+ c( ^, }( x        int            i = 0;& X+ M1 Z0 V( k& l
3 t* Y. T, o/ s1 [2 ?& J
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 B) D. O) N: M& W3 n) W- [8 r
                addr = base + cnt;        /* pointer arith! */, d% i" S. D) ~
                sync ();
; p9 f8 t! C2 J: Y0 L                save[i++] = *addr;( O& ~2 I! e1 w3 |/ f: _
                sync ();
+ q' Q; Z3 b/ u5 q3 }+ B$ j                *addr = ~cnt;, Z/ `$ C7 U% C4 o+ G: P- L+ G
        }& J$ `/ ~' M8 x0 I5 E0 C. g: o* C
& C0 w1 ]1 G& j+ d8 u4 M
        addr = base;
; c/ o) K( e& g( q$ ^9 V' b$ x- g        sync ();% I8 P+ U% P! M3 G% g9 Y
        save = *addr;
$ J1 A( u* F- b  D, d4 Z' O        sync ();
, ?3 H- p( ?6 B. }% \  v# h        *addr = 0;; a3 [; O' D- ~, J/ s- P6 n

: b3 `# I$ e6 F* X        sync ();. W' o1 j# k; S' R% g
        if ((val = *addr) != 0) {
& R  B1 R4 I6 D5 I2 Z/ ?& \                /* Restore the original data before leaving the function.
7 o* J) u1 o6 n( |. `& w0 A% i                 */9 d  R3 L8 j3 V/ w: \# k7 B2 L
                sync ();0 B. Y0 f& S& y) P* P
                *addr = save;- B4 }5 W! I4 `  I# t9 b4 b. v
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) N( n; q. S* u* c1 l* p
                        addr  = base + cnt;/ u. ]( c; v( W" ]: v0 C" Z& Q
                        sync ();8 s% J; |. {1 T0 v: c
                        *addr = save[--i];
% h# s* {; T- L3 E* }0 b                }
7 j, y) Z) Q9 b/ M( B  b                return (0);0 r) g- j) ?' T" E
        }3 |! J5 a! l. O" v1 M+ a

: Q$ N9 l) b5 h5 s5 \4 y0 m        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ x# G' @, E: K& B  Z
                addr = base + cnt;        /* pointer arith! */) K- {; q6 v- B: ]. R
                val = *addr;7 F3 ^( m, ^( }" d/ N
                *addr = save[--i];" c- @8 [) _0 l- R
                if (val != ~cnt) {+ H& L/ D4 }# C$ F3 e
                        size = cnt * sizeof (long);
$ o4 m7 F6 J. E; L" _                        /* Restore the original data before leaving the function.0 Y; `; F& Y7 a) }* s
                         */5 Z2 y, v4 [  j2 G: w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! W. z  ^  }: ]6 \
                                addr  = base + cnt;8 w! ~" d+ N: p/ s3 m% f9 i
                                *addr = save[--i];
6 D- @4 ^4 k  s) _/ Q                        }
( X& a4 a$ B  z* y! ~" g2 E                        return (size);
  c0 o, S. A( y- l                }
- a" D8 }! Y) V1 D5 o+ J        }
: t1 o9 r+ V' v0 y: Y0 r7 ]/ I! A' Z' n4 T3 u& Q( i
        return (maxsize);
+ E- ^9 x. |( P2 {3 Q0 y* J7 i}
& m" ?) s8 o5 b* wint dram_init(void)7 h* ]1 b0 [1 \/ }$ B# d3 D
{" u+ C5 E, `3 k4 i4 A$ ^
        /* dram_init must store complete ramsize in gd->ram_size */
8 l) c0 J, H& X8 v$ Z" z        gd->ram_size = get_ram_size(  q& z. I# y% @6 n' ?" m
                        (void *)CONFIG_SYS_SDRAM_BASE,3 l' o' U8 ~  d6 P& W% }6 j4 Q5 G
                        CONFIG_MAX_RAM_BANK_SIZE);
, Y5 c9 A3 L  }0 n        return 0;
. F, b7 Y+ ], Z$ z( z) [}; U$ F, O/ S: x" Y+ ?: V: J
3 a$ R) }6 o1 @* E( y( q7 o

5 M: ^& b% R* E# `' e% k6 T) V( b( q
- T! j( Z6 M5 [) {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 c2 g. x! o" z) i+ T" T7 A/ x4 W9 }* t7 P/ G

, q, d+ u2 w7 H8 @

* z& D# F; w' X




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