嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* _4 s3 [+ ]$ O' @1 S  B% ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 L  B* [3 n0 T/ k4 P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* ^5 k0 Z3 O" l/ }: e
: y* u/ Q9 Z  }0 i7 y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 l5 q8 Z% J& Q/ _0 J; O  o2 O- ~
& x% V+ c# u) [; ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 @  c$ D" l* e9 F* s; ?8 k/*
! `' c% B4 ~# F* M* d* Check memory range for valid RAM. A simple memory test determines
! w4 h% S+ O( k3 s, n4 w8 v* the actually available RAM size between addresses `base' and' r, p0 f. d6 a- k3 ^: f- U+ O
* `base + maxsize'." ]7 m8 u- L) |/ M
*/" B3 j4 r! ?+ R% z
long get_ram_size(long *base, long maxsize)1 F: x0 d! L! n' C" |, M8 ~
{
8 j* Q; u' W  \' b& g$ f        volatile long *addr;) H! A! ?7 D8 P/ h" z0 i- n
        long           save[32];
0 L* p3 a# G$ z, ?3 G        long           cnt;: v9 b0 B6 k0 o6 c6 s$ J- B
        long           val;
/ y$ n1 v$ O' z* ?        long           size;, D" ?4 ?; e" e3 Q6 a$ Y
        int            i = 0;/ A- T' m! B. e+ x) m. S' G7 E
, ~8 J& E$ H; c
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 [& H/ d4 L+ h  o/ s4 d                addr = base + cnt;        /* pointer arith! */" }  M4 ^' U6 T7 `' W
                sync ();- X7 Q" P2 h9 J3 c  |, ~
                save[i++] = *addr;
6 `5 Y. P1 p- d7 a2 k                sync ();9 y( v+ {& u0 y
                *addr = ~cnt;+ I; j/ y- a( c- N8 N  w7 p
        }
; r5 B# N% z" C- T( q) ^5 a& H2 [$ V, H: w) K  L' o7 M9 ^
        addr = base;& `+ \' n; r5 h- o) u: N4 ]; O
        sync ();
- `6 @* Y$ E! k        save = *addr;
) x4 J+ A+ N4 e( I- [1 ~  i, Z# z        sync ();
' L/ i: V) R1 F. m        *addr = 0;
  E4 N. X4 d4 a8 B" X% r1 P# i# I" L" j
        sync ();4 w+ _0 x: d% o5 @2 ^& x- X2 o
        if ((val = *addr) != 0) {' U7 J+ A  q- Q& `  F3 N0 @  w
                /* Restore the original data before leaving the function.+ l. P2 M# m% n9 ?# \, F( V! N1 t+ m
                 */4 T, [" C0 Q6 q: R  T
                sync ();. }) y! S9 o6 s- @' w0 u1 g
                *addr = save;& c; Z! Y0 O: Y9 v3 ]* ]1 f
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ F8 Q- R+ V' J" y+ ]                        addr  = base + cnt;
6 k4 R5 _& Y  N- f$ d                        sync ();
* E3 C# |6 J) f7 R# O) |/ C- U                        *addr = save[--i];4 ~  I; n4 [6 N$ ~# k$ i; e- V
                }
* T4 h; b( \. G# W' `% {, {                return (0);
! ~. v+ o# \6 A$ {5 a' I) M- ^- C        }
* u9 r$ s  v4 N
( }( M9 o* i- \/ n6 P" O1 R        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! Q' f) c7 ^: c$ S# L7 |; l" G                addr = base + cnt;        /* pointer arith! */
4 m8 _( q  {  R3 }$ ]                val = *addr;! b; p0 t& C$ `5 t& }0 s
                *addr = save[--i];4 o5 A& B7 j; K& l  w3 e
                if (val != ~cnt) {, M% u: Z. w5 T1 q1 K, V: g0 e
                        size = cnt * sizeof (long);
& [* D& ^7 A% Y' ~                        /* Restore the original data before leaving the function.8 X6 Q/ J: q( s# E+ V
                         */& {( P0 e. T4 G, [' N: L4 I9 v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) r; [0 Q  I7 y" J/ f                                addr  = base + cnt;2 _  T# O# |! F) p4 S$ ]8 \
                                *addr = save[--i];
, T: k% g0 }- d) C/ |& ^                        }1 B0 z  b, ]) B/ v
                        return (size);
) L" P% Z0 c' O: d7 V7 \- p                }
4 i+ |3 d0 i1 G* {        }; D+ \0 _4 D% q# ?4 A0 F. D
( J# ?/ P2 y' u. V! `3 C
        return (maxsize);( V. W1 B' o( d' |+ Q( O0 r
}" y  M1 w/ C& [  r) ?% c, M7 W
int dram_init(void)7 [) ~) M' u% x& X5 h
{! u% q2 m) ]* Y! T5 I
        /* dram_init must store complete ramsize in gd->ram_size */; Q% ?& S+ F9 C
        gd->ram_size = get_ram_size(
' J0 K9 ^$ c. O6 R7 S- \                        (void *)CONFIG_SYS_SDRAM_BASE,6 C/ H8 R+ j1 B) O
                        CONFIG_MAX_RAM_BANK_SIZE);
5 C2 K; R9 a+ t+ L* x        return 0;' q# Q) T8 p9 `5 c# V# n
}
5 U4 s! F; r$ N/ l8 @& U  p2 x' s9 F0 N; L" V$ W& E
- U  U' @9 g7 ?6 u

0 S& a* l2 e# t, h5 T8 E- N
/ ~' x* Z% o9 s4 l/ k8 h, qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ L2 A- `$ C+ c, C. [. n
0 {7 A  ]2 c( b+ y  x) K
& d1 Q8 ^' ?5 h# L7 u' a" P

0 c; @" s! a+ F




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