嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 e6 e2 s3 i! K; K核心板2:DDR2 256M Byte   NAND FLASH 8G bit, V8 P2 ^; Y# i" `$ _$ o3 J; S' g9 `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, w( m: H9 ^7 `9 B, B
+ t% j" Y. y( I) q* \3 Z' r0 i0 e( V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: n  L% w4 N% b) d0 b9 c, Q

# Z" A( v3 l* X/ v( x
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; [/ q3 E- V& R' T) L
/*; p; R  ]: M9 X3 j! }" C" \3 P
* Check memory range for valid RAM. A simple memory test determines  ?. |- N9 J0 P, V
* the actually available RAM size between addresses `base' and+ a; W, U" Q' X% U& _
* `base + maxsize'.
, n$ t0 v# H4 D9 ?*/
2 F8 |& Y3 n  u. r% K+ U/ }  wlong get_ram_size(long *base, long maxsize)& D: U% c$ w, z, _
{5 Y) d! ?  s0 w
        volatile long *addr;
+ `  T5 Z  T! S  W% k3 v        long           save[32];
" F! I( \  }9 e8 X) y        long           cnt;3 N* N0 `4 l3 C: Y; y
        long           val;* N% @6 L9 [) U8 r/ f- g: ]
        long           size;
2 m1 ~' T6 a% H( W$ g' v' C) Z% N. v        int            i = 0;% h3 y: X: A; J, q

& a! d) r! R* h/ G8 T: F        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 Y! @* w6 R2 ]+ ~% J3 h
                addr = base + cnt;        /* pointer arith! */
$ t8 F- a( _2 I7 R+ o                sync ();
3 y$ k8 h7 d& x+ k                save[i++] = *addr;) n- D; W* k. L! s( K
                sync ();7 J! L( c' N6 e
                *addr = ~cnt;" ]: @# t; t. M; k2 F0 O
        }
1 R6 q  ~2 U% K( c1 r! n) f/ O+ M& |! V5 ^7 \5 w& [$ b
        addr = base;
. j% ~) w3 T$ T" g" \4 ~        sync ();
* y; Q7 x% E) m6 H6 ~, q        save = *addr;
: l" H5 M2 f9 N. a; [  D        sync ();2 j* V  Q$ u+ q' ~8 Q; K
        *addr = 0;9 ]# z4 N; O* Q9 @- S# @

6 ?0 `4 b$ ~5 Y. P6 z1 t& p        sync ();
& N- P" U4 {* t7 D# t) Z& j' l6 z        if ((val = *addr) != 0) {0 ]: G3 N# M3 s& l6 b
                /* Restore the original data before leaving the function.! I+ R" E" O3 a! p5 C
                 */
2 Z4 U8 z4 A" f' L- F" L+ B! C                sync ();4 ~: n/ C$ w5 F$ y; N! e
                *addr = save;
6 W; f9 G- Y; k                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 s  r% U+ H/ _2 f' g- D! a
                        addr  = base + cnt;: U6 O9 G. d9 k, X7 ?2 Q
                        sync ();4 ?  \! e. I) F
                        *addr = save[--i];: V- x+ i. t& P3 n
                }, g$ j& t) E4 i5 R$ p
                return (0);
/ Y! s0 n( _7 B        }
" h  m, W) b2 O! c3 W  C
+ Z3 s) Q' q; z6 p, ?$ U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 d# ]0 K( {; l4 G( H+ ~: q                addr = base + cnt;        /* pointer arith! */8 F# W7 R, y+ S1 f5 ?
                val = *addr;
8 k: {" j" `. y6 _1 T5 m8 z* R1 E                *addr = save[--i];
! E! l$ |3 M) V$ g$ Y                if (val != ~cnt) {1 g( X8 n, Q2 G8 v8 W% z
                        size = cnt * sizeof (long);( R. a7 P) l! z$ K2 w
                        /* Restore the original data before leaving the function.2 l. _  `) [; l) s: z3 b
                         */
: B$ c) A5 y% n- k* M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: n  {5 D8 T5 C% w7 H5 C                                addr  = base + cnt;" t6 B7 n" ?) y9 H* Z/ r. @% U+ `7 _
                                *addr = save[--i];* k$ t5 _+ m2 y9 h) N
                        }
% n8 c: [2 T- Q' v- v                        return (size);; ~+ b, ~3 k( d' C* R+ J0 @+ d, k9 g# v
                }
3 D6 `' A: \' ]' Y4 a        }
' T/ M& m4 Z6 K0 O6 s1 B( B5 J  ^
/ O; e3 k3 F! ?9 M        return (maxsize);
6 x4 O+ H; X7 \( n8 G}" ^' m% e, {, f# {
int dram_init(void)
& `" @2 K  K0 m% m5 p# f! l7 M{
* Z  @4 g) k! x* s" C, ?" u9 H        /* dram_init must store complete ramsize in gd->ram_size */; N+ i* A9 P- _
        gd->ram_size = get_ram_size(
/ s8 ^1 O- @, E% O                        (void *)CONFIG_SYS_SDRAM_BASE,2 p; A! Y8 \4 B7 X( |
                        CONFIG_MAX_RAM_BANK_SIZE);
  x! |; ^$ O. s        return 0;
* `# Q+ t- N1 z5 r}
, N  w! x- }# H4 c0 U, O7 s/ X
* P, W9 Q3 u, g/ z
& r' ]4 @- f4 ]+ @
6 f3 u) b, ?% |4 \" ^6 V. E- H: e, x0 f4 u2 |/ U% o, c3 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 t7 C- G2 P' {- i- a
  t6 T& W8 x3 X3 n) H8 j; R* ]+ t1 Q) X
5 M" @: \7 N! c$ l2 ~
% G% @0 ^, f0 \" y2 U* ?





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