嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 l( ^3 ^. W8 I- l* S+ N- x
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* H& E7 O) |  C: r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; P; F3 E0 w5 m0 `, r3 U6 ]
" t# X5 J; s3 M  q/ x6 I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) P/ \' d5 d6 k0 S; `6 k- Y
1 O- }5 W, s3 a+ v1 D% l: |$ \# n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 b; a! k$ C0 |+ |3 B  V+ C8 R
/*$ ?1 l, W3 L, o6 {( D" j; ~
* Check memory range for valid RAM. A simple memory test determines2 R  a. D7 G9 x5 h5 n: U6 s
* the actually available RAM size between addresses `base' and' p; ~  g- }0 j( O
* `base + maxsize'.
, f) X% ?# p1 [* H' V* U4 P) z* g$ Q*/
. }! S# y$ F6 v1 X. L) d" blong get_ram_size(long *base, long maxsize). Z/ J+ ]: }: x3 ~2 d0 b8 o
{
/ _8 T! x4 V/ Z) a        volatile long *addr;
1 l9 X2 B' n8 J        long           save[32];
5 K0 I: e. S1 ^- X1 u        long           cnt;
! b& b% H* @1 s) _        long           val;0 J+ Y' ], `& E2 S  L
        long           size;4 F7 Y! R7 m8 x6 s
        int            i = 0;( A' M8 O; T) B4 z# V) v: o
1 z  C/ W: [+ z& w8 K5 G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  I0 }6 E0 e' P
                addr = base + cnt;        /* pointer arith! */; q7 z; x5 j% N, m6 g! I; ?
                sync ();
! }, G% L1 \, z$ J# |$ B                save[i++] = *addr;
9 q2 ~: E" g6 q  M" `5 Z                sync ();
) ?% k- @7 i' a, _2 [                *addr = ~cnt;  a# h# @3 N" X4 R7 P) W& A
        }
) q+ X! x: m. k# v$ S: q
8 [4 u' b7 X* f, i/ _1 ]8 V        addr = base;
0 t- M. M5 j/ p: J5 ~        sync ();  _+ C! k+ I5 s+ Q+ K
        save = *addr;5 i) Y4 l0 W* a3 o) }: N4 `5 B
        sync ();
$ ~. ~+ o+ x+ Z8 e7 T* y        *addr = 0;
: i7 h1 ?9 \* i; g7 N4 ^: H% `) q/ W+ Y% M7 `. A$ a% Z
        sync ();6 I" u0 f3 p3 B* s) H% I
        if ((val = *addr) != 0) {" q- w# v9 a& H, [% {$ Q4 M- |8 @) |
                /* Restore the original data before leaving the function.& b6 Y( \2 G0 `
                 */
; ?/ K& G3 E( L4 u5 [  X                sync ();
; M1 Y. K3 Z4 U0 ^9 @0 p                *addr = save;/ s% b! y2 c4 Z! N% o/ T" F5 P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Z* x7 k+ w' s( F                        addr  = base + cnt;4 r$ V6 v% @# R) k. C
                        sync ();3 T% a' ~! Z! ^' v' P2 d. ^/ N9 B  W
                        *addr = save[--i];% c4 d  ^' y# [5 t
                }
1 n+ Y6 J* Q0 m; b6 ?                return (0);0 j4 I! |0 G: B( L9 c3 e0 Y7 n
        }
; X+ w0 _6 |* Y: _9 A3 q7 P3 H$ ?) s
$ k0 r: m% V( l% t& d        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ^" i' X' Y6 b, ]% M! `- r                addr = base + cnt;        /* pointer arith! */1 s/ x- P, P$ X% Z% Y
                val = *addr;
5 c; j5 V  t  V" j. L                *addr = save[--i];
* X  E( y# X$ {; E. T( |; Y1 S% @                if (val != ~cnt) {/ |4 H/ n/ D' v- c( y* o
                        size = cnt * sizeof (long);) S* L; k" G2 d' L; m
                        /* Restore the original data before leaving the function.8 w) V. g: M+ l: U7 r5 Q
                         */
) ]& ^$ g2 d% b/ }) o& D" E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 o$ h# ~8 `: t$ d/ Q: ~
                                addr  = base + cnt;3 @# w  d5 }8 l* b- _' N2 M( \6 ^, \
                                *addr = save[--i];
+ E$ e, D% E: @; p3 [1 ~                        }
: F3 r2 W5 r1 N% d+ J                        return (size);
0 ^; n* c6 {7 x7 z                }. }4 l3 j0 n4 I
        }
7 V4 Y) f% U- z3 `: E3 p( A1 i# j0 ~8 t1 V
        return (maxsize);
1 K& x' l, ?$ i! h( |}% P! X, c/ M& I1 t; @& `
int dram_init(void)
5 m0 c7 I1 e# T1 z  N6 y" {{
4 F+ P5 b- L& Z8 y0 h. a2 T        /* dram_init must store complete ramsize in gd->ram_size */
* _" A4 e% {5 J        gd->ram_size = get_ram_size(
* |- \( C" _1 I1 ~8 {- k                        (void *)CONFIG_SYS_SDRAM_BASE,
- ~5 p; U* v: L9 ]                        CONFIG_MAX_RAM_BANK_SIZE);+ p2 ?( A! g! Z& a. q% s
        return 0;
& J( e7 z( ?1 H* q: Y& W}* X& B* W3 m, T0 Y5 a" W
: {1 o$ G" X5 A8 F' I$ k2 d
, u3 ?* [% C$ x0 {
/ m$ _, x  y7 X' `8 y8 i
  N2 l  x$ x* A
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( Q6 c  p5 X: l$ a2 g& _% ~
7 b  T0 M. C& Y! T& s
# F/ [& W2 j1 V4 _9 D6 Z5 H1 W$ }2 {
! y8 i, |4 ~' v





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