嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; A4 t5 n/ [* e. A
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 w# H7 K0 H* i; O8 U2 x) N; l/ k! T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& V8 `0 r1 m4 X; z# M# j" s8 S1 [

1 o' ?& \" n* `6 z: a2 t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 F. m. X+ B5 w
6 \) g* z9 m! ~/ \( S- C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 F1 W9 C# m1 K# v* D/*; u8 h  ]+ N+ ^2 f. {  N
* Check memory range for valid RAM. A simple memory test determines( s' w2 Z) w: H- }6 P$ O
* the actually available RAM size between addresses `base' and6 E3 i+ i3 k1 q1 \5 U- K* t' H: I/ K
* `base + maxsize'.4 r1 l' ^& q# q$ ^
*/6 A* w& T7 J9 `2 J( G: f
long get_ram_size(long *base, long maxsize)
4 F( v8 K5 I5 i* D{
. A- P, H( r# d, b: P: M! {        volatile long *addr;
( o6 ~/ A, d  ]  h6 {        long           save[32];
! ~. O7 q5 S" T5 G. ^        long           cnt;9 W1 T, l2 Q9 w- B' p7 i5 Y1 _) W
        long           val;/ k7 b: w' H, V# j+ q' a
        long           size;
  \. C$ |; M% m% U) L        int            i = 0;+ J+ D. @" ?4 z2 K
0 h- H' r" P8 A& ~
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' X/ i( k- r/ Y. J7 v
                addr = base + cnt;        /* pointer arith! */* Z! {9 |2 C) f- {& k" K
                sync ();- w5 G2 }/ f- \' J8 y, t
                save[i++] = *addr;
- i( X0 ]% E. J5 q                sync ();
, g% l4 A7 z7 U  M  A6 P                *addr = ~cnt;
# B- g# @3 T7 h' V        }2 s$ ?# i6 o, B; Q

- Z- G% T( q0 f0 G6 }6 n2 C8 a: g7 B- Y5 X        addr = base;
1 m! F- I9 M! O2 e& P4 h        sync ();; |) y- \, J8 }6 y& t4 @5 n2 @: j
        save = *addr;- h' X& K* E- }9 K4 ^/ f
        sync ();. r6 h4 Z$ U3 o
        *addr = 0;
' s: p' A4 Y( j- k
8 l+ C, D1 w0 _; e& c0 {        sync ();1 l1 Q9 f, P# c2 [
        if ((val = *addr) != 0) {( D1 d% ?& z# W
                /* Restore the original data before leaving the function.
* Q# [9 C1 C/ o) l. L* F                 */% W  ^: K7 q# L# l3 L8 q& h$ i
                sync ();
4 i* m0 E, g1 u! w  A, P                *addr = save;  k8 X$ V; ^4 d) Z$ Y8 h% n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 V! w* w! E3 G9 ]2 G                        addr  = base + cnt;
: t/ t8 m* c5 ?6 K7 W) j: V                        sync ();
6 d$ S; n3 B1 L' a) c+ r* Y( R1 A                        *addr = save[--i];: J& X' s: n, V* r, x! d
                }' `0 Z" K2 }- |! ~# [/ [
                return (0);
5 C& q( A/ D  @$ P7 E. ?+ b; W. Z4 t. |        }
0 I8 m1 |. W9 O  C! @2 N
0 \7 |% J2 L6 Q. f' o        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 {0 W% E- d  l- ?& B, j0 N                addr = base + cnt;        /* pointer arith! */
7 ]% L* q7 o0 r( |: D0 [                val = *addr;
) }' `6 {' g: S: H0 ~) M                *addr = save[--i];! m- R+ ]1 G8 P& n1 g
                if (val != ~cnt) {
& h6 s8 A; l' N- m9 G                        size = cnt * sizeof (long);
. _, z# v/ I8 e9 {' W( q" B                        /* Restore the original data before leaving the function." k3 ~2 a1 g. L$ E8 S
                         */0 Z# Q- s& ]* W- i
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  V0 _( o, C8 t  M. }; T
                                addr  = base + cnt;
- G7 j1 q& J" q" i" I                                *addr = save[--i];
# o) n4 c9 V5 [1 q- J                        }1 S9 d+ g; o9 b& {) }* K/ V
                        return (size);
+ O) @' j7 ?1 N1 |4 P% c# P" m                }$ b& D+ ~, \3 d2 y1 N9 u; J
        }9 G6 f5 Y: V& E+ N
* H8 `, y6 F( V' A6 T( x
        return (maxsize);5 k) u& n* g  {; u( _5 m- ^
}
* ?; y5 V; Y4 x. V8 Yint dram_init(void)
% J4 A# E3 x6 M. Q3 {/ k9 P3 N{$ h  c! J3 t* a1 R3 a; N
        /* dram_init must store complete ramsize in gd->ram_size */
2 }: O6 E( H5 ~! B+ }# ]3 ^* Q        gd->ram_size = get_ram_size(
. |5 N9 C# D1 A! _6 l: a: K                        (void *)CONFIG_SYS_SDRAM_BASE,: O1 }* I% n8 m" b4 E1 g/ x
                        CONFIG_MAX_RAM_BANK_SIZE);6 D& d/ X6 U# S4 z7 c* F& T
        return 0;
- U1 Z- v- w+ a4 M0 E& L# B3 \}4 Z) b/ G5 a7 o8 w. B2 J3 v' z

/ T3 x& z* x) L6 U' e+ J2 k0 d1 I
1 W9 w$ e& V8 C; B
' i) j& n  h; I3 T* @$ y( D4 d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 j+ W. M1 N) b% M& p3 ?
' }; m) l  V2 V3 w& `% ], z- U

  c0 T3 G, E8 `
, x- ?2 q6 R. \8 E2 x" |1 H, R5 r





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