嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ w& O1 r/ a. P: d核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" s7 H% x8 h4 W7 J/ R这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* h& ~7 U2 A% F8 F. B  C5 j

( c2 b8 a) [' p是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' y+ B: [- U' \9 c
4 l# {6 x+ \3 p

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* o) |- ^2 b$ O6 @% C* ]3 y
/*7 b! D- g' v8 G5 t
* Check memory range for valid RAM. A simple memory test determines/ r" {/ S/ ?! H
* the actually available RAM size between addresses `base' and
$ C7 n* u6 T- f: m  I* `base + maxsize'." E" u$ _$ m! ?! x3 K0 x
*/) u5 W2 D8 [+ @( @2 L3 F
long get_ram_size(long *base, long maxsize)  ?3 g: e5 @6 J/ E/ [# d' o
{
$ [; X2 i( `. ~        volatile long *addr;  c2 y$ y# K( i. c# y2 a
        long           save[32];
+ }+ t/ j! P& b- ^0 E        long           cnt;
4 V  M: R9 a  J0 \        long           val;
9 h+ i; ]+ K8 l( Z' X        long           size;- y" U# c+ b2 g
        int            i = 0;8 s' F" j/ U  F% ~
9 v1 V) K, F" G4 N* N& @1 u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* H7 R# |) d& o$ S: @# P. P                addr = base + cnt;        /* pointer arith! */" y+ c6 n) H# W" _* z8 Q/ i
                sync ();5 @; l: c/ R5 T: c4 \5 M4 X
                save[i++] = *addr;
- \, e' V$ U% M3 t0 t                sync ();$ l. {9 ~3 W# Y+ h
                *addr = ~cnt;
. k3 }# i8 B% K  W6 G        }
9 G" c. [2 I% S0 m. ^  H
! U8 y( e( V7 |: `! @3 k* E& @        addr = base;
  N  L+ k( z5 F0 S" L: c0 i* H8 h        sync ();4 e5 `9 c- e$ E: y2 }
        save = *addr;
4 `. K. M6 }- U        sync ();
$ \& g; v  p4 N5 `+ R        *addr = 0;
' m0 Y1 Q: I; o; A" F9 ^2 |" @4 R! l8 N7 i8 A& [: b* q# m
        sync ();
4 e& |) W' i5 o, e; \- t/ @/ t0 N        if ((val = *addr) != 0) {
/ X& w; d0 j! q0 W" C                /* Restore the original data before leaving the function.
( Q- j: M1 [& y/ r* ?1 x                 */' a  `8 R/ }4 S- n  p9 W
                sync ();* m" v; C( q( u- a. m) r
                *addr = save;  K! B' V0 g! I3 K8 `& V1 v  q) i$ }  p
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. _& C7 E! M. n3 ^  C7 \                        addr  = base + cnt;* K# C- c2 s9 i  W; }* ?8 U' Z
                        sync ();
8 }* M7 y3 _& ?  j3 k                        *addr = save[--i];9 S1 s. P# J  p- Q
                }: m# E1 p1 m: K# H, Y4 J, Z  K
                return (0);/ b7 {# e% }8 `$ s# y) k
        }
1 R  I* k0 w2 f4 h9 J
6 E, \( D' N  d1 x# g  w6 j        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 l* d5 r+ m8 _# o& R5 o- e                addr = base + cnt;        /* pointer arith! */2 T( I# Y; G$ u  U: t( }8 Z% G/ ~
                val = *addr;
# {& c4 z$ p* @' L8 ~                *addr = save[--i];3 D; ~! l; B3 a3 N" Q
                if (val != ~cnt) {8 v/ q) x6 {) x# k
                        size = cnt * sizeof (long);8 \5 g# w6 {% `/ A$ `& h" J/ h
                        /* Restore the original data before leaving the function.( I) s* L$ a* H" d
                         */8 Q( ~. v' Q; y% f0 [1 ?) v, Z* |" T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 C3 f; b) {# S, h! E! f# j
                                addr  = base + cnt;
( m3 @/ }/ h8 d1 H                                *addr = save[--i];6 e6 Y5 k4 ~3 h" \
                        }8 w' q5 |( p% M% \# |' q
                        return (size);
. X6 y. p' \! P0 Z0 E                }" J* H. w& ?% v% B+ o% a
        }) f4 M1 b8 C+ L
2 `- g! m2 Q* P; P1 n1 J
        return (maxsize);
$ _+ X0 n. y& V$ `/ F, H# b}0 a+ u; a4 @& Q: t8 e
int dram_init(void)5 ?4 V8 C; |& q7 Y/ x0 l
{
! \0 S" o1 X  i: f+ ~( u/ |        /* dram_init must store complete ramsize in gd->ram_size */! D% {) T+ z) z7 H, }% y
        gd->ram_size = get_ram_size(4 o8 ]8 ]" b$ i! V) Q+ [+ Z
                        (void *)CONFIG_SYS_SDRAM_BASE,8 ]8 v. Z$ u7 N* V* j
                        CONFIG_MAX_RAM_BANK_SIZE);# i5 E5 i  K. j' \1 D3 \
        return 0;
/ O% U( u8 ]6 ^4 q+ R  U+ [8 `1 L}0 Y% {) B! ?1 M: h

3 r* {$ [  a: K# F6 m
% @% P3 i* r# B5 b* m8 {' `1 h2 I/ z/ ^8 F; h& }( G: ^4 J! C( C( z

! a: f4 [2 z& V2 A( \  UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 _$ ?& u" |7 v4 K% \7 @

; I) \2 F. P2 l8 a
: H5 u- p- I0 }6 t  z1 v

7 T$ D6 z2 w) O) g




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