嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ a; C# i! O% J% X) X核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 t: k8 j* g" B! ~& X% t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 A: s' k# @8 o1 X$ w3 ?9 ^- Z0 T' u# Q  o7 I0 O" K) N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ a5 }  {+ H0 {3 Z7 _2 T
- S4 u$ ?  O2 Q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. q/ _/ d' i2 K1 l, A3 E/*
+ e( i- o* d  `3 D. Z+ X* Check memory range for valid RAM. A simple memory test determines8 d5 w- _( Y% I+ _; `) k, \0 Y
* the actually available RAM size between addresses `base' and5 }/ o' k  m9 q9 `
* `base + maxsize'.
& L3 [3 Z. Q" s$ n. j' l*/
4 _3 j3 I+ g1 b" L8 `+ @long get_ram_size(long *base, long maxsize)
% t+ J! \% v! c: m8 ~2 a{
+ W7 F" C6 A, l' n( E4 K        volatile long *addr;1 w7 _/ j& z: }- |
        long           save[32];/ W' u1 R# \: ~8 T3 C
        long           cnt;
- U4 u9 ~  W* ]- a% J        long           val;
5 K, T; S1 Q2 C3 H* J" Z3 I        long           size;. p4 H1 j4 B: n" q8 L# n
        int            i = 0;/ ]& q- l, e5 e+ W

( {; y+ b5 i1 U. O        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; v. u; a) ^" g! l8 |/ j* |
                addr = base + cnt;        /* pointer arith! */
1 }3 H  Z- g2 f% z4 f                sync ();& L% a/ ^$ A9 r3 `. N: I
                save[i++] = *addr;: o  P4 ]6 h9 O$ N
                sync ();
, R# C1 h: p+ ^" d. B0 {1 }                *addr = ~cnt;7 r9 X5 o% Q7 H) f
        }
2 D* x( H0 T, l3 s3 L1 F
8 |2 [3 l% B: B5 ]6 f        addr = base;
, h# P* x0 `' U  _5 d        sync ();
0 e9 r7 w5 P! ]8 |( T  H' k        save = *addr;. m( t4 F: n2 n' F9 ~
        sync ();
( H/ [7 M1 ^* d' o        *addr = 0;
# C" t3 Y5 z4 V1 {' t4 ^9 i- `8 O& e( _
        sync ();
5 a; j$ J( C+ u% G        if ((val = *addr) != 0) {9 v  @' V. F  |4 Q
                /* Restore the original data before leaving the function.
$ b- A+ J& y% o1 m( e                 */' G& c0 s$ P  x; a) F! K- _
                sync ();, C4 C+ Y* ]* K) _
                *addr = save;5 D& o' d+ @+ |. `$ i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( Z! X& ]5 \5 p                        addr  = base + cnt;4 e0 r: u- C. ~, `; J2 K1 e
                        sync ();
+ g* [" O2 d4 C* y. Y7 A( ^% S- _' g                        *addr = save[--i];' G: ?9 o. S* H& s
                }
1 r, i7 }0 _4 c                return (0);
9 b$ w6 ]  j' h* e. M# b, y* ~! x        }
3 o. l* Z+ z0 b/ M
/ G" `/ f7 c) V* H% G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 N1 S( E2 b. f. l! ?7 w' G5 q                addr = base + cnt;        /* pointer arith! */. }. U+ w0 l" Y! P. j
                val = *addr;
5 a6 H% I$ [$ |9 h! y  e2 {                *addr = save[--i];) j2 O. \3 f2 ?# y* k& L. _% V
                if (val != ~cnt) {
2 r4 B( e/ }& i4 @" f' h0 \                        size = cnt * sizeof (long);/ E- F. y, Y6 q5 v( V0 O. S2 w
                        /* Restore the original data before leaving the function., C+ q: N2 V' g! J
                         */
! f% f, t; n7 W6 i% c0 F                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 Q# Q# q/ H7 y" W                                addr  = base + cnt;
1 `% r3 y2 ~. K8 A8 b' g                                *addr = save[--i];
5 G; w/ \4 ~& X                        }
& G" z" B/ o& i                        return (size);4 k: B3 C: G* X8 U! a7 D! h
                }
3 b4 j! T6 w# d1 C3 H; M0 X        }) u1 Y6 r! Y& |) M( G7 p9 t

" u2 \9 U- [# e. D. ^7 b  t        return (maxsize);* V$ v! }' s, M! E9 U2 a0 I4 w1 U( r
}
1 a* R, O, b+ G" K# B( g% Y8 ~int dram_init(void)
$ s5 F! k) E. C- M7 E  l3 R7 P{
9 y3 O$ S" l6 B& ?% H- _        /* dram_init must store complete ramsize in gd->ram_size */* Z5 x; O: E+ ?6 T
        gd->ram_size = get_ram_size(
: U8 @6 F7 [9 u                        (void *)CONFIG_SYS_SDRAM_BASE,( ?5 `% @6 d: @; f4 G( H
                        CONFIG_MAX_RAM_BANK_SIZE);3 t" i  b# u) f6 V" {
        return 0;
4 K- b  G) P# j8 k}* H: ~9 L/ z$ I9 f# g/ I1 Z
( A3 d6 B6 V0 T( L" G# ~
7 e" A3 t+ d5 t8 g5 H: |

. a6 Z0 W$ ]4 M% K0 e7 d. s
2 G/ F3 ^: H) c5 Q) uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. k8 a5 P- M8 Z- \# }

' w, ^; ?& ^5 T
, {3 r0 F; t0 n+ m1 K

6 a/ l$ u, N9 F! _: s1 {




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