嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ L; O: ]& w' T; K  {核心板2:DDR2 256M Byte   NAND FLASH 8G bit' k/ j: n8 w+ e( A$ ^, A' ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  e6 [& ?1 X' N) X; `1 k
% f6 o$ F: q# h  q- Q8 \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 _) {" i5 b- b# b  i
) O1 J; r$ e1 V; v0 @; D& r7 z1 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 D4 ?) g/ H/ p. v5 U/*/ L# O. d2 {/ E
* Check memory range for valid RAM. A simple memory test determines
& _% W/ i# ]% P, u6 Y  Y* the actually available RAM size between addresses `base' and1 U0 h: V  f) \% A3 y/ i+ l. v
* `base + maxsize'.
2 X( \/ @. e' Z: ]) L1 ?*/
+ l- Y2 B) k( Blong get_ram_size(long *base, long maxsize)/ I! z  g% }9 t& q6 m# p
{7 k0 R* m3 O9 s$ l
        volatile long *addr;
% h8 z5 w$ W) o) P' s3 L% L8 O        long           save[32];
2 S& H6 p5 x- u" ]$ g$ d        long           cnt;  L) G- e4 }$ G+ P, I9 r/ E
        long           val;
4 A% K2 ]9 x! X. R& G1 k7 H/ F        long           size;
) E  Y8 f; L: _7 i2 z        int            i = 0;% S  G7 y  R* B& O
* ]5 F: f  O! s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 B: J# h4 n7 j' ]3 Z
                addr = base + cnt;        /* pointer arith! */. n3 L& V4 M4 q9 R( l9 s4 p" H
                sync ();
* ^6 B- \7 ], L. Z! N: Y; x                save[i++] = *addr;
4 m; v6 l( W0 p4 H$ O! t9 E" z8 _                sync ();; l' r. D9 k' b/ X6 d1 ^- p/ S) ]
                *addr = ~cnt;# |6 s' v8 J, B; d5 y
        }& y2 z  L# a. j: s6 q; @% h

1 r4 o: D/ w2 s& \  x        addr = base;! T5 h' I* |* ]
        sync ();
. f3 F4 }7 w, G. Z        save = *addr;
' Y! x! A9 N# N) y" U        sync ();
' ?1 K! `( l0 a5 x' L        *addr = 0;
/ X# ]# Y, @, l" y. }
) c7 l( p9 b. D7 ?% p. O7 y, i        sync ();
9 O6 O0 W0 \5 k3 ?: b5 Z        if ((val = *addr) != 0) {6 g0 ~7 Z' Z* t
                /* Restore the original data before leaving the function.* N! ?# q2 V/ J! |, T' `
                 */
5 L9 w8 Q6 j$ K4 Q) y+ j                sync ();
' _+ T8 `" E1 b$ A                *addr = save;
: {9 p; r% T( M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 j# o3 B, R2 ?7 i6 Y. h8 m. y0 H
                        addr  = base + cnt;$ a( B0 W$ _# C+ Y/ z: _+ _0 s& Y
                        sync ();
/ o( J: X, @3 G4 u5 @                        *addr = save[--i];
' ^5 l/ @0 u4 \% T                }6 X, v( [" E+ v8 E7 r  ^
                return (0);
: b1 f) ]  E) G: c        }
4 f+ H- `8 z0 e& T2 c
2 ~# I' w: D, p& V1 z; Z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 N: t+ n# T# C, s2 X( f+ q
                addr = base + cnt;        /* pointer arith! */  X! y3 B' b3 m, a* e1 }- F
                val = *addr;
# C& ~6 u& f) P2 k. f! K0 S7 I                *addr = save[--i];
0 Y( p& W# d2 K1 s( X                if (val != ~cnt) {
* b! R' b: t4 e# c+ E                        size = cnt * sizeof (long);
0 _, X- {  |( i; Y5 R" {& W& R& p                        /* Restore the original data before leaving the function.
8 X  M9 q0 h. R, U9 A5 P. |                         */
5 A0 [3 s1 _6 r# f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' V$ V( p' {2 I! Y$ y& e                                addr  = base + cnt;
2 T. v* u  W( ~                                *addr = save[--i];2 [) J6 C% C% S% H( R! v( V
                        }
- Y- @- X% E6 d3 N5 U% C2 S; o                        return (size);7 r, ^# S  y0 e$ o( m  q1 {# ~8 B
                }
+ D. F% |* E8 |. b        }" [. e8 D. u& Z" h1 [

( A, f# m) R! S0 m1 j% B1 ]! d; f  F2 s        return (maxsize);
& L8 A6 i0 e0 V8 {  c. y}! x: ?( G5 y! H
int dram_init(void)% J6 W5 e% B. h" O, L
{- t  X+ y1 }; f9 B# m
        /* dram_init must store complete ramsize in gd->ram_size */
( y# r/ k. q* K. c+ \        gd->ram_size = get_ram_size(4 Y3 w+ M( j2 A( M
                        (void *)CONFIG_SYS_SDRAM_BASE," j0 B; C6 h, h( h1 \
                        CONFIG_MAX_RAM_BANK_SIZE);2 q) T+ o. {1 H) S  e6 s, X) x
        return 0;
- }3 R3 F2 J& o}7 u$ B( k1 E6 T' v6 V# ~
* R  R3 f3 k( j6 b1 {

# @! R  e# e0 X3 m# P% ]; R0 ^" ^9 W3 a' Y2 y( q

$ Y; Y. ^* N% ]1 \FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 }7 m+ f3 A5 B9 e- ~: ?

$ u# E: ?$ @' w0 E5 r+ Y
/ z# X1 L& @4 F# x) C# d1 {
3 W$ ]: J) }5 X; |; C# ?8 K8 w





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