嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ ^. X; o4 J) L( }8 A核心板2:DDR2 256M Byte   NAND FLASH 8G bit& O, j. F. Y' M% f/ M) a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  F# G; w: o) ^) O
; [8 @( W+ s3 N. n/ \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" ^6 o5 A* e# \& N1 `# h
, y; k5 P3 Y9 h/ v2 z4 y0 N
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& Q  c* W' U* C9 }
/*
4 G  G2 e; E- I3 h* Check memory range for valid RAM. A simple memory test determines
0 ~7 K$ y3 C8 M/ `7 Z' y8 b9 B  o% u* the actually available RAM size between addresses `base' and! u- x( y( C/ b  g* g$ n: E
* `base + maxsize'.
" ^# `' l0 K! L4 Y% J*/
7 F+ c. f7 x7 H- y$ _long get_ram_size(long *base, long maxsize)7 a) V- [0 @' L6 \- u7 S
{8 ]/ |: M5 s3 G2 b4 G; ]$ U
        volatile long *addr;
0 G0 N5 ^, e, y2 _3 Z5 s* r/ }        long           save[32];
& a  F1 Z3 b* \8 Y/ M) \4 x        long           cnt;8 i: ?( S2 i( a! ]" u
        long           val;: J* ^% C% E0 l8 @! D
        long           size;3 B  g$ X# x: s4 d
        int            i = 0;
& S6 A* B: q% M- L
7 H/ q. r) h9 O& H9 g& P! p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  l0 R' s! g( n" F
                addr = base + cnt;        /* pointer arith! */2 J4 [& g1 m* O3 [) r9 B( I! i2 V
                sync ();
  E7 B3 J! M! Q$ a3 Z0 B, Y                save[i++] = *addr;  ]/ x  ]3 J! W
                sync ();* d( g( m1 c4 b' _" D- {0 ]- N
                *addr = ~cnt;- g% a! {6 \6 B
        }2 _; ^0 G1 y- a3 ]& Z5 c/ z% Z4 H

! r4 `+ f/ P9 _, H$ o/ \- \        addr = base;: k8 L( ~) x- ?  f  U
        sync ();
# n$ c' Y: W, Z) J, ^7 s; ]        save = *addr;/ }: f  D% U8 o1 z- i
        sync ();
9 @+ X& I$ p- U0 G        *addr = 0;2 v9 V! z( i8 c+ I- O3 t! r6 E: u( I
/ w& }( z  K* b2 i1 r# M" n' |
        sync ();2 C/ c1 ^$ Q4 C/ o3 X
        if ((val = *addr) != 0) {
, B2 l3 J; B1 |3 T                /* Restore the original data before leaving the function.
  e+ l% a  U5 Y7 h                 */
& I2 z' [: E) m" a! q1 Y+ h' W* b                sync ();
+ E: r8 O- e0 b2 \4 n                *addr = save;) j; |' C/ b# S& S4 k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" r/ q" j' l; o, }/ `" F4 d9 D
                        addr  = base + cnt;
- t; }: [9 W4 e' e) M! i                        sync ();
' ~" C$ J% _9 c$ f- X                        *addr = save[--i];- y1 y1 K( d( @+ L- r* u3 m' h' l! v( m
                }5 I5 N3 W$ J4 Z4 Z: b; i+ D, J
                return (0);; d9 l5 ]9 o( U% p! s4 m. t
        }
9 a/ s7 ~4 H7 ]- o, B" C! p. Q7 i/ R$ j8 p2 j  M9 p, T7 b
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 W8 v7 O  g* y/ H5 x7 Q, V
                addr = base + cnt;        /* pointer arith! */7 w6 B, {% p% B" C3 I! T
                val = *addr;& V3 g9 I$ x, Y! d
                *addr = save[--i];' @1 R9 j6 U0 S
                if (val != ~cnt) {
- R6 v$ Q5 a4 o- i; r                        size = cnt * sizeof (long);
0 w+ m2 c9 s  {& Q/ }9 d                        /* Restore the original data before leaving the function.6 v1 A$ V  E" K# @
                         */
, E4 ^* F; M/ p  w( x: S8 R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) y. i' `% X/ h, w5 A% e                                addr  = base + cnt;3 B/ W) }0 ]& Z1 e) i
                                *addr = save[--i];
$ `# \$ k/ Q9 j. d$ [1 U3 u                        }
6 F# c5 Y: T+ {* r: A# y                        return (size);; s( K- Y4 ?& f) o% c' u' P2 [5 C
                }; q- E/ L# ~# O: P
        }
5 `6 Z. }) x+ i1 I+ K/ G
* g0 g, J. Q1 v) O  {        return (maxsize);2 O$ H& A0 D7 G- x
}
  r/ J2 j: r) h8 n% r) q6 u' ]int dram_init(void)' x! }( Z9 i7 J$ \+ s1 l
{
! @6 |# m/ _3 t3 N+ w        /* dram_init must store complete ramsize in gd->ram_size */
# X# E/ a" z- P$ C5 ^        gd->ram_size = get_ram_size(
5 n; M; G9 F/ u" I8 S                        (void *)CONFIG_SYS_SDRAM_BASE,
  X5 B  ^2 p* n) V8 e                        CONFIG_MAX_RAM_BANK_SIZE);$ \  m- o8 {2 O  O
        return 0;
( u) l5 L8 m; g}
* z5 a( e; y' S5 Q- C3 ~/ u$ D+ P8 s$ {
5 u  q9 p# o# v3 p% ^

8 h& x/ N1 y! e) n. ?& I" Z$ y& M0 F/ c! e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' `6 R% x- t6 ?* ~
& x& P6 w3 U# l4 N3 V) c: v

+ x- g* ^) ^" ?
: ?; E% |8 R* }2 W# m1 {# O





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