嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  P$ \4 n7 p9 w; `
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& h  l* A% w& v. n$ s这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" q2 j1 U7 }% E0 l9 v
; R9 u1 X+ |6 A0 A- O9 d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- n) e7 Y  w: M2 @- Z5 z# L9 B& P$ z6 G( Q+ d/ }: r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% E( @! p7 M9 x7 t! m9 q( ^  }/*( U( E! x$ {( M2 S
* Check memory range for valid RAM. A simple memory test determines# A) @8 ^$ d: ]& n' B7 q
* the actually available RAM size between addresses `base' and/ l" v/ S/ W& J4 _& C
* `base + maxsize'.
, c7 w6 _, X9 G2 a# }+ K9 b8 ]$ |" |- E*/
. i( Q2 O: M7 C6 hlong get_ram_size(long *base, long maxsize)1 c9 U! @7 @2 T8 d2 ^
{
( Q3 v, P+ U2 Q) a        volatile long *addr;
" ^$ D$ C9 U8 ^! C8 S2 o  U        long           save[32];  n2 f4 {8 r/ Q" i% ~, b0 N: ~3 a
        long           cnt;6 ?2 E4 c1 `9 y7 K( p: V3 k
        long           val;& T) s( x( U+ n  D. b# H6 b
        long           size;% n5 @6 n1 |% L. Q& r
        int            i = 0;' c; q2 j+ z$ k- Z7 D

5 A; A+ P+ E* |) i6 p        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 s4 C8 W" P2 N- k. {                addr = base + cnt;        /* pointer arith! */
0 C0 I9 t  N" T                sync ();
+ i5 m& x3 c* y. E3 P; ~( F) a* W                save[i++] = *addr;
3 K. Y/ u: s4 M2 n4 ^8 m' x                sync ();
: B' A& j& P) n" Q' B6 A( d' {) Y                *addr = ~cnt;" G, P6 X0 v. O. A! ^2 W4 j
        }
: S+ u* F9 X4 n+ ?' X8 a( D
6 o8 I/ p- T. n. P: b        addr = base;
: Y' l$ ~& z4 }; p  E, W+ b8 u) P        sync ();
5 G$ C6 T: P& |  V4 c% d        save = *addr;
% N) ^" x. Q1 t( R# l0 k1 v  i3 X7 v        sync ();
, ?1 Q$ Y5 o& G7 x/ {        *addr = 0;" d8 ]8 O, U7 T1 ?- h
2 j6 C+ {6 m3 h, ~: |6 q; p
        sync ();
$ \2 E9 p. x  A) c# l7 u3 J: i% O        if ((val = *addr) != 0) {
6 f- {* }: g' k& @9 L! A                /* Restore the original data before leaving the function.
: l9 o' X/ n$ j, q) ~. m5 e                 */2 S0 }; [7 j. I, A3 q
                sync ();1 X' D# m8 |4 X0 \2 ^0 P2 h( G
                *addr = save;
5 ^5 q. a: c  i  Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  t: Z* L9 v" Z4 k$ D8 S                        addr  = base + cnt;
  [& M3 M2 |1 ^- m# c2 h' f8 n                        sync ();/ b2 E0 c+ h+ m
                        *addr = save[--i];6 q& g, A# j. m( K% V1 r( |9 I; V- C
                }+ L" p% n$ I3 @5 W7 a7 u4 K. N' _
                return (0);& M9 z8 D4 m; R) D6 Z; J5 ~0 u
        }) |  t4 c# M- C  U( m
3 C  y+ P( p+ c
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 f* x' B7 a& p
                addr = base + cnt;        /* pointer arith! */# M" Q6 y- s7 v4 o1 V
                val = *addr;: O) |& P' c0 ^% g% N- e) h3 V3 G1 X
                *addr = save[--i];
5 ~0 n0 s% E; F6 P! j  X                if (val != ~cnt) {. [& j) }" e" a! b- E* |) l
                        size = cnt * sizeof (long);
6 q" X3 ]# ]$ o                        /* Restore the original data before leaving the function.1 G1 ~/ H+ i% R9 j! H+ R+ k+ `
                         */- ~2 M  s4 m5 s# @5 D# T4 G3 r
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 z3 T3 q; p& k: t1 u6 o  f7 E
                                addr  = base + cnt;
4 k8 e# F3 a3 h. z( o! Y) \% B                                *addr = save[--i];" V: `2 o) t6 W$ o
                        }7 O, G. m: b2 l9 |$ v$ \
                        return (size);
9 G( k4 @) f4 c7 A                }
. K( Y/ c& N# ~: K% d% n        }: |  _; k$ W+ |) C
5 j  B! S. P$ p8 s) u! ?
        return (maxsize);
: Z/ Q9 n& a3 r& r}
" }1 P! m( d, m0 Q/ u" Zint dram_init(void): [* o3 N/ [- @
{/ G' @1 v' ^4 l$ ~
        /* dram_init must store complete ramsize in gd->ram_size */  u; e: S' E1 d! W! }  I
        gd->ram_size = get_ram_size(
1 }4 n& V% _3 X; c                        (void *)CONFIG_SYS_SDRAM_BASE,  l% t" B$ X1 C
                        CONFIG_MAX_RAM_BANK_SIZE);
8 m' I# d: P# U: {' v5 M5 A2 `        return 0;
# Y! L! e, |% }% {7 ?! i+ Q}/ k' [1 f$ [( N/ g& v% A- x

2 J' Y4 W* f' H2 P9 h$ U: `, d! G' r7 u+ m+ R) O

$ p" O; O, V3 a( z
. V( S  |/ _2 e- s8 S' `FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% m: J- z+ H5 z) F5 }# W7 C! D, D+ S9 d: ~2 p7 {! n3 ]

5 i  X4 S# S6 R) A: N, U
& Q1 q! {2 y+ N: g4 r8 h5 r





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