嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. `, J' m1 o8 e; ^5 H/ R! z- J# @9 d
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: [( h- Z: g8 n0 d# c( D这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) h' I; _2 U" [3 q5 h7 P
. @$ _! ]( T& s! D' N9 I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; r$ I2 Y6 M. d! V; T% N* T$ ?
; A% a$ T6 C* b1 j
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) G5 M2 p8 v, {& _* x/*( c( b! ^; s8 o# k
* Check memory range for valid RAM. A simple memory test determines% j: F. H5 f, a" L5 ?
* the actually available RAM size between addresses `base' and7 R8 P7 h% f" F; q. v; [
* `base + maxsize'.
/ P8 Y- q3 ^8 p0 u  O0 D1 j! [/ e*/1 o; J  p% s4 j) H/ J9 D1 P
long get_ram_size(long *base, long maxsize)
2 ~7 l% j4 j+ s" X1 Q: n7 {' P{$ n7 y+ q( i& h0 q/ u2 G4 @
        volatile long *addr;
1 h5 m$ A: @' V* G" F        long           save[32];- r5 m0 w; d/ p9 r& @
        long           cnt;
# v7 \! e' U1 k- S: B9 ?        long           val;
1 a' |/ v) F0 D' S# X        long           size;
0 F6 v( R5 B' ]        int            i = 0;2 m3 ~9 k8 t4 o6 Z1 v

2 O6 ?1 p; |$ d        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 U  @7 ?3 F0 P/ l8 r6 B
                addr = base + cnt;        /* pointer arith! */
' Q4 Y" s8 j* n5 M* N$ X4 Q* E                sync ();
) t$ Z! p$ C7 Q: d                save[i++] = *addr;
+ ^# x; }/ ^3 R                sync ();
1 o7 j3 L) D" t8 `& y1 e2 [- G, t                *addr = ~cnt;
5 @& W6 f5 t: ?" o        }
- C3 K$ f& k  G. h* n. O
4 V& Y" i3 Z! _! ?' E        addr = base;
! q  _4 h& U5 Q" Z( F4 V$ X        sync ();
. E4 O- j* G) r: L* ]& H0 `* e        save = *addr;
. |! j; F4 s# o- ^7 H" K+ B        sync ();
5 o% @2 o2 g! k  n3 n- {9 X7 Q        *addr = 0;. K  }+ l. C# H* v

5 v. o9 H+ {7 J: }4 ^* d        sync ();
- I" y3 Y! h% w' f        if ((val = *addr) != 0) {
2 r2 A& M" o  s# }                /* Restore the original data before leaving the function.
, I, ~! H& u% [# K2 y3 h' S                 */* w+ C4 @+ Q% Q$ ]+ S
                sync ();
3 e' |. }: ?  _7 v# _4 }1 z                *addr = save;
  P4 s6 a, d- g$ u7 ^1 @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: F4 I2 |7 J& q8 `) L
                        addr  = base + cnt;
, p6 g- [/ v0 ^4 T                        sync ();3 D+ v* a9 h8 r" S' Y# P! W& f0 {
                        *addr = save[--i];# r$ Y+ q4 y8 Q- ?& D0 F+ b
                }
; a6 b8 B  K: o                return (0);$ {$ p1 s" i) N
        }& p3 z2 P, R- c, j
9 o. K* X& Q% f6 R% U# G$ B1 s' K- y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c: R! Y! v9 C; x+ Y! C# S' E                addr = base + cnt;        /* pointer arith! */. y$ h9 e" E: \- A1 [
                val = *addr;) W; k9 U9 ?; _  f# X. f
                *addr = save[--i];
( }) p1 D) J* Q                if (val != ~cnt) {9 Y& v, j% j1 k# V0 w& {, z0 L
                        size = cnt * sizeof (long);
: h/ d- ^2 e' u1 G6 s                        /* Restore the original data before leaving the function.( Y4 |* j1 ~; }8 L& v3 _  W% \3 {7 [5 ~
                         */# x4 M5 I5 y$ @9 Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 c# K' Q! J: ~3 x1 q
                                addr  = base + cnt;, K+ |. ~0 }3 Q+ Q7 o
                                *addr = save[--i];
; [2 Z$ Q2 `* T                        }  e  p! [7 [' i, `( ]; T5 [
                        return (size);& M( x# C! K: }9 `& M! l9 m
                }
8 A0 _8 N7 I2 q4 `  M) i        }
4 H2 l4 b0 P$ ^* [+ W& i! o# F; Z7 L1 [$ G# }2 v7 P& [# d' m7 h+ K
        return (maxsize);" O2 [" h/ Q6 a" s
}
6 I" N: y5 O' ?3 Y$ E3 s* Iint dram_init(void)/ ^7 d0 B" ^# K* ]6 f
{; r) K. D) F+ S4 w, A! K
        /* dram_init must store complete ramsize in gd->ram_size *// c  L% q: h! L
        gd->ram_size = get_ram_size(( y6 C# f% x" M* Z3 Y
                        (void *)CONFIG_SYS_SDRAM_BASE,
# e. P# t2 \3 f( E2 Y( \                        CONFIG_MAX_RAM_BANK_SIZE);
4 C8 W  N/ f- p* L! T9 z        return 0;
' t8 O0 O. O" a8 ^% B}1 P" O- R0 t( P9 p" A. R" n0 T

0 f9 }: Y, Y' q! v
; l; l; C4 B3 t: |/ E* [# g9 c5 P4 D% M* D1 L  G& h

- g- J2 t, I- P0 KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. ~1 `9 z. e! a+ b7 `) X
( T$ t6 B( [# B; G& {) i) ~: C* o0 c
5 k0 Y0 O  j- F' ^+ _- {0 M) p
+ S1 N! r6 V( q5 y





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