嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 [- k- p7 b4 }, Z7 [核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' M8 m0 P5 W/ [9 ]这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- h4 j5 q* I- d6 Y7 ~) |
- P$ S. v1 n, _是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  I' B: o4 s8 s, |

. Z0 M1 N- ~) H0 O+ ]6 {
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* r% v8 f6 p0 \1 i. C) d/*' d& D$ d+ S( K0 h
* Check memory range for valid RAM. A simple memory test determines
- G% F: \% ?) B+ B+ R! B* the actually available RAM size between addresses `base' and  b& S+ _) n& H1 g. T9 f0 o6 D6 R
* `base + maxsize'.
2 h% H$ B/ ?4 H. N7 f, T*/6 A% Z( a) U( c
long get_ram_size(long *base, long maxsize)
6 v2 `  X( C% L. Q{
6 i2 E8 J1 @! |8 a2 ~6 H8 f2 T( g" X+ p0 g        volatile long *addr;7 \5 X$ [& h% E0 k
        long           save[32];) n4 u6 @8 T% P8 i) T$ s
        long           cnt;
3 z9 M" R, N" s+ Z( \: c        long           val;, I9 M3 z0 B$ ^7 e8 N& m6 q
        long           size;* [$ S( [) A$ o8 w2 {: u
        int            i = 0;
* f$ v0 p) G% C6 o- L! P: S
" g( `3 X" R/ D$ t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  K5 S) b4 @0 S                addr = base + cnt;        /* pointer arith! */
, l, B' B  B# ~0 Z7 @! D                sync ();
8 }) e2 d. i# z' b( ?                save[i++] = *addr;+ G, b6 h" [! s1 \& y. t! S
                sync ();. U. Y5 y6 p: |- [* d2 f
                *addr = ~cnt;. p. o* v* D6 l/ z9 R+ \7 L
        }
+ W4 u9 w) Y2 i9 V+ S) i) H6 W- g. l3 }
        addr = base;
1 u$ G. r3 ?, s  U+ A        sync ();! `5 \  a) @  E2 |" B* S
        save = *addr;
" G- i2 h8 e( V        sync ();
7 {6 U! R8 p2 T7 \( w4 `7 Q" g7 |        *addr = 0;  A$ q- s  i! Z2 `$ Y9 o6 t
6 y1 h, D6 ]& d7 |+ r  d
        sync ();* o2 L# N* z  k0 a' _7 o/ f7 C
        if ((val = *addr) != 0) {
3 \; n* F- t1 q/ G0 [( n                /* Restore the original data before leaving the function.
% |& E* f6 \# w( @  E                 */- \; Y" y( h+ U- Y+ u) |  ~, I! m$ ~
                sync ();
6 l  w6 Z4 \+ G+ Z8 A' j; q6 n6 t                *addr = save;$ W; b7 r  d! K. j+ }- {) s# Z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. A4 S, l" ?# M  v: r2 D2 J                        addr  = base + cnt;7 b1 R* ^8 V( N6 @1 O. l
                        sync ();5 @# c3 D( B# c& g* K+ P* J
                        *addr = save[--i];
: y! t2 N" L* J+ w2 ~! G# P3 w5 _                }3 B1 u! h3 U4 p3 h
                return (0);
7 H+ \) ]; P' n$ Y. X1 B        }
: M! }2 X1 ~( r; x. ^2 l- d
+ K. G* |0 r: L8 M7 ^        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ C% l/ x/ R3 v" ?6 ~                addr = base + cnt;        /* pointer arith! */
0 f" v5 C/ s' N! u( o& H8 F+ o/ F                val = *addr;1 S. m7 h( P2 K, ~
                *addr = save[--i];' [' S  _) d5 J$ V( P! h
                if (val != ~cnt) {  L' \) e5 g' m
                        size = cnt * sizeof (long);3 |& g  d: C4 B6 [( U
                        /* Restore the original data before leaving the function.! m. n( b) C8 t5 F5 U5 H- `2 N) y! t
                         */( a. \9 @& N* Y! A
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; q" X2 y! {4 ~) E  K! w! C                                addr  = base + cnt;
) b: z' x$ @- ?4 A4 m2 h                                *addr = save[--i];! z" x, i( k( J
                        }
* b, I' J# t% j4 a+ p                        return (size);- w. n( ^1 u  ], O3 z5 h+ C
                }# r1 O  @& _9 j6 R3 D
        }1 k5 z, [. ?0 u: G3 {/ c+ \

; f* Y% o! M/ U6 I2 x        return (maxsize);6 N: h% H0 t( |7 X2 C% d8 H" {9 l6 h
}
; i- {/ s8 ]" }int dram_init(void)5 c4 n( S% H% q& F& }- @- h) i
{
  [) v: I% S% J) [2 n, K# M        /* dram_init must store complete ramsize in gd->ram_size */7 H* j% X! V  H8 i' ~  B+ r" B( _
        gd->ram_size = get_ram_size(7 w- a6 Q# e3 [. Q7 |: u1 b1 W
                        (void *)CONFIG_SYS_SDRAM_BASE,
" l4 u7 n% i! m                        CONFIG_MAX_RAM_BANK_SIZE);
5 [9 O  A' r4 Y; [  t% h) }4 ~        return 0;) q  g: I4 n+ B" O& s
}3 w# V/ m0 v  T0 ?, v8 Z' V9 I, Z
1 Q' m4 A) Q! n/ ~- Q% T, E9 J
* [, G: c) `; T+ x/ N* c+ |2 o7 Y
2 L; e" V1 W' D( b- Y. ~( Y
% ~2 y% j% ?6 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ F1 B9 d, E; K& y/ Y/ l
5 v5 r; e, n& x" D6 t* p7 g$ M8 |1 f9 t6 l* l

) Z: n) `. I7 Q, V" a% a




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