嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* R5 g6 m# V. F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% j5 Y. k0 j0 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 \( y9 ]4 Q" \. c' x; g
7 d/ d/ S, w. ~. ^/ u* H
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' |8 v, @. D9 X( x% [% L4 B+ X/ |2 ~0 |' w

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) w1 j8 k! F# c/ o: s( S( a4 N6 b
/** @3 F7 {- ?4 d3 ~4 [1 c
* Check memory range for valid RAM. A simple memory test determines
  X, e; X$ Z+ u' A2 w* the actually available RAM size between addresses `base' and
: p' p4 T% t- W1 i* `base + maxsize'.' A3 D* E. u+ P# i: a
*/
9 q2 k. t$ d0 o4 ], ^2 W" [0 P8 k' Elong get_ram_size(long *base, long maxsize)8 o' P6 v1 [6 M* L
{. z! C+ P4 I7 v/ u3 L- O9 }' a
        volatile long *addr;5 V$ O6 m  E7 V. R# t& e
        long           save[32];
9 b5 N! Y) P1 c( n        long           cnt;' k! U; ?& o2 z. B& A
        long           val;
' X' }% @& ^% t( x" J- Z! Q$ V        long           size;
( U' \& A8 I, y1 T& ?  F        int            i = 0;
7 K9 M2 e/ m$ p' `/ f
! _) L0 M7 m5 v; C0 h/ d4 ]        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( j1 G0 Q* Q# J. ]                addr = base + cnt;        /* pointer arith! */
4 o9 f  P  u7 S9 C2 H: j2 q9 M                sync ();
. U% Q' v2 G8 A) ~                save[i++] = *addr;
2 X1 l4 v3 R6 f3 C' u                sync ();
  h# b6 r7 I; k8 l: T                *addr = ~cnt;- U1 u- Y3 M8 o8 z- k" [
        }, ^6 L3 j! u% ^3 N4 r
, d6 [0 i8 Y- G
        addr = base;- K+ }( ?* r3 ]+ q
        sync ();- X+ g: D  l  H0 ]1 O
        save = *addr;
9 f, ]1 p/ ?- K        sync ();& N, e2 Q9 v: w6 x; n# w
        *addr = 0;
0 V2 L/ _  W. i, I" Z0 X7 ?( R
+ w; _( G3 ~/ ^! a+ n! `+ N        sync ();
: D2 j, X& |- r! K% e7 v        if ((val = *addr) != 0) {
. D! F6 [  c5 i                /* Restore the original data before leaving the function.
- W" X; j8 A1 G. m( R, b% n                 */0 T: j5 _; q- Z
                sync ();
  P$ M3 e- O5 @5 ]+ i! N- ?' t                *addr = save;" l; x' Z: v  y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 f5 n/ t- S. T* N) r: E/ ]
                        addr  = base + cnt;
5 s- |$ y& x1 e; i  I0 v; |                        sync ();! b+ B; T% K5 q/ G$ n8 q9 U
                        *addr = save[--i];
: T7 g9 j( z" W; t# O                }! Z3 x, W: G; a/ b# h# A3 H% p# K
                return (0);
8 m4 E# E/ D: p: d  R1 n) S+ S        }
" N  y+ n: @4 {' n: d, u
; N9 `& ^; \1 L  a9 g        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: B8 I  m: J. y7 q- R" d
                addr = base + cnt;        /* pointer arith! */
9 Q7 M& Q- p+ o3 P$ L6 U                val = *addr;
1 l0 u4 }5 r* H# _( X# V5 c                *addr = save[--i];$ j  K6 ~# }4 N: ?/ Y
                if (val != ~cnt) {: R2 i( K) |, A2 \# Y. @/ `* I
                        size = cnt * sizeof (long);
: T5 a* L) l% a% t                        /* Restore the original data before leaving the function.
; `& h9 o% j* a1 U( N! b/ Z# P                         */* J* Q) t% S" Y: [8 L
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 `- |- m0 y7 B+ Y                                addr  = base + cnt;0 X* q3 K3 L2 P5 j6 e8 W. G
                                *addr = save[--i];- V7 }, |2 _5 j& r- q
                        }
) Q: Y- X1 {5 d                        return (size);: O& e0 G- x6 X. H6 Y
                }
7 N1 F$ V: L8 Z# |4 D/ T        }" M7 D+ O- F; h4 {' y" @
/ \# O: V4 `$ r- K& r+ v/ I5 O
        return (maxsize);
3 X/ K: L, l. T}: {) X8 R7 _: o
int dram_init(void)7 a9 q: m1 ]8 J: ?! p: L5 D7 L. f
{
  Y- V' E6 v+ Y3 n        /* dram_init must store complete ramsize in gd->ram_size */
6 ~: D5 T# l! j& C! O# b4 R        gd->ram_size = get_ram_size(
* A9 |. z4 V. k& ~' u; p                        (void *)CONFIG_SYS_SDRAM_BASE,. {+ i# A4 M* V0 o7 W+ ]& b2 F
                        CONFIG_MAX_RAM_BANK_SIZE);
8 G  t: \$ I& _6 V8 S/ W# E        return 0;) A* e% y. {1 G) V, r
}
1 g- B7 ^& t, P" l& f
6 F6 Q. j4 }6 ?
4 x( t- r6 H; M2 t6 [3 r- ], u( h- q: X8 q2 k

% P0 l& B0 k- ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& b# [6 O/ Z( j& J7 N, C, f
/ B1 J# K1 K' b8 j- F- o; v- h- {" n) N( [
8 V6 I# r2 d# s+ z





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