嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# O' T4 u: Z; h9 n2 E' b9 }! g/ ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, A. w3 D9 u1 m1 d' d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 _0 n9 O1 F) {# \- i* {+ O" f8 v- U$ C1 Z) `. E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; n/ n8 m+ U. d1 m. l) B
4 P  d( o" b, i; }+ ~

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 t& k* ]. A' X9 r5 @( F8 y* h
/*4 ~! I$ Z, ]. I0 j6 G2 v3 D
* Check memory range for valid RAM. A simple memory test determines
! N5 A5 `9 O! m& r( j* i* the actually available RAM size between addresses `base' and! I0 N6 e; P' m* ^' p! {
* `base + maxsize'.
' V1 I( H6 r" Z3 }( W# u* t7 U*/
; W; E4 _& Y# K5 W: \  dlong get_ram_size(long *base, long maxsize)
8 U7 p+ C/ }3 V! `- b) y/ }{
! Z, @- g" A( w$ g& n8 }+ p        volatile long *addr;
9 u9 q4 N) ^& q! S. H% j0 g& r. q        long           save[32];! {% M- k% i" t0 _7 ]
        long           cnt;6 @# J0 [8 _4 s) Z+ w8 m% c
        long           val;
9 l/ A1 x( T) ]' d        long           size;
! V" Z. z- P9 W# M+ \        int            i = 0;$ E) W. r& b* @

7 L5 a" {& \. Y( _' W+ X        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: r0 h  D  X% P. o3 ~                addr = base + cnt;        /* pointer arith! */
! U: ]  o# f# u6 K5 p$ q) ^/ ]) E/ A                sync ();
4 Q9 |+ _6 s9 b, P4 u; d                save[i++] = *addr;( C7 b" g6 w  `# A: L
                sync ();
% U9 E4 u$ ^/ X. [8 D# R                *addr = ~cnt;! `& i! l/ y+ q& B6 t9 ^8 G
        }! Q+ c% S+ G- F. \

  p; I- l/ p# z& z1 z4 e        addr = base;
6 K, y' F% ~  y' k6 p        sync ();0 A4 H" M, J7 x& }% p
        save = *addr;
- Z* m3 U" Q* f: s        sync ();7 @' o0 p* b! q- V
        *addr = 0;
) v8 f# S1 \7 k4 o" v( k1 w
: j0 n& w# P/ l% m        sync ();
( ~2 p) W9 N4 I        if ((val = *addr) != 0) {( U1 y3 e- i0 K. y) A" b. h" r4 ]
                /* Restore the original data before leaving the function.
+ |* i' F, Q# F" L  O                 */
0 q% P+ S% z& c# w2 w3 M                sync ();
' }4 L2 k, }4 D5 n4 ~, K; i& j                *addr = save;# o* e7 K) \% l, m+ X+ U
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 [& j) P: l$ t2 L7 a8 @" l                        addr  = base + cnt;
7 G5 a8 ~2 z4 I- h0 F                        sync ();. g( E' }7 l1 s' N8 y6 p. Y* u3 Y' X
                        *addr = save[--i];
& A+ q3 ~) X3 C9 V                }
7 P0 A& S& x1 C, ]: w                return (0);; h5 [5 s8 T7 [* E. [2 F9 D
        }2 D4 l$ N/ \' H3 @$ M' [/ E

5 G* Q5 X6 W4 Z  M8 i4 a8 A7 h        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' N! h6 ?4 ]3 c- e8 ?, |: ]" A
                addr = base + cnt;        /* pointer arith! */
. b' T; S0 }" q: U: S# O, O                val = *addr;* |8 {. G& l+ W, Z: q
                *addr = save[--i];
! \4 V% I* t0 ]3 z/ O/ m7 F                if (val != ~cnt) {
5 n$ M' ^7 ~3 q5 V" y                        size = cnt * sizeof (long);
7 C, |- y9 P2 A2 q- W) o                        /* Restore the original data before leaving the function.* a/ w( K! @6 z
                         */% {! u; z4 U3 p) c
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# g/ E) n* [% X( [7 P7 O                                addr  = base + cnt;
0 v  ^; u+ k# s  Z- j& ?' x9 e3 }5 Z$ e                                *addr = save[--i];8 T. K6 `6 [. T4 F; F9 r
                        }
+ s, Z3 l# C9 s                        return (size);
- Y' f, M/ _' S! K! Y' ^5 H                }
) W: m% r0 B+ p; K' w+ t" u        }
( p% C' u: E" M/ J6 I  k  |/ l
1 ~9 W& d2 x8 `6 y1 f+ l2 a; o1 ?        return (maxsize);6 g, S; w; g; X3 s- F! O$ X
}/ m6 H& G! |* i& g7 \
int dram_init(void)- V) e* ^; g# V
{
1 k/ g. ?( o& u7 \/ G        /* dram_init must store complete ramsize in gd->ram_size */
) ^: W4 m/ |0 m" @: C& ^7 O, H        gd->ram_size = get_ram_size(8 u+ `( b& v; p! H' m0 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,% L) {+ U/ R& h
                        CONFIG_MAX_RAM_BANK_SIZE);
6 f/ P8 V! }* f+ k5 n' x! K        return 0;' e8 _$ i$ w+ A* U/ F" M0 m# I
}
+ Z# K5 A3 R3 y4 ?- V  T2 o8 m5 R3 [4 h+ [1 d* x5 a) o1 s
( n1 f6 j# N' c
; b+ d& y0 P  |% R! C" s1 {4 g& G

0 |5 T- N% l2 ^6 m# T) T7 M2 gFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 r9 ?" g+ m4 F, `

& j8 E7 c0 R/ g# C
; Q  ?* l8 H: t+ }( }& N

+ Z% j9 i% w( r




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