嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 L  F) `5 J/ f; q3 B  ^% J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: J1 n# g- K" |  m; p' D0 u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: O& x3 u% N) @0 {
: a7 U1 g7 g. ?1 Y4 @8 Q是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. ]& J5 E: H6 Z' j) }

" M3 m* m# a1 Q5 J+ O- H/ ~
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 X3 k* x3 w- Y# B, Y  w  H& N
/*
9 a; v( y/ B1 r* Check memory range for valid RAM. A simple memory test determines
0 A, p0 I# M, m+ L' H" X* the actually available RAM size between addresses `base' and
. k) N4 r; O) M) V5 v) k/ y* `base + maxsize'.( U8 W# a3 M( m" J4 Y( `) V7 H
*/4 b" I* _; W3 C  Y+ z/ [( ~$ s
long get_ram_size(long *base, long maxsize)* }3 r) P( a( o) Z
{2 b, J, S: L4 }5 G, W; j3 O
        volatile long *addr;
, p0 L' @' Z7 A  h' g! U7 ^7 B" `        long           save[32];
3 e0 T! c& d$ f7 ^( K' B        long           cnt;: ?5 f8 h5 r  N$ z% R
        long           val;
; m, u' H7 N! v4 K6 w        long           size;! ?4 N& v" ]' m( `6 \) Q8 j2 x, s
        int            i = 0;2 a. M" X" ?) b! V9 e! b* _
  w6 n/ k+ w! h/ `& u6 w" C3 Q/ F( c
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
+ q' Y0 a$ B( d/ U' A2 p4 C% B3 s" c                addr = base + cnt;        /* pointer arith! */0 l2 _/ u6 o1 V
                sync ();& v# P- G) y/ z3 `0 m
                save[i++] = *addr;7 i; B) p; o9 {5 @
                sync ();( w9 H  P$ ]+ R; f, P% @0 p+ K
                *addr = ~cnt;
7 ~2 P6 j& Y7 o3 Y        }
- H7 K% F/ |$ g% ?+ }4 B% d" b1 m  _- t) L
        addr = base;8 {4 a  z& M+ ^- \
        sync ();( [: H0 T2 ]% Z
        save = *addr;+ W# B3 d9 {. V! i* C; \
        sync ();6 q# G! w8 Z1 P4 n) E
        *addr = 0;* A. B5 m7 T3 ?7 @+ M

' @2 @0 i* b3 ^- k        sync ();
& R  c# E; }, C  u7 I        if ((val = *addr) != 0) {
/ c/ v6 {9 v1 v- C, V                /* Restore the original data before leaving the function.# u; f. Z& _( S& O# u
                 */
6 k% V' o. E  V0 [9 d0 t                sync ();
+ |; j0 x9 J, O0 d+ f0 X) u  ~                *addr = save;
' a1 |  d6 H; {0 }2 o0 `( O                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 p) N. v+ e1 Q( l                        addr  = base + cnt;& x+ u) |* o) u! ]$ z9 a
                        sync ();( H8 T5 K( N+ C1 Q% B
                        *addr = save[--i];  Z) p' N# Z4 v' N9 t+ [; n4 `
                }! Z5 d* t( G9 O7 L
                return (0);% o! l) `2 J2 F
        }- f/ n3 H8 g( l" L
5 L4 k8 |& _8 u5 t( b8 z' A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ d  d7 V( I, x& w' c                addr = base + cnt;        /* pointer arith! */
6 ~2 I  `; l, z. M2 P                val = *addr;- Y, w- h& K" n' i" I
                *addr = save[--i];
( [0 S& l1 A* @4 z                if (val != ~cnt) {
0 u. l: k& v$ [8 ~7 t! {3 _                        size = cnt * sizeof (long);
9 l; [* i. {" }* T7 i; ^8 k                        /* Restore the original data before leaving the function./ t/ u3 S! m8 `6 u6 i
                         */: ^$ @0 ^5 E' e9 P# I% h! m$ O
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 w6 }8 N9 N7 h1 q) R; [
                                addr  = base + cnt;3 G4 c6 n) d# }; K
                                *addr = save[--i];1 u. A5 c3 E) ^8 k, j
                        }% i8 R& }/ _; K' l
                        return (size);& A! b5 A' J9 n4 o. g
                }
' c8 C! H6 p( e  B        }
* S/ v6 X* N/ F0 Q  ~$ R
# q7 @& r. v9 H' `; M/ x        return (maxsize);7 d' t$ A9 j2 @/ {! m
}5 M' S  {8 @# X7 [
int dram_init(void), z1 L" I  e9 L! a, H
{) B5 }. G; N: L& }
        /* dram_init must store complete ramsize in gd->ram_size */
: ?( f' C  F5 {% G        gd->ram_size = get_ram_size(6 C$ y9 Z( R+ |' J" \
                        (void *)CONFIG_SYS_SDRAM_BASE,
! w) j3 X( o$ y% i                        CONFIG_MAX_RAM_BANK_SIZE);
; o; U, g7 Q+ ?7 J- [$ H        return 0;9 _# w7 J5 m* k; i
}% j+ I$ B5 S" y1 S- T7 Q' q( D' V
$ s4 Y- |' D+ L2 B8 C/ l8 s
$ j+ s, x4 d" `$ |1 {

9 r, ?4 e. D$ l& K8 V6 ]7 y7 J( T) r
4 n! [' y2 o6 t5 d2 c" K2 K* GFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: X4 x+ v+ y+ s

$ A& D# B6 ?# u  ?* _0 B/ E& X& s& M5 o% O( q2 i

! m8 T8 t2 _# v* e




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