嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, e& m7 V  a5 T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( b0 j7 u( u# Z4 H6 S) \4 u这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ @' B- y4 v& x

) `# R, i& X$ C. \是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 y+ r7 T& J, L! l! q! I

/ A, e& [1 K" R/ c; o
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& R: o2 S' R% ?0 N
/*
/ ?6 c( m( `$ H% D% t# {* Check memory range for valid RAM. A simple memory test determines: H2 {+ o+ D/ T& _7 v! j
* the actually available RAM size between addresses `base' and
- f; I8 |  w& R4 N2 z8 v* `base + maxsize'.
* E: S% ?9 y: h3 r) P% u: o*/1 y  p: a* }' v7 u- b
long get_ram_size(long *base, long maxsize)* {. ?# Q5 D7 k4 V& R' F
{
; q# F" O/ D* f  D+ h9 h5 q        volatile long *addr;* @0 u+ S1 L8 x. a5 J2 ~0 j- L
        long           save[32];$ s$ M' f6 F* |' z
        long           cnt;
) r7 Q# P2 {4 R2 ?) L6 Y5 V( R  r        long           val;4 I! d& X# n2 V
        long           size;, y4 n! J, p' f7 b( @
        int            i = 0;
! Q; R7 v) Y) t: v% X) o4 t0 S1 t+ F4 ?/ \$ j; g* b
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ H$ G! \, Y, {7 o  l( W# Y  Y
                addr = base + cnt;        /* pointer arith! */
2 `+ v, z5 N& B9 C& j1 `* _                sync ();9 U) k1 C! ~: a: v
                save[i++] = *addr;' S5 m5 |( K( E& S* F
                sync ();
" E% ~8 A7 H( _                *addr = ~cnt;# e2 W# h; z8 H
        }. f. k" }. P  n! g1 q# F, `1 ?. S
$ ^, ?+ v+ \% B& d9 U' E
        addr = base;7 A/ |+ i+ m8 |8 f" Z
        sync ();$ G$ R$ B% Y( {% ~! ]2 N0 {+ {+ c
        save = *addr;7 y" e! A# d7 S, \2 B4 `8 w, n
        sync ();/ d2 j5 I$ g, h% D# T
        *addr = 0;1 ^! \4 U: }' @( w6 \4 u5 b) u

8 ~# l% n# M$ L        sync ();! |5 ^  r/ q7 |
        if ((val = *addr) != 0) {: Z& y8 A4 l+ L6 ]$ d2 R5 |& g* g4 _
                /* Restore the original data before leaving the function.% B1 B3 v% ]& Y* m3 j) {  F
                 */
4 N7 y8 q& a, M; y3 c& M; r% Q% k! }                sync ();% P' O6 X! I4 ^: f9 P
                *addr = save;
; z6 b: T5 `& J( v3 H                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 t  G/ P8 O! V0 V                        addr  = base + cnt;. L1 j5 L& e  m, I) R
                        sync ();
1 k0 c( ~( |  J! _                        *addr = save[--i];
: c% P' y3 b* s/ m9 X% k                }2 o0 k1 s* x& b. m2 O' d
                return (0);3 R7 _6 F1 c! }0 d& ]
        }- `3 h; V7 p2 Y) M

. S, w1 Y. j9 S5 h, x        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 K7 m& J- s7 k- [                addr = base + cnt;        /* pointer arith! */
$ d, W4 h8 U6 }2 S" o, K# r) M                val = *addr;
- ]( Q; K' T7 e* Z                *addr = save[--i];- r4 T' S! v4 c' s5 y
                if (val != ~cnt) {" t  \+ e& D( d. J" m; l3 J
                        size = cnt * sizeof (long);) i% c: B$ R* _4 v% [( {1 r' I- ~
                        /* Restore the original data before leaving the function.( D' t2 G. p2 G' m2 d1 n9 U" w
                         */
. g& \$ x3 m, O1 X; @, y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& o6 J; n1 Y% K+ [4 r& E7 I# ~                                addr  = base + cnt;
6 Q: Y/ w2 v( g" P- T7 @                                *addr = save[--i];
. X2 V7 \/ M, V, V                        }
1 U7 i; M2 t$ T; ]; W$ V8 K+ }                        return (size);
% d2 G4 f& R! ]9 c1 Y8 I                }
, |0 h" ]! Y5 D# |: K/ J7 F        }
5 J. D, c  g' [; W8 z4 d% E3 E
  [7 M- g+ L" B& J2 R3 F        return (maxsize);6 g2 ^8 l+ F( \# g! C: r
}
: Q, h' d* g# J( |7 q0 Gint dram_init(void)& G% p/ q0 W$ H6 @! n9 c+ l
{
2 t. A* s( r7 ?, z        /* dram_init must store complete ramsize in gd->ram_size */0 }  H7 z) e& _
        gd->ram_size = get_ram_size(8 [) ]9 A, I$ A3 N5 n3 A% d
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 f8 H9 @9 q4 B0 h8 b+ z                        CONFIG_MAX_RAM_BANK_SIZE);
, \, c) q/ ?0 x        return 0;+ V/ Y3 k7 b' E) H
}
/ X, W( W+ A3 k# s9 V' S) Q+ p7 `$ F: H* T7 f- d: F

0 D6 J; {$ }& R" R6 }2 R: C8 s2 G# \; h8 F: z  [

# B1 @; ^* r% s$ w, FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; g+ }* s! D* d+ b

  j& [) J8 f$ G" {. n" N8 a5 f9 m) ^3 C' G
0 Y3 L- F6 T, Y% V# q





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