嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. Y( g# C  U% F
核心板2:DDR2 256M Byte   NAND FLASH 8G bit& D  c* U4 c  y* h: ^; v6 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& [+ z. P& L% `0 b% P, [, V8 E7 T5 N( ?
, y6 ]* s9 g+ o5 \8 \是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 l3 [4 }% m) W
. E6 S+ |! Q8 H3 C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ F- q8 U3 I! \$ _, i/*
; J" L2 D% s  `6 z, z/ z* Check memory range for valid RAM. A simple memory test determines
% P+ X( H; E* t: d8 |7 a3 e* the actually available RAM size between addresses `base' and
( X% ~: G. J; x0 J- |0 \. V. }* `base + maxsize'.6 F: C1 y+ `3 b6 [
*/
, W: u, V6 s: i+ L4 d, a$ o! t8 tlong get_ram_size(long *base, long maxsize)
9 j  j8 y5 l- |{
+ C  K& y* E! T+ I! S8 O3 w        volatile long *addr;
7 A9 G! r- l4 [/ q& [' B        long           save[32];1 {% F3 h+ f- T
        long           cnt;6 \$ W6 F2 g2 g; W' P
        long           val;' Z+ Z+ {% B' V- G1 B1 Z/ h. \
        long           size;
: U: O/ j  L* a  M) C8 z! E& `        int            i = 0;
6 S) o4 i/ m) a- D; o2 G- s' [7 E8 ~6 x3 Z1 b* f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* ]& D% ]9 k& n1 X* x  I6 m                addr = base + cnt;        /* pointer arith! */; W2 @3 P2 d4 |; ~0 u: v
                sync ();
/ L6 `3 T5 f" Q" I* i3 i                save[i++] = *addr;
1 A' y. C" D. O# K" z* K                sync ();( u* a: Y$ j. O/ A# Y% G8 e9 t3 @
                *addr = ~cnt;
: r9 K9 d. @) p2 `, Z$ W0 x( R        }, p/ b1 K  M- d# z/ `

: I9 ?# C4 D4 q( J" F        addr = base;
/ G7 e( v! O5 M# _! m& E8 Y        sync ();& P' L. {5 b; d! K3 S
        save = *addr;
3 n0 a- Z8 c( M( u& f% y+ T        sync ();  j& w: l7 d1 e3 I1 n' T
        *addr = 0;
- ^" w" v+ b9 t* c
; _) G2 K4 C* y4 l        sync ();& ~/ _6 c2 r) W) O: J
        if ((val = *addr) != 0) {
2 N+ A0 ?; C5 J9 P- \2 g                /* Restore the original data before leaving the function.
4 D/ ~& W/ a$ y* \                 */4 S) }  r, f. v& C
                sync ();0 p+ r. W5 _* P4 Y
                *addr = save;( R4 l: _/ h4 [. Q7 i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, f; `; e8 _4 ?+ r6 G  T
                        addr  = base + cnt;
( M4 M2 b, ?. E# I3 x                        sync ();
7 W" l: p, I1 y# _- w                        *addr = save[--i];
3 v0 ^* G  H0 B2 v: w& u                }6 c, J7 r2 {$ G$ H1 K. O' M" L
                return (0);: V% B( _3 W  K3 s- c* _, k
        }  S$ Y8 X2 E0 ?( y

2 M: F( p$ U! _) y- y* l% I        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; d# n0 j( O& J  r4 n                addr = base + cnt;        /* pointer arith! */
% s: g5 N4 i% x; }4 }                val = *addr;1 \' N6 L4 K. m4 W
                *addr = save[--i];
/ `/ F# f$ ~3 N* `$ d5 C$ v" n( R                if (val != ~cnt) {: q* S6 b# b: Y) [& c# l
                        size = cnt * sizeof (long);! q" U7 y0 u3 b# I
                        /* Restore the original data before leaving the function.  k1 u  I3 y! M( G  H- D
                         */: s( e+ y, i+ E. ]/ e+ r" e, I
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, @! I: [( t7 Q9 L) C9 s# m                                addr  = base + cnt;
$ w3 C1 x2 Z. p, @) @                                *addr = save[--i];4 p- T7 k0 N7 g  y5 G( m4 g
                        }2 c, I0 ^7 B# o7 }2 o( X
                        return (size);
; y* p. j6 J3 n                }0 a& e; o4 U& W0 |: e
        }( j3 q0 i# i( r, F7 G. M* X
" D8 G9 `; V8 K6 o
        return (maxsize);: f+ P7 {5 a2 ]: H8 D4 k2 C( B6 L
}4 A- ]3 D! n7 u& K
int dram_init(void)
0 ?$ O0 O' t' g/ h) m" Q& u, J{
  G( o) ]) j9 ~) S        /* dram_init must store complete ramsize in gd->ram_size *// P0 D4 o: d( L/ u9 \
        gd->ram_size = get_ram_size(
+ u: Z6 |1 c  w% z                        (void *)CONFIG_SYS_SDRAM_BASE,
  f6 W/ ]. O; h+ S                        CONFIG_MAX_RAM_BANK_SIZE);
: g! O- x1 g2 o- z' R8 F/ u        return 0;: T8 c" l0 X4 u8 D. i1 p
}& {; a+ a: y  Q6 v  F, Y* r% Y
0 }+ X2 u* v, T% M2 f
9 h+ i! C4 M6 ?- T2 N  ]3 E

; g$ u9 q& E6 Z. p/ X2 c$ o
- [' P/ ^- f4 o" q7 T; Q! U7 ]0 |FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! s: X0 S5 E/ T4 Y8 D  s

* Q( I6 O9 e2 r* i" F1 k" O: [8 d, @, e# V4 g
# {  r8 L5 M: a% L





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