嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 Q- z) Y0 ]% w. i& O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 N1 m. j6 O4 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- X2 i3 x- D6 m' d# s8 `
5 e  b1 g1 O* g# s是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 W4 U3 `- r1 Y# z

8 N) m% \; d1 P( Q1 H8 V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  x5 Z/ Q) o9 ~" ~$ \/*
1 H8 R$ V5 K% J+ e) h% i* Check memory range for valid RAM. A simple memory test determines
: s6 k. J- Z$ g- B% g3 T" }; x* the actually available RAM size between addresses `base' and
% D2 ^7 H# b3 G& G9 B0 A$ r6 H* `base + maxsize'., M) a% D3 y4 G/ U1 a
*/
" O+ \6 h/ t0 hlong get_ram_size(long *base, long maxsize)
- X  {" R1 Q; O2 j{& ?4 m8 t! p. I, J+ A! q7 ], e
        volatile long *addr;! t# u* O; l2 o* E- |/ ]8 K
        long           save[32];2 O. u6 V6 Q- w4 [( b
        long           cnt;# Q! p7 F% @- p; ?- w
        long           val;
0 m2 `8 x5 m; O4 c% M% Q! r        long           size;. v0 S; N" T  [# W
        int            i = 0;: e% g9 J8 X1 V5 S
" B' C- G9 k+ X* Y+ s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! H& f4 s% E! s. n$ R5 q: m7 R# E                addr = base + cnt;        /* pointer arith! */
$ Q0 D: _. p  J# E' {/ F                sync ();
9 K; }: W4 K. }4 }                save[i++] = *addr;
) P1 X6 k9 w) j" c/ B) _2 R6 ^2 ^7 i                sync ();
$ k7 ?# B$ O( S6 o# ?7 [+ o5 |                *addr = ~cnt;
% x9 N! Y! W4 m/ ~$ q! {% d        }% r( J, [" R- [5 a) o6 _

& L, @+ d' X* ~- U& @# {        addr = base;
  W$ e$ ~) ^1 d" a- D4 m        sync ();5 Z( j4 z2 Q* N4 U( P+ i! ]4 n' A
        save = *addr;
3 F5 t% S. s. N' o* B5 n: ^        sync ();
- n- j* e6 ]" j# s* v/ c/ @        *addr = 0;8 Q7 M7 T  F- ~% D2 Y
: `7 g- w; Y+ _2 q* W
        sync ();/ T: \4 d( I, A
        if ((val = *addr) != 0) {
  W5 w* Y2 T' Q                /* Restore the original data before leaving the function.
! b) @: m. J) d6 V( I                 */
' S: ^+ P2 ?7 G  X9 O+ Q                sync ();
% E! _7 N# X1 H, b" R- k                *addr = save;& u. H: _4 P+ K2 c2 ]" q; i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ j5 W6 ?# M0 c
                        addr  = base + cnt;4 `, o; {" C: E: R* E) H0 g
                        sync ();
/ ^( q3 p  E4 |                        *addr = save[--i];- g8 h1 a. R: u' r
                }2 @+ h& H& R) U- f0 N0 w5 y4 G
                return (0);
$ {1 |: ^" v: L        }
7 s9 \2 b. G/ F) t! J2 }
; ~0 d' \9 {7 k) ^0 Q; F& N        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! T0 x0 n8 W6 b4 y% J, _2 Q                addr = base + cnt;        /* pointer arith! */5 ]* N' X# z2 L1 K9 V8 r
                val = *addr;
6 T/ [# W$ N, z- m! A# ~                *addr = save[--i];
# u( Y! Z/ }' I" o( \                if (val != ~cnt) {* E1 f# ^( o( k4 b) v" C
                        size = cnt * sizeof (long);
( j1 p9 V3 G$ W$ W# K2 p                        /* Restore the original data before leaving the function.5 {" T2 h5 D# }
                         */6 y+ B/ v- J! i* D) W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 K, B4 @% q" V& F  m, @0 I/ C                                addr  = base + cnt;
; h  o' Y, M; z/ W5 Z( a( s. n/ Q                                *addr = save[--i];. N0 l+ Q/ m  Z' ~$ O2 P
                        }# g- k# U6 b7 f8 c2 d
                        return (size);
) {5 C8 [& A' {1 z7 F1 L                }7 E4 ]% m/ a6 Z5 I; P
        }! U8 \- u, e2 R

# s4 u/ ~( o9 t        return (maxsize);4 c) N/ L1 I, f! L
}
  ~; `/ P& ?9 X+ y; S' B8 |- Yint dram_init(void)4 ]3 K9 ^/ L  N, h3 U
{
/ O! V# c. ^7 _1 T) c9 x/ ]        /* dram_init must store complete ramsize in gd->ram_size */
, z9 Z  `) S# p, u# l        gd->ram_size = get_ram_size(. R4 _+ o: A3 G7 ~% ^  x$ {! \
                        (void *)CONFIG_SYS_SDRAM_BASE,  S0 p+ S* k& i+ A5 Q
                        CONFIG_MAX_RAM_BANK_SIZE);/ E+ s0 U) h8 X7 R2 W5 i" }. R
        return 0;6 O9 P. U3 j6 d5 t: A6 |+ `
}
1 u; }+ h; H# v3 Z/ F  D3 I) [/ E. R& c. W
8 J3 ^8 V; {3 s7 V
4 g0 u) j4 {, a0 J4 u$ j' V; i
( Y& H& i3 J$ ~4 |5 `' ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- {: w! i. R8 B9 @8 T
5 ~& S& ~9 W$ a( B% h5 v% I% j. O' g$ e! N% o2 y
; X) }6 w. A$ @% a% k' R" y! j1 }! t





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