嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 ^& W" @! B; I, G. r0 Y3 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& i9 B4 c- Y) o- K4 ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! u0 N0 B% B* X4 w* t1 p% U& h" N! f3 ]. `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& q' }/ D# R, V1 p1 V
$ V7 v$ C; ~- B9 s2 w/ D
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  X: e; }" r8 q3 s1 d8 q
/*5 E0 N5 m: s9 l+ p
* Check memory range for valid RAM. A simple memory test determines
3 Q1 Z4 `- K2 U7 K: H, e* the actually available RAM size between addresses `base' and$ `/ e( o  H+ \9 A0 R! ^, L, z
* `base + maxsize'.3 C* U% i. v+ Y' r
*/& l+ ~$ e- k  z$ \
long get_ram_size(long *base, long maxsize)
  l6 W/ d  [) c3 E{" M- S8 q4 v1 i0 g
        volatile long *addr;
( f' [; ~- E3 F        long           save[32];
7 C; Q% U8 r5 ]* Y4 p: x. K        long           cnt;
! _- ~8 z1 O6 X: o) K! n        long           val;3 A) `5 {, ]7 ~7 @
        long           size;
& X. N- e* f. J4 o8 Z        int            i = 0;2 N9 f# b; T& D& k5 [: P

; B# }" p# g+ Q" T1 Q/ @9 W" g7 ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ `" N5 X: {) x( y                addr = base + cnt;        /* pointer arith! */
1 u, L* z. x' V3 C, E                sync ();8 s; |6 O( X/ D9 d% E
                save[i++] = *addr;8 I8 H1 K* p' Q9 M3 `! ~, }- B4 H
                sync ();
) l( \) m) r1 h. `- Q1 v. m' d: }                *addr = ~cnt;
! J) x( n2 c! e  B0 A        }
# x3 v3 a, f) _! ]5 W8 c  z4 _! b5 Z
        addr = base;
6 C/ m2 w' c7 R- {) R# r( o% d        sync ();: G4 Z7 l1 _8 L4 b$ T) Z
        save = *addr;
' p+ w. d6 @9 z- @1 p        sync ();
5 C7 F  R, {6 A* {' [        *addr = 0;0 L6 ]- u) b7 V/ ~

. u" i" R, a0 C7 R, f        sync ();. f. V+ h( b$ w& Z* ~$ D+ G- A
        if ((val = *addr) != 0) {
1 v5 Z! z  n4 k. v) }5 P                /* Restore the original data before leaving the function.
4 k1 Y9 r% C$ v6 X4 y+ A                 */+ O7 h, f4 v, v7 n# I
                sync ();
2 B$ i8 g+ |2 s7 H  L# U0 f                *addr = save;9 g1 z, `+ ^4 b0 z3 V% `+ K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% m# p& Y4 l1 X$ t                        addr  = base + cnt;
' q/ ]+ W! ~6 ^1 a2 L" D) v4 k) n1 }$ c                        sync ();
1 \3 n; f" _9 T# o% `                        *addr = save[--i];- A6 N. W1 U& T- r1 l0 `
                }
0 L3 M- G0 g! a) c. J/ z                return (0);
! E- _% _! h' j! x        }
' u0 \* p. T; a
0 s8 s5 t0 r/ x. t2 P' ?5 G! k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ [, E' t% W+ P                addr = base + cnt;        /* pointer arith! */. w* C3 H. c( q- y, B& J
                val = *addr;+ v, X1 p# r$ ?3 [4 O
                *addr = save[--i];
3 q5 a) K% d5 E2 u                if (val != ~cnt) {2 M- Z5 T( a, W$ k& T* t" s
                        size = cnt * sizeof (long);
& Y/ P; k% _5 }( `' ]                        /* Restore the original data before leaving the function.( I2 F/ v3 r- Y8 B
                         */) N' _, f7 j, I& g! }1 q% s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 k8 V; N/ U. n5 N8 p: x4 L8 K
                                addr  = base + cnt;7 g. h2 e" _3 Y' r& R
                                *addr = save[--i];
  W9 t2 k" t& [+ ^( [8 R                        }
5 }% O3 t. w$ B# \6 H: F! _                        return (size);) m: }- ~" Q: ^1 e# i& G' j
                }; g3 c0 s3 ^1 k, R+ p* N% R
        }
: R' ~; B* X1 |3 K5 e
! b, ]' {( `$ Q+ q        return (maxsize);* \# h. `+ r# w
}% l1 c( x' N  }9 ^7 j) l  ^" Q- d
int dram_init(void)
; N5 M. o+ B( b$ U$ l, U{
( [9 A6 O) ^' t% @, _        /* dram_init must store complete ramsize in gd->ram_size */' u9 H9 Q# N9 r+ e3 Y
        gd->ram_size = get_ram_size(6 T7 c# ~5 F$ A, F2 v/ R
                        (void *)CONFIG_SYS_SDRAM_BASE,9 @& p: _7 d; O" b  h, s
                        CONFIG_MAX_RAM_BANK_SIZE);
7 t6 l  T% k$ E/ K        return 0;5 ~5 V& l1 S% t3 E. v6 o: ^% z
}+ C' X$ h( n+ G. d- l8 U, _

; y/ H: i9 _" _1 Q+ u$ E5 J& n6 B- K8 Y& \: `5 \$ e; Q8 l. z

1 `$ ~( r) j+ V, H5 F# w  `
. |0 T, G0 t, c+ Q, w+ ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: S9 Z2 T8 E9 ^( _/ ^

' O/ ~2 s8 h2 [8 |7 l# {: \3 L4 R# {* N

4 H+ [* I8 v$ E  Z2 {+ k9 P, a




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