嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% N9 U' E; ^' d7 T核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 T+ e; f6 g9 `; C+ J) Q$ X5 F; F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 K9 }! h9 }+ `& m/ X( y) u# X* {: o6 f. K2 Y9 \* @/ M5 H# X3 L9 y" V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 d7 @0 V3 V: s. x4 {& z& C. X/ }7 L$ I4 {' `+ G# Q' q

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 O$ }: K% h3 ^, v3 a: A& n7 S6 D/*
$ e$ |3 p) h1 z* Check memory range for valid RAM. A simple memory test determines! D! i+ u6 u( [
* the actually available RAM size between addresses `base' and1 X/ K5 T" {- W  H3 S- ^% H7 e
* `base + maxsize'.
6 o( r7 o4 B4 |/ J& Y* W& g; M*/$ k6 h, l" K5 B; a, \8 A
long get_ram_size(long *base, long maxsize): j* I* c% {$ X# u- G' S3 x7 X
{4 T- K4 [! ?- m$ W/ M4 s/ {6 A7 q
        volatile long *addr;# N5 N. }* V+ D/ H* z4 d8 R
        long           save[32];, N" q3 \9 f5 `" E, B
        long           cnt;  K: p. S* J3 O  D: Y
        long           val;
& h2 i- o9 T* }% U; h        long           size;
; @  o, p; n, F) z; ^! F, d$ s        int            i = 0;
0 f' a# P1 E) J  a$ X& e! m2 w* H2 S% n* U' X2 _9 t1 v; W5 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 G  p5 `$ o( p! i5 ]2 j                addr = base + cnt;        /* pointer arith! */8 c) ~( u# {# }0 A) a7 H
                sync ();0 h4 G) _! P6 |" Z& N- ~* s+ n
                save[i++] = *addr;
) O! s4 E/ U# z9 n( [+ Z                sync ();# |& }2 I  X4 X' j  O" e1 H
                *addr = ~cnt;9 b9 k2 X& W1 s& L+ W
        }! x4 d+ }( {% {& k3 ~9 I6 K
. ?3 q- I$ |- Y7 N) J- P8 D; w
        addr = base;9 f. l7 V5 o! q9 I# k" W
        sync ();
+ [' C* W2 x  H* z        save = *addr;
3 ?4 F6 G9 n6 ^( g  r. f        sync ();
+ e* u1 d1 F# K( j        *addr = 0;" W2 G' E" u5 q* p) d

8 [1 X( l9 \7 L) q: X) o) k8 G+ l/ Q        sync ();
# T7 S1 n/ B# k6 A6 d  |0 w7 p. G        if ((val = *addr) != 0) {
" F1 Y+ k& j0 z8 }! n5 d* @                /* Restore the original data before leaving the function.
8 x0 M5 W: K4 V% \: m$ e                 */) ]& x* j! ?& J8 R+ l1 ]
                sync ();8 }* k( S2 M9 U0 P
                *addr = save;
0 n5 S7 K8 L+ u. d                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  K1 j) ?5 p! ]' [3 l$ ^$ d
                        addr  = base + cnt;4 m  l' Z2 X- M& B
                        sync ();
# o/ y0 M9 D6 H' G# f8 D0 T6 w0 G                        *addr = save[--i];
  |- z: E, Z. @2 J) E6 ?                }; S/ e0 M1 G8 f( j
                return (0);& v% |5 R! A: w0 ~- a6 N2 a
        }" l8 C& }: n# H- I9 m8 z2 T9 E

$ M9 p" a3 P& t. X, @' z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; d* e0 z1 j5 y# z
                addr = base + cnt;        /* pointer arith! */
# p! a2 f6 ~5 [. o6 {8 S                val = *addr;
# }4 M( w0 c8 A3 u' r                *addr = save[--i];0 U& w2 a' ?  ^0 L( V. a+ {( c
                if (val != ~cnt) {3 i6 p2 k/ n; a0 g) m. D
                        size = cnt * sizeof (long);
3 ~$ V  c& s+ \3 @  i                        /* Restore the original data before leaving the function.7 L: u& i% C9 Y8 H0 W2 d+ g" h5 l
                         */3 h: ^2 l/ X2 d  j5 B
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" x; S9 Q. b  a/ d                                addr  = base + cnt;
, C9 p9 v: [4 p                                *addr = save[--i];! q* M. Z2 ~; i. d
                        }
9 l" g- W$ y6 s6 G! D3 D' ?1 }/ r                        return (size);8 L2 c7 u3 ]! _7 N
                }
5 b8 E  a0 z3 S% j        }5 N3 b2 i! q. f) k+ p4 Q
- y" q1 D1 A0 B: W. b
        return (maxsize);
8 J6 T8 y2 u& w( {1 R$ u$ c- i}- ~$ m8 P) H6 {2 v( C2 ?/ _
int dram_init(void)
) v* N/ I5 x9 M1 k{4 Y, s# ]% e; Y3 K7 _1 r9 N
        /* dram_init must store complete ramsize in gd->ram_size */
1 _# _8 Y% Z9 o4 [- [5 [        gd->ram_size = get_ram_size(& S5 J! Z: t- N( Y2 w2 {
                        (void *)CONFIG_SYS_SDRAM_BASE,
% ~- j$ a# y* z; h$ s# B3 ]                        CONFIG_MAX_RAM_BANK_SIZE);
' C/ i+ T. x! |8 c  U# A        return 0;- l0 P8 ^3 t; q4 d( t' S; B: Y
}- z5 y( P" F# B8 R  n6 O
2 \, {. F8 v( F# c; {9 V& X

) c( D/ F4 P* a5 ]5 Y! D, L: q
7 W- l$ L$ X4 j( T" V. Z5 n' I2 ?# n$ }$ G( e5 I8 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 [# j& z$ u: Y# _8 i# n3 z5 v: J: Q

$ f! J6 k# X5 [" f
4 @, E* A2 p2 I





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