嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 ~/ p1 @- t9 b) Z0 _# |( e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit" P! W3 M' O! d0 ]- A
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ ^: s. r4 h6 @, b1 x$ X/ c4 ]" |! k
4 {( Z+ C7 P% _: _' y' o, v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 w5 }6 |. j  G% h* u

/ v' D9 m7 w! }" L( l
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 {# I! [" @1 e* `/ V( _  G/*
$ d7 X9 _! @8 m& y9 z' C5 ~- }* Check memory range for valid RAM. A simple memory test determines
8 ]$ D1 ~8 E( t5 ~0 p; q8 q* the actually available RAM size between addresses `base' and' q/ S9 C6 |8 t9 p& I
* `base + maxsize'.2 W& b( X1 N6 p: W; d5 `  q
*/
+ y% `$ A& a; Rlong get_ram_size(long *base, long maxsize)
% M3 k" e! U! C8 W{  q8 J- F" y* f! }7 q5 k
        volatile long *addr;* X- [7 d) m1 ~1 R1 F/ |  ?8 n" C
        long           save[32];
9 S5 Q& @% H+ k/ y) d! F        long           cnt;
5 F$ d: A( W* ^" k# u        long           val;
+ v0 Y- Q' i0 P        long           size;
( f- K( \- H# o) w' J# M$ f        int            i = 0;9 i+ y4 e5 I* p% C& F# ?
! j# c3 D3 J. p6 i) q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, d" ?/ r( K* x+ D" }4 h7 P                addr = base + cnt;        /* pointer arith! */( T2 _) h! _7 h
                sync ();: E( H+ z/ h( B* F
                save[i++] = *addr;
( w6 W$ X/ D0 m8 v0 d                sync ();0 |! l0 Y$ z$ o$ ~6 p* O+ d
                *addr = ~cnt;
; J# k: Q- G5 w" |% e        }
9 |; T0 Y8 S' d1 E9 Y0 M" [) H' [$ W, W6 R" g* ]7 w
        addr = base;
! J. [2 ?1 X3 }1 |        sync ();
: h! W( O/ a# X' F: r- y6 g" D. f        save = *addr;! G, }/ G8 K8 e4 u! {0 s
        sync ();5 M# v( ?; y: @
        *addr = 0;6 e1 [, X. s/ h4 D9 O8 q  W
2 I. h/ |) S5 g% q5 _8 c4 \) y
        sync ();0 D3 Y# u& }; r  H  h' n
        if ((val = *addr) != 0) {4 }* {: |3 W7 R  ]2 I7 Z* i# @
                /* Restore the original data before leaving the function.
; R2 y' ]8 U& [4 C3 a% \                 */, f. }/ }$ k+ [1 _/ i. s
                sync ();
" S  E+ z1 v' M* d% }                *addr = save;
& R& ]0 l# q$ W" s* l( t$ \7 {$ f                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* U9 i; I) v  k7 \, {# m8 f: T                        addr  = base + cnt;
9 s" e! x& n$ p3 T& K                        sync ();3 m1 a& A/ X5 |( F+ c" d
                        *addr = save[--i];7 S7 |$ Q$ I3 y6 g. V
                }
* S6 T/ H5 U7 P* C* p/ u- V( W                return (0);3 v+ m( s! Y% t3 t0 z; x% `
        }
; I0 b# S8 ~  [; c! u3 n* ]. D
0 Q4 i* p" L- l) y  v- S7 ?5 \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' a3 d" ], q. R+ L( {
                addr = base + cnt;        /* pointer arith! */& b  B) E, D% s' o
                val = *addr;
  ~8 C# y0 P/ ^' M5 M7 g5 k8 ?                *addr = save[--i];$ N5 N3 }; q  R' w* j
                if (val != ~cnt) {
) i3 |+ y) X6 D. I2 h: D! V                        size = cnt * sizeof (long);( M4 t0 T( l3 z8 Z% G& o1 G
                        /* Restore the original data before leaving the function.; O/ ~2 N" }. U; t5 P
                         */
, ^1 k0 z" g$ O# v* D) T                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 `" L6 q6 g, Z" @/ p                                addr  = base + cnt;) v# y& d" [; a; x1 v9 q
                                *addr = save[--i];: D$ y# q, m; ]! J: T. a$ A1 f
                        }7 k1 _- j9 Y1 N" A* P& P/ ^8 ?
                        return (size);
4 G4 Z) P. |5 l+ d" Y& D                }
1 O  }* C" k. w1 }        }
9 w# Y. [% ]  t8 j* q% z  k0 P4 E1 }* p
        return (maxsize);# a5 a& X2 n  `8 i7 ^+ H
}; `" Y2 ~4 c5 H/ H5 q; I
int dram_init(void)" f5 z6 x6 R5 t3 k
{
" w% N% i2 @; \. w2 \        /* dram_init must store complete ramsize in gd->ram_size */
3 J& Q' d# t- ?7 N, ]        gd->ram_size = get_ram_size(
: t' E3 Y5 f. ~+ X+ W6 ?- d                        (void *)CONFIG_SYS_SDRAM_BASE,( v- T, C" F8 o
                        CONFIG_MAX_RAM_BANK_SIZE);  S' T9 u0 C; G6 f6 ^# B
        return 0;
3 i% X( s8 L- C, J* A. y}
9 J* p+ [% p. H0 F9 n
# @) e7 R% J3 F! u9 o
" u: G* C1 X* p3 D) h+ A4 d* w4 f& x# w) T

2 @( Z1 I- |$ v. p- @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; v. a% Y0 Q3 ^. s! c; a6 b4 k' H( c8 [0 U; C
6 x# o; I3 {( ?3 @
# B5 w5 e) K7 Q9 o: C9 E





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