嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 a/ ~* R9 M# y2 `9 z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* _* y" Y9 S# k  @6 @% z( N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% d! T0 n5 w( i) Z, Z

3 d1 V) Y% s  E# _- A4 n3 a是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( K2 Y4 m3 N) O9 f" j% \" O
* k% l5 x1 Y+ J) x" W" Y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 W4 ]* B8 f! S6 f: M
/*2 t  h$ w: ^+ N* w1 ?( n- H: a+ G
* Check memory range for valid RAM. A simple memory test determines
0 q; E: E- h5 S& U, O5 _: v* the actually available RAM size between addresses `base' and( f( n& Y: w0 U3 {; e
* `base + maxsize'.: i+ ~  M1 }$ V- z3 P) Y" r
*/
! ]! q( |- U. {  m, ?long get_ram_size(long *base, long maxsize)8 d6 M; W) O/ N0 E1 x
{
- Q! l/ M; l' u  {        volatile long *addr;
0 W3 u/ N8 X/ W8 m1 u8 w. |+ L% C        long           save[32];% q5 G1 ?: {( i3 R4 e
        long           cnt;
  o/ z( r4 y! t+ M( a, @        long           val;$ t! N! F1 K9 A  F  L0 P
        long           size;! B1 e# K8 A5 _- N/ m9 h
        int            i = 0;
7 D* P$ H$ N: R- @2 x7 w( T# P2 g1 q- |
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ F: ~2 J, q1 U
                addr = base + cnt;        /* pointer arith! */
; i9 u  D+ Z, U                sync ();
( I) H. y- w( W% f( |* R                save[i++] = *addr;) ?) F5 p7 D) P9 m. U
                sync ();# {' t$ _+ i* H( F' p4 u
                *addr = ~cnt;
; v+ ?, e: u( x7 o3 C1 l9 [        }
# p0 {' d1 n' \$ s, J5 d4 n& Y$ g8 Z0 [3 _8 A
        addr = base;
5 l; m' L  j% g1 q/ f        sync ();
4 V/ z2 j3 l; t3 i/ G, K, I, p. j        save = *addr;/ N- h+ ~+ r5 b4 S
        sync ();
, L4 N- D: o/ w        *addr = 0;. q6 |7 c% d# W/ y; ]9 y! X, o, X* v
8 e% y) x' R+ c1 ]3 H! G6 k! S, |) |
        sync ();
& T0 ~2 v" o. K* C' {1 u        if ((val = *addr) != 0) {" U  h- w( A% o# W  ]
                /* Restore the original data before leaving the function.
5 G9 T/ g" c& {                 */* E- d$ `2 O0 n- C
                sync ();
$ N0 Z- G8 i7 E! q                *addr = save;7 o9 b' S: n4 X6 O! N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* I' S  r8 ]. r) c3 h0 S                        addr  = base + cnt;
7 \% w0 B$ K( [7 k                        sync ();" ~+ }4 {. {+ \" o
                        *addr = save[--i];
; R! ?) U, J- l: ?- i                }3 v( y. X& d) }$ z7 v
                return (0);0 l1 d5 B. O9 v& Z# A6 d  N% [  b/ ]
        }
1 f; H/ ?# Z0 W& E) `4 x' W, L9 B) W% O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ u8 e# j9 o+ M) i! @                addr = base + cnt;        /* pointer arith! */! r8 \, L- I0 u9 Q
                val = *addr;
, z" p5 K2 |: d" a                *addr = save[--i];
. s# J- |) C: d& z$ ~                if (val != ~cnt) {
) c3 e6 K  p9 V                        size = cnt * sizeof (long);' H. b) X: u5 a2 l" T0 d" E
                        /* Restore the original data before leaving the function.
3 \3 A* c6 ~( q+ z2 k$ l+ N                         */
) d5 s) s% Z  _# r: h- t9 N9 p                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# _. r: H0 \6 j) ~( N- d1 e                                addr  = base + cnt;
# U4 O! e7 ?/ f; l1 j& L8 ~                                *addr = save[--i];
3 v! _# f, B6 h9 R! s; V2 u                        }
& n. ~6 Q, n9 Y% a                        return (size);0 a9 S2 B9 N8 o0 C$ F
                }  ]/ w+ i- n, D/ y" C& d8 ?) R
        }
2 n% r/ F4 t$ D+ Z. e& z1 t
2 G9 ^( k% H, ]- z6 M/ w        return (maxsize);
7 b( z5 {$ ?5 u$ ~. [}* L/ i( s5 \  Q0 N
int dram_init(void)1 p. v6 {. e# X( ?
{6 t- ^; e; v& a5 E7 u
        /* dram_init must store complete ramsize in gd->ram_size */  S( N9 I) P! `9 s" g7 H
        gd->ram_size = get_ram_size(: n  I+ W1 ?) C8 R3 v, k
                        (void *)CONFIG_SYS_SDRAM_BASE,
& h7 _& @# _2 a; u0 {& _3 r0 m- w                        CONFIG_MAX_RAM_BANK_SIZE);
3 {5 f( q1 r  ~1 Q, B) E6 e        return 0;
' c% e( `/ V3 @, H; r}
3 E" ~" X8 c3 r) k- J$ C1 C) i$ Y9 x
7 w: U# F* u/ B% P4 J
" l( H, _" |/ }8 \3 ?$ T
3 Q  j6 o4 O! Z4 x3 W% v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; X1 V6 t2 i1 M. }% K

7 t: h& x! t; O2 Q5 _" Q& y
) [3 {' j  x9 {3 D2 O6 A

# S$ j- v0 B$ w  U! ?




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