嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 X3 b/ S$ Q/ M7 y- v核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( c4 U: ~( A; i' Q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  T. K  v! e3 y" J
8 N, c' P1 A; ?  \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 J% o# b: u/ ?# C
) d+ r9 }; q% r  E* ?, I

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" G! B) E, R+ J: Y/*
: g$ K5 c) R: ?. |; O* Check memory range for valid RAM. A simple memory test determines
8 l: u& j. o: H' d& M9 U! {; [1 B/ o* the actually available RAM size between addresses `base' and
) p! p% y5 F* `- N* `base + maxsize'.
$ b' {1 e% T# L+ t" a5 y' v# S- ^*/0 X' U) U$ I. L4 A
long get_ram_size(long *base, long maxsize)! ?+ h* n/ N1 b; J+ G8 h: B$ U
{
+ P3 n; g/ _* ^8 g        volatile long *addr;
" d8 r# N" v% F4 R        long           save[32];
3 O* ]# k- O7 U* D  X. ~        long           cnt;
7 e% T2 L+ V5 P4 T: P9 W' d        long           val;# w8 [# j5 i7 c& E2 C+ U" Y
        long           size;
, s# u& g7 \1 e! i4 q        int            i = 0;
  Z9 b9 R1 s( p' C2 y% s5 ]3 d1 i7 F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ a6 p: q! p* R' d1 N# s
                addr = base + cnt;        /* pointer arith! */
+ M  e6 o' }6 |9 h& ]7 Y! N                sync ();2 c2 S4 y- p, f8 s( ~' N
                save[i++] = *addr;
3 E6 I; c) a4 j# h                sync ();
9 L/ M+ c5 ~8 Y) Z                *addr = ~cnt;
! Q0 K% q6 _+ K' R1 F: j  M0 u        }
7 R: n7 @; |' W$ E
, I8 ?1 J  J& L( t2 X8 d. n2 R        addr = base;
) F1 d; |4 [. {8 d1 T/ _( L        sync ();
0 B5 Z& `: J& L! p0 E        save = *addr;. n5 U. i; _  z4 X' f0 E
        sync ();* a. H5 |: Q$ d5 U: C; K: q/ E
        *addr = 0;5 h! y- W0 U% j

' [. N. O  Y  Z        sync ();3 I$ I3 U2 m7 {9 j- _9 v8 v7 w- I
        if ((val = *addr) != 0) {9 E! p; P9 k0 H, i& l% l
                /* Restore the original data before leaving the function.
- ^8 P/ ]+ u; i8 K                 */
+ L+ c5 J7 W* B                sync ();( [$ n' \# S6 z& x  g$ A8 J
                *addr = save;
% a1 c3 i6 z; j" `4 x# I7 Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, R3 f0 ]3 a4 ^                        addr  = base + cnt;: X" w. P( Y' m6 G; v, u9 H
                        sync ();
- p* S, m  G& J& z; ^! X, N9 N7 ?                        *addr = save[--i];, S9 D2 I" o+ d. P3 s& N
                }
+ B8 z, z; n& `                return (0);
* O6 M1 F/ ]0 q  B0 A) o& q        }) W+ f) Q- y" j
5 m! Y4 \# }$ D& r1 v$ s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 w3 Z1 p5 v) ~3 `- v0 ]& ^4 |$ r                addr = base + cnt;        /* pointer arith! */9 z* E. ]/ e+ Q- p6 c7 w
                val = *addr;3 T3 ?* S' f5 ~8 _
                *addr = save[--i];
% g  O. S2 v4 H9 @                if (val != ~cnt) {
0 Q6 U% N- E( p; h9 v! Y2 Y                        size = cnt * sizeof (long);1 F" w+ \* d, I! Z6 ]
                        /* Restore the original data before leaving the function.
. T( W8 r# [, l                         */. b! C( J- g/ W* [3 V1 @8 U' S. ]+ J
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. R4 i2 y1 C" J
                                addr  = base + cnt;
+ p6 h0 t  W- L: Z                                *addr = save[--i];
4 b6 I( O9 L4 A& H  L  N                        }
5 r4 X: j9 S/ L( ?* u                        return (size);
. y1 l+ T8 i, A7 D% L  _                }8 z) X7 ~2 s7 a6 b4 C
        }
6 O8 p8 s+ i7 s8 |/ I5 S5 ^
- Q. g) G2 M) R: U) T+ K8 P. @! h        return (maxsize);
; c( Q" ~3 D( U- \' p5 [( d7 L}
5 H) A; Y7 w* S* t0 R# uint dram_init(void)
2 s/ t* T4 \" Q4 q. u- `0 q2 e{
8 k8 z$ o; `: j3 X1 ^/ o$ b        /* dram_init must store complete ramsize in gd->ram_size */
: H+ a; Y) x* Q' y- B& t* Q        gd->ram_size = get_ram_size(' Y4 D2 h* Y8 B9 v* s
                        (void *)CONFIG_SYS_SDRAM_BASE,6 m7 d  I6 k/ A, N
                        CONFIG_MAX_RAM_BANK_SIZE);" Q; q$ }9 j6 |7 ]
        return 0;
3 [0 I7 U. Q- Y  I- F}( M' x* l8 w1 N, l" [8 j( K. ~
5 v3 X6 z8 T$ f
: b' ~1 ~& u, u

( h4 \5 W. S$ l: @9 @. n
7 c6 S* W+ t' j  g% I7 x& |" sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& e9 B& ~) J5 p- O; u

; }$ p" E" h# J! X! M9 @/ G$ \) P
8 [9 f+ K8 f* m. L4 b, `
' Q$ {# h& Z) i) t# s  r( X- j





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