嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) Z! N4 M* R. q& A4 X核心板2:DDR2 256M Byte   NAND FLASH 8G bit% n1 U) J+ d' x9 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# S3 T% J- `/ ^2 s+ q. j2 J: W! q1 P4 h( M3 w; t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ @2 _% N4 Q3 Y: V8 }* {
  {6 Q9 T' H5 M" t
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& z/ j- S. H( i& P' P) ~
/*
: t2 W3 L4 j7 S$ d6 P* Check memory range for valid RAM. A simple memory test determines* m  I% w, y7 O- Z" i7 C
* the actually available RAM size between addresses `base' and
1 j7 W2 E  U: m& L8 g  s; a% v* `base + maxsize'.8 ?( \! o& C8 y% q. s* j  t1 S
*/
* \/ E( [  R$ C: ^long get_ram_size(long *base, long maxsize)) E& M3 c& g6 {7 q+ T" C
{/ k. T& a2 F, ]6 g
        volatile long *addr;
1 E+ V$ _+ A& S  A7 x6 H  W, x        long           save[32];, I: E! X9 V! _1 {6 Y. O8 b
        long           cnt;; K0 {- e2 `5 k8 Z0 i
        long           val;
6 Q# P9 O+ [0 M% Z/ g; P1 u9 N        long           size;) d% }8 D( p7 u
        int            i = 0;
. T4 z6 ?& S; Q& z: ]$ R, G0 F; t+ T9 @8 Z* `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 n, T! C! J$ s$ ]0 h' c$ U                addr = base + cnt;        /* pointer arith! */- o7 W  R1 B  ]* G! k
                sync ();
$ C' o: Y# `) O  @1 [& O* ~" m                save[i++] = *addr;
& S5 M7 }: h$ ]6 z                sync ();
/ J# x* f% ~6 G* {+ H6 @' s3 P                *addr = ~cnt;+ f& H5 a8 c1 ~  ^- u2 S; S
        }+ J3 w, g- p4 D/ s4 m

' k/ J  X  e3 ^5 h7 m# `8 J9 j        addr = base;" q# ^7 V( t2 z. i2 z: ]: H
        sync ();0 g, L$ J* C2 ?) @
        save = *addr;
0 Z( |2 i4 k5 E# q) K3 _        sync ();
! M: P  {8 T% D        *addr = 0;
: {7 e8 A- a4 C- w  L
+ o, e8 [7 S# U        sync ();' Z3 [* F2 u) f; u) r" e
        if ((val = *addr) != 0) {% |$ r7 Y. }2 a. S2 C2 W& A3 ~
                /* Restore the original data before leaving the function.
; I1 D7 I7 d. H4 q                 */
0 G) s" K8 O1 x1 k$ h                sync ();: ]: n2 J) T6 A. V# I* w2 a3 m
                *addr = save;) {' i9 U# S, Z$ P: a/ m- I5 r
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! @, B! {) n* T+ {! s
                        addr  = base + cnt;1 y( t. _2 ^, e' S
                        sync ();
: W' [: D' T9 E$ }& S8 f- m9 C! h                        *addr = save[--i];1 w, |# f; i6 S
                }
" ]! Y$ T. m9 ~! s4 \$ @                return (0);
* n# J  S4 B0 V  F' Y        }
; {6 k+ s: h9 B5 k, W& g
) x3 d$ ^# d( C/ L0 s: a  i& f        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; x. w: g1 S% _8 z$ O+ ~                addr = base + cnt;        /* pointer arith! *// f" s! A, `- `) ?1 w
                val = *addr;  O' P" y3 ?8 y, R; Z) H1 F! F
                *addr = save[--i];
% z/ L! h& P' U# y# s* j, ]                if (val != ~cnt) {
. J8 t7 X) s4 k2 `; A, j# D3 n) v                        size = cnt * sizeof (long);
- X$ e. Q/ q( X! o8 f) L; t                        /* Restore the original data before leaving the function.  U; S5 @1 f! O3 [) i$ N
                         */
! o+ h5 N9 b5 m6 x1 A7 M2 r& f+ g$ ^! M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 C, o" e. k6 e) u' a                                addr  = base + cnt;
) }5 e, \* u/ _& f. g9 U                                *addr = save[--i];, K& e- v: l. F  a) u; h
                        }8 w% S- s& c5 f! S% V
                        return (size);2 N0 M; k) T" I- ?# I1 o2 M
                }- N5 U& V8 j9 q" K  _
        }
( C( s( T! {+ }* s7 ~0 y% R" C* }+ x* M% ~, U0 @/ M
        return (maxsize);
( |8 t+ ~% H; g% |6 B6 y4 E}
0 s  B. b5 E  a. d3 x$ Nint dram_init(void)& P0 ]1 X' t- {
{. O5 J/ O3 a- z( `8 N) q  }& a
        /* dram_init must store complete ramsize in gd->ram_size */6 @3 o' w6 A9 b% R* }
        gd->ram_size = get_ram_size(" i- q' ~# J, Y* T9 I3 b% R* @
                        (void *)CONFIG_SYS_SDRAM_BASE,
* K* q) ]0 Z) J# d4 c                        CONFIG_MAX_RAM_BANK_SIZE);
$ f2 [, b9 ~  Y( K        return 0;
% ^: ?; x  s+ a! l3 M}+ h: Y& g0 X# |, |/ n

' |0 N( W; m2 c0 ^5 K5 U' r/ ]
8 c1 M1 T6 q& k! O3 D% v7 _! ]- B7 f0 z9 h
9 V* n/ ]! o) A% A  K. B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( O7 T6 H6 b& K1 o+ e
! M0 Q' e( v5 Q  E. w. F. f% I( q

3 f; v0 S" U. t" h0 I

, [! C" U+ }3 q4 k5 m




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