嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 ]$ D1 [) G6 i1 T9 P* h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 n( d' d8 \" v4 u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; V" d7 K" Q: u/ n, S4 _# W! ]/ a
# p* X2 k1 m+ W
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 C5 P+ z0 g+ K- i) ]5 h+ D
' Y# I% d5 Q- Z4 A+ N) m$ [

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! E" _+ }5 Z5 a2 z
/*
: n2 ]+ n: `1 p* w% J+ `* Check memory range for valid RAM. A simple memory test determines/ H+ q, ?$ _2 B. D! }7 m
* the actually available RAM size between addresses `base' and& {- [% q, r2 u8 r$ u: L
* `base + maxsize'.# C2 v, H' r% Q* `7 e
*/! w$ Q6 p. w" I( ^# M2 P
long get_ram_size(long *base, long maxsize)
# H' [9 @. l  R8 X/ l8 L: E{5 I1 a$ M$ K& r0 S
        volatile long *addr;% J: ~+ v5 X1 T( I! T9 r8 e
        long           save[32];
$ O3 }1 {' x5 v        long           cnt;
- x4 m$ l3 `, I- |% s. W        long           val;! V/ N# S  v' i7 A$ E
        long           size;4 |4 k5 W$ w( D' L& N7 w
        int            i = 0;
4 t, _; F6 c% G* k* O" M8 V- V1 Q9 e9 ~" g1 L
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 ^& {6 l2 R4 {* C! |3 E                addr = base + cnt;        /* pointer arith! */
% I3 P4 E) O1 p9 s! T  [                sync ();; U' o6 [$ o4 J# g  O! ?
                save[i++] = *addr;
- M1 c# o+ o$ q0 H6 H7 ?                sync ();9 o: `7 Y$ ]& ^5 R( E( s% j( N1 U
                *addr = ~cnt;, j$ L2 h0 q6 h
        }. y5 a; Z& p7 h4 n: V, U! M5 f
3 W4 ~* y6 [; H! z
        addr = base;
! X3 T/ C4 G& o9 s8 d* Q        sync ();
+ }1 d) `& v* \$ Z/ q! w4 ^        save = *addr;$ L8 x6 A6 Z& e+ }! k/ M
        sync ();
% i3 ]. ?# O; W3 I/ Y6 J        *addr = 0;
+ D; f$ L* q# _
7 I5 t5 I6 G. X$ v! S+ F0 A        sync ();
8 X+ J  v4 V2 u" D        if ((val = *addr) != 0) {0 D" w% O% p4 |, _9 `
                /* Restore the original data before leaving the function.+ d& A2 L9 y6 U+ d! I/ Z5 ]
                 */* k7 o0 b  ~0 d/ ^$ n4 Q: Q' ^
                sync ();/ U, @$ a; w8 @  D: l; Y
                *addr = save;
( f- q/ S6 Q5 [. {7 h4 F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* N: g. d5 G! H% a$ }                        addr  = base + cnt;" ~3 [; T' B5 O' g
                        sync ();" Y/ E8 Z0 b  b8 s5 b
                        *addr = save[--i];
1 f8 J0 u  S( I* v                }
. l3 D! }4 O9 s                return (0);: [3 F  ^" U% ]3 g4 i+ `
        }
# a, e) u5 |: C- [% I) G0 X6 ?7 r& v8 J' x
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 c4 G, g# v' E& _0 a/ l
                addr = base + cnt;        /* pointer arith! */* M) z3 r! u3 s' X) q- a2 b
                val = *addr;
- B: Y- c5 L7 `5 [9 d' @                *addr = save[--i];
& v8 o; ?3 u  s6 y! R3 t                if (val != ~cnt) {
& _" b0 y% ?1 l% c" c- y                        size = cnt * sizeof (long);
9 W* B$ C  y0 a. E) G                        /* Restore the original data before leaving the function.9 z9 J; c3 [2 D/ u# f( g) g
                         */- S/ V# q$ w. @: s0 ~$ p
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 h5 W) d$ S9 }" K                                addr  = base + cnt;
0 w' ], O  W" X/ g                                *addr = save[--i];
* K) I; X1 O, {; a( N                        }
4 i. L. O5 l7 Y& c9 h                        return (size);" o+ ^8 j" [; {0 O: `
                }
* Z% x: ]: c% ?3 t, o! Q1 M  P' y        }
4 h( O& q+ h8 B1 S+ X$ x
; a1 p9 t1 H6 F. a( h/ q& h+ r        return (maxsize);
4 F, E( ~3 ^8 I8 J$ g; c: f" Y6 ~( |}
2 m+ }& R. w: W9 Jint dram_init(void)
/ T& {3 G- c* g{; v9 p) A! t( Z% U( a8 l6 ^  C, c
        /* dram_init must store complete ramsize in gd->ram_size */
( H, D8 _6 P4 @% [        gd->ram_size = get_ram_size(
8 L" i" a% Q  B) ?& E                        (void *)CONFIG_SYS_SDRAM_BASE,
+ v! X; @# F) [* r                        CONFIG_MAX_RAM_BANK_SIZE);
# h( V- A, t2 ]2 M  }) p        return 0;5 a" Y3 ~6 z2 ^2 l/ P8 c
}$ D. i( U4 I) V

: e/ |# O1 u0 H& w) m5 I* n. q. b1 ]3 x/ o% {
; f2 y0 w8 n' I: l

3 f; _3 V& a* l! F8 Q/ RFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" q$ P5 U" ]* O
3 f- x5 v7 @' K( V" u# ?
9 C; q6 `, r* m1 [
1 g1 Y2 M. ^7 k& j/ P. E9 }6 R





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