嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# J0 m. v1 N: t! b核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: m0 M- H* p* [, A4 v, A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 k) E/ o) ?+ t# ^# S# a3 \; O! `
1 H' b) \1 a0 W* L& P5 N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" q; |% e0 |% _. l
. |( r( p! e$ s( f1 C2 `0 o4 ?  s
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& M4 E4 E- @  y* K$ B" ]1 H
/*
, R. [& `" R$ g5 T  @5 N9 }7 j* Check memory range for valid RAM. A simple memory test determines
7 p' `: i/ x; j7 e* G6 r6 b* the actually available RAM size between addresses `base' and3 q  u" T1 Q' H9 f3 ?+ I
* `base + maxsize'.4 J( o1 R' Q+ C. i' @. I( o
*/
: l- w4 y/ N+ Rlong get_ram_size(long *base, long maxsize)
5 Y: T* n+ e4 C{3 Y4 d/ [5 C+ O7 ~) N7 c1 ?2 B2 s+ ~
        volatile long *addr;5 O* h$ a9 T' G5 Y5 g
        long           save[32];8 E  d6 p) m$ F6 n! t9 D
        long           cnt;
& R$ d: v9 F, h5 u        long           val;9 K* q: r/ P2 J% T" v( b0 y
        long           size;- i# s, {$ J1 v1 @$ I% ~% Z
        int            i = 0;
* `/ }- D/ P& A/ o- l
" `- c) V4 F2 O7 s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 }) F9 W+ y8 w                addr = base + cnt;        /* pointer arith! */6 J5 Y6 j3 b1 p8 }+ C5 t. t
                sync ();( ?7 A8 I0 B7 @
                save[i++] = *addr;
. g- `! Q1 p( m. B3 m% ?  ]                sync ();0 _8 f5 S; x! P. c7 W
                *addr = ~cnt;  u+ L: i5 I, ~: U, m9 J
        }: c2 r! o1 h4 S4 H1 O: ]
; _! J3 e9 W4 O9 p. W- w
        addr = base;* v: S. K& k; B5 x2 K
        sync ();0 ]  l: a- A% Y% b
        save = *addr;  \! L7 \# Y0 z
        sync ();
( f, W7 r* ?3 ]0 S- V+ }        *addr = 0;
3 E& i, Q: G# m7 V2 B: E& D- Z# S8 @8 S2 ?9 h" \# o" A
        sync ();1 Z  k! H6 Q' z
        if ((val = *addr) != 0) {
3 G  e! @2 C5 T1 n5 o, [2 G                /* Restore the original data before leaving the function.
- Y  w& h" R' p! p/ M9 x) Z                 */
8 S9 k7 p- P& u                sync ();3 y! U: ^( ?/ G* y5 T  T. a7 s
                *addr = save;
1 Z' H0 J9 ^% P6 e& m                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ x+ p" ^5 M- ]  D& d' D
                        addr  = base + cnt;  o5 {+ R; I6 Y5 v' k
                        sync ();
3 t8 i* M$ X# y. l: c4 m$ K                        *addr = save[--i];
/ S# i8 k8 K* d5 b* P                }
4 z, @+ A* P# C8 o% L7 B$ Q                return (0);$ T- u8 E1 z& P
        }
. y2 `, e: }5 A( X
2 k0 F' k7 E  a9 T$ |) M7 E) z7 J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& K4 v6 Z9 m' q- d* @, A
                addr = base + cnt;        /* pointer arith! */
. A; E7 }" c2 X" H+ Q                val = *addr;
" T& q2 E# c, Z( {- [( v                *addr = save[--i];
# s1 l; x- a. a+ a# V# Q                if (val != ~cnt) {7 V" R" U7 Y% B+ W
                        size = cnt * sizeof (long);/ A1 y/ i9 p/ p* c6 e) d
                        /* Restore the original data before leaving the function.) t( c% a7 o& ^$ p  E! A, I
                         */
/ ?1 G/ `7 O# j! C' s                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ p+ g- A/ x3 y9 @. }* w% ]                                addr  = base + cnt;
: a! \7 @5 |- \( E- U                                *addr = save[--i];1 A. V' i" m8 k+ n3 a; `+ U
                        }
4 }# C# k" d- T7 h7 H                        return (size);
  V$ B% g8 ]* D                }
; ~& s" E/ m5 u1 N* W5 T! ?        }2 O: |3 d: B' V$ W0 H7 f1 X

  n" e5 {' Y  p, Y/ U        return (maxsize);
! E7 l6 _3 g4 f}
9 E0 T& s' C1 nint dram_init(void)
2 ~' E- Q4 O2 T6 k6 H{
. j. h* D4 i7 H% e( z        /* dram_init must store complete ramsize in gd->ram_size */
$ r' J, r( Y* E2 {0 V+ l8 d        gd->ram_size = get_ram_size(
9 @8 _4 m" a2 I' _3 g                        (void *)CONFIG_SYS_SDRAM_BASE,5 `7 G# w( ^1 q$ F: p$ Z7 D
                        CONFIG_MAX_RAM_BANK_SIZE);, N' }" @+ ?; ~6 V% L. M6 _; \7 g
        return 0;6 M( O8 V" \, [8 H9 c
}
. J2 X0 ?% X- z" v8 u
: R8 m3 d5 k1 Z* w5 y, E" r/ I/ @, {8 [$ [* Z

% \! Y  m) z8 R4 R$ t8 _, ^7 V% r7 ?$ k8 Z" {. }
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 y- ^/ C6 ~/ b$ Y; c6 e4 ?+ e! x/ ?5 |7 J1 o/ e- h

- W3 P. c/ \5 d' u
7 r+ B' e7 @0 K* i5 L$ U





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