嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 k  h8 b6 P9 b5 C核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% P& T6 C- k. d. O7 i8 I* L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, g9 c) s  R! h  L4 W4 S& f  }9 \% d' M# `$ [: Q. Q: Y; k/ O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- g. f1 m- p8 b+ s8 e
# f' ]; p9 U! ^  Q, ]8 s4 b7 {
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 X& V' {& P+ c/ D% @/*! W# S% x. E' {# J
* Check memory range for valid RAM. A simple memory test determines
* A4 G4 i) C$ C1 @- r3 u$ i& ~* the actually available RAM size between addresses `base' and8 V' U7 i3 w1 U, w# {* y8 W
* `base + maxsize'.
8 Q2 V6 U% S0 F# W* |*/7 L0 e3 v  R0 o1 f3 i: o" _* D
long get_ram_size(long *base, long maxsize)
' |% g1 Y" ~: t{5 W7 ~4 T0 y" S- {
        volatile long *addr;
/ x1 p& A( ~+ K- R6 K+ _        long           save[32];
# {0 [  m* R2 _" z1 G! P3 z        long           cnt;# j- \- N% m9 Y* c. u
        long           val;
1 K# X& C) k5 G8 H        long           size;( e3 a' Z' n6 R% a6 F
        int            i = 0;: l  \, c# B! p

6 a3 `0 c& O3 H9 s0 r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 A* T/ U! g& h9 `' @9 N# }                addr = base + cnt;        /* pointer arith! */) B3 H0 {# y/ R7 L
                sync ();
2 |* r/ e1 p- ~7 i( D+ w                save[i++] = *addr;  ]8 W8 J* d, ~( [. k
                sync ();
* h  N9 J2 J3 s1 D0 \. V                *addr = ~cnt;
) g" S! i) f! _$ U        }
4 \; n7 r; m5 u9 s+ p) F4 i$ A) r8 N& c% y& h; u6 X
        addr = base;
$ n4 @; D  ?: K# t% W4 ?$ y        sync ();
/ o/ Q& U& }. |1 r$ G        save = *addr;
3 b. w% b9 H2 H8 T        sync ();1 \$ \) B4 P/ {0 E& S2 }
        *addr = 0;
; K9 g% Z# E* ^' d# m3 ~5 W2 z# p8 ?4 K9 r6 p. k6 V' U. B
        sync ();
+ `8 A+ I* T, l  U, u        if ((val = *addr) != 0) {
6 A5 {1 P) u/ B/ S1 }! ?                /* Restore the original data before leaving the function.1 f& R% g+ y, k& |
                 */
' K  X/ U/ x4 J                sync ();
- R: L& B( X1 j# b! L                *addr = save;! c/ R% |4 L5 h  L- N3 a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 j* g* p# m+ g5 ~                        addr  = base + cnt;" A) n' h' R1 t
                        sync ();9 P7 X4 H% P! @9 U! Y
                        *addr = save[--i];
6 C- i& j$ Q) C: M0 q) v0 t                }3 }: ?* Z) m: p, @8 n$ `6 G$ n! f' h* `
                return (0);5 d8 c& ^* q5 m. W
        }
. G& p) N& ^4 p
6 J, a/ L$ J( b/ Z9 U7 m* C' F9 }        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' ~3 j& h; l* m0 v" b                addr = base + cnt;        /* pointer arith! */
$ K! N; }: }$ U- N" k                val = *addr;
+ Q/ A9 q" Y6 ^$ ]$ x4 U2 ]                *addr = save[--i];
, J( ?6 ?& f9 N3 V/ W1 ?                if (val != ~cnt) {8 v3 q6 F( ]/ n
                        size = cnt * sizeof (long);% N/ c' M& m$ {' z( z' ]& B( h- {/ B/ X
                        /* Restore the original data before leaving the function.5 k6 |2 L7 p6 \3 b8 {3 e1 ^" n/ d
                         */& t, v" |5 W! ]: x4 c# J( N' P0 V
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 P, M: {+ F' ?  d$ y2 N: H( p; C5 R; {
                                addr  = base + cnt;
( b, j8 l+ f( A0 w: F0 r                                *addr = save[--i];& J0 i4 ^% U. v
                        }, @: Y; f- [* x/ q3 N& y
                        return (size);
9 {; P0 [; N! c5 v1 I0 f6 ^                }5 }. a0 v1 m4 q. v' }$ H
        }7 l+ \2 z( v* f+ `
- C8 G. E! z+ p- ]- m0 h+ ]
        return (maxsize);
5 D! i; z& q6 n/ O! p& F# L5 A}+ p2 U9 f% W2 X8 x2 |8 S
int dram_init(void)
( U3 C' r( |3 O, T' V# `8 D& v" L{
+ T  N* X# k! B2 ~0 G, W        /* dram_init must store complete ramsize in gd->ram_size */4 G4 g: h, B1 L
        gd->ram_size = get_ram_size(
. i. @6 z1 N" x" w                        (void *)CONFIG_SYS_SDRAM_BASE,
8 B- w% @% ^1 B                        CONFIG_MAX_RAM_BANK_SIZE);
! h4 P+ v" y& Y: k6 c) T1 R        return 0;* W+ C0 F0 Y) d$ M1 ~0 c9 s4 t
}
6 ?) Y. h: _; t  `. X$ k6 n" `$ j# l+ d; L2 I- p2 m8 K

9 n! a0 v* G6 U: ~  k
# u8 O6 T! ~- E1 _, Y/ x6 [* g- H- f, S/ s$ h6 N8 {: |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( ]2 p8 s/ h0 A" j+ \7 {
" }* L) b( U" f9 b3 [4 O  U  V3 H$ V

8 S, W2 h6 [7 I% c+ @( e




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