嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- h0 N# _8 D, d+ {5 J) o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 P9 w+ n  ]4 ]; b# u1 s  _5 ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* b/ U- j, C* I" c
7 X5 l# u+ f7 p. @3 {% A2 ^
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; i( J- c# h2 \- y; u$ i0 _$ g+ t" l% F7 o1 f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, g* V( n1 C# @* J/*& e0 w9 [: U7 G/ W( O) ]( Z8 ~! H6 _
* Check memory range for valid RAM. A simple memory test determines
( v8 Y* n( W+ c- s  H# w4 a* the actually available RAM size between addresses `base' and+ i6 ~2 z/ `3 Q3 T0 A0 G3 ~% e4 x
* `base + maxsize'.
5 W$ x9 x; d7 k- v8 l' i2 j*/
1 b9 k2 j+ a( B$ z5 y0 Plong get_ram_size(long *base, long maxsize)0 B: q+ g/ I1 {: E7 F
{
# ]# n6 q/ z1 H" e$ Q( d7 g2 G& w        volatile long *addr;
, I$ [6 O0 z' i* ]6 y- F3 M        long           save[32];
5 y# q; c) w% q0 A0 V+ U- G4 }7 J        long           cnt;, w' E  G" L+ q- X% _
        long           val;4 Q3 z! K; X& I
        long           size;, m, J& x, @) f2 E2 W
        int            i = 0;
/ C( O# d& f0 |  B
/ P. S- m$ u6 a        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 c$ V/ P) J) F' p3 T2 [; ]
                addr = base + cnt;        /* pointer arith! */
/ `/ ^" u" u1 N+ ~5 L* U* k                sync ();
" M3 F1 |2 I* l$ f' R2 s7 {" s                save[i++] = *addr;9 w/ o2 I- I  ^  r. F; H
                sync ();
3 A" G' l$ V3 m  v                *addr = ~cnt;, w( R, T4 }- ^. b3 O
        }
2 k$ D- C7 K1 C3 v1 {& ?% }2 {* }* j) u. f6 E
        addr = base;# H+ R% ^; Q" P( F/ ^
        sync ();: X9 H' T9 S1 M" t9 l, U
        save = *addr;
; G* R% M, x; C, K! ?  q        sync ();
0 t2 N- q: u5 W3 W$ u2 v! B        *addr = 0;; Z* K& Y) Y3 m4 ^/ h
$ K, B* W2 t% \: ]' ]6 c, z& h
        sync ();
3 T7 ~$ ^% \5 N( G& c        if ((val = *addr) != 0) {
3 Q7 Z. L# g/ k* C3 l( ^  u3 ^                /* Restore the original data before leaving the function.; R2 |, X% C! z: Y# o/ i
                 */. b+ r0 m, A. q% B( @+ u
                sync ();
( u8 S; f8 @# Q$ l- n+ L                *addr = save;
3 W8 o0 i. N* m! V' _4 ^* k                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% U( ]( I/ c+ L; r( {3 O                        addr  = base + cnt;
3 [$ _9 }2 o, k; y; ]9 P. \+ J" w% E. F                        sync ();( n+ Y  _7 {7 u' k
                        *addr = save[--i];1 H8 ]1 H3 S$ u( z
                }
: `( ~7 [7 U. e9 k                return (0);) x/ I) U3 P# ^7 W4 \
        }
" C8 {# M6 K: X  {. ]: i' s( s& m; i5 G
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. [- \- Q% k/ N( x: f7 z  J* U                addr = base + cnt;        /* pointer arith! */
; Z! |( y6 q  R2 Y                val = *addr;2 |8 s6 {1 h1 P$ w
                *addr = save[--i];( ?, w4 c3 y/ W6 W& K& h
                if (val != ~cnt) {
6 Z$ @9 W0 L* Y                        size = cnt * sizeof (long);
4 u$ W/ Z; d" `9 r                        /* Restore the original data before leaving the function.% |8 W8 _! m/ O7 J0 O, ]
                         *// I! m* h7 R4 E
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; \, H" i& Y8 T  a/ \  {                                addr  = base + cnt;. Z+ L9 L/ ]6 }: e% D) R
                                *addr = save[--i];$ s6 ^4 y: ^& v6 y: K; ~
                        }3 {% p. y" H4 L
                        return (size);$ r& J8 U/ h: ~2 D0 d
                }
! E% t7 M8 I5 v3 K* d        }& }+ W  G, [1 |  n, q; n
/ U$ a3 N- z. O7 v' {/ o" N' l
        return (maxsize);* B" E8 J% O( Y' w% m
}
+ I, z( |) q* r9 |7 s4 q- {' sint dram_init(void): n6 U% l1 v" r: ?4 u! q: A
{
! {# V5 ~9 S6 m7 b/ [        /* dram_init must store complete ramsize in gd->ram_size */) b0 D4 U+ _/ V, j6 |+ z/ J1 p
        gd->ram_size = get_ram_size(
( s, o9 ]9 ]- f* Z/ o" ~                        (void *)CONFIG_SYS_SDRAM_BASE,! u3 Z$ c  F4 d5 M
                        CONFIG_MAX_RAM_BANK_SIZE);
  ^& m) h: U0 R( m- n7 c3 z        return 0;
% q0 w3 z, ^& ?! a1 I2 j}
* y/ d$ X+ m. r+ ?* T! y! Y5 d
# I8 X) m  M" a& k$ a5 |( p7 T$ e4 S
6 }+ L" m3 R8 g8 z* {6 }, C" |. m

; n7 W9 w. Y8 _! w# a, Y' LFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 A& j0 j5 m9 x. `+ e7 a
" c4 y3 v+ p& A2 B6 e& f. m3 K5 p; }( ]/ f$ S
5 U5 e# B( Y: I# N





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