嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* j* j5 w; \, d; B7 }' r/ [核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, K9 E7 ]: w; h: G( W这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 J; [! ]$ @) Q/ g0 Y

. k; H' f: N0 m$ k! Y( ?7 y. ^是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: ]) }$ F6 m  q& t# |

' K: Y% F4 c. u  A8 o* n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 ^  P9 `6 |- A9 Z# p
/*
; e- i5 m+ X0 v; W0 v; |9 o6 K7 z* Check memory range for valid RAM. A simple memory test determines
" ~$ S4 L- R4 D4 f; X1 C. Y* the actually available RAM size between addresses `base' and& r3 s. w! d9 X5 w% k% j/ r
* `base + maxsize'.; @, c% O! _: c' O2 {. d5 U
*/
* p4 }3 o# K* |' `) Q3 c1 R& Dlong get_ram_size(long *base, long maxsize)
4 u$ O/ ?1 X5 ?{
* W; J/ t( D, G. C6 E3 a" h: j6 W        volatile long *addr;
5 B: o- B9 L1 S* V' z# C& _        long           save[32];
( {" {9 F+ p9 o+ ~& T        long           cnt;' O+ N# ~6 b9 X; T
        long           val;8 j& j& [6 r; |0 u( [; b
        long           size;! o3 U: }2 U7 g- r; E% b) s) S, W
        int            i = 0;
2 k% R# v7 _" T2 C* B8 C- F8 ?' n$ Z! w, c+ }/ i
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 x% t1 C7 N% M" g, k; Y                addr = base + cnt;        /* pointer arith! */: g( i! b7 U, ^1 w
                sync ();
+ K1 W% D% |( r4 i7 _                save[i++] = *addr;" x  L" s" d' ^0 {  @
                sync ();2 `4 \  ?: Q! Y$ e
                *addr = ~cnt;  c" u( o* k8 b' D# C: c# C
        }
. t% f: T# u; a+ d
8 \2 ^# {5 u1 |) D5 X; K        addr = base;7 o/ S5 E. ~0 W
        sync ();
6 U+ N! k! \3 p1 m: r        save = *addr;
! O3 ]0 o) S2 x0 M5 W- P' [" }0 [        sync ();
' n) y4 l! O' q        *addr = 0;
3 R1 K+ |% ?/ U/ N* c9 h5 J: Q+ h7 P' ]/ l0 t, D! R- J; K! a
        sync ();
) K. l  W* O  M        if ((val = *addr) != 0) {
# B* a4 I% l0 T1 g& T" \                /* Restore the original data before leaving the function.
+ P9 N7 E7 L2 i* D                 */9 P& y0 U! Y& J0 t
                sync ();
9 m/ W0 \, k  L6 ]( W* w  g                *addr = save;
" c- j- X: u& e1 H: K* q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) m- a6 S/ u0 k- k+ g( E3 m" s                        addr  = base + cnt;2 Q. E& |& c+ l2 g8 [% A" f7 r
                        sync ();
5 w3 T  t4 G% k. U                        *addr = save[--i];
4 [+ k# A- r% L                }' a. @% N% K- F) s" _
                return (0);
. g5 i! K; c/ V$ @6 ?4 }; Z, F        }( v8 D" A% t. `( K* L" t' f/ }
$ H! Y+ O7 H* Q6 u5 R# o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* A# r1 v. h! n% U: [
                addr = base + cnt;        /* pointer arith! */
; R6 y: N" G: a% q                val = *addr;7 r# u( ^/ a9 ^% S8 e  n
                *addr = save[--i];
0 `' _' {% J+ X% w                if (val != ~cnt) {; B/ ]2 q8 s9 Y6 P
                        size = cnt * sizeof (long);9 C; O/ |# D* g5 e, y( N
                        /* Restore the original data before leaving the function.2 M1 Y) w# c5 H, R# r
                         */
5 H% Q! N4 c! ^7 z' N' L% Y$ g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# W; V) A( A: A4 p: a2 L1 Y
                                addr  = base + cnt;) R$ q$ l! S: r% v6 [. `
                                *addr = save[--i];' j7 L! ^) ]( t$ b. d; m& N) C
                        }
/ _0 X, k5 _8 d0 Q( y8 N- E                        return (size);/ |4 B7 z& |% c
                }
  K. E" W/ B/ I$ K1 U5 P9 P: Y7 N        }
4 J) b7 n5 y# B! k- I% m6 X( }8 x! h0 P
        return (maxsize);: I7 m# [) I: Z$ }5 }! u
}
! _$ w% Z" w/ B9 t3 vint dram_init(void)
- t% D: {4 s" M" C& `9 J0 C7 _* C' v! x{  L( v2 U/ y8 c) N  ?# @
        /* dram_init must store complete ramsize in gd->ram_size */
" \- u+ f- o8 M        gd->ram_size = get_ram_size(
- H% t& L3 n3 ~3 l1 ]                        (void *)CONFIG_SYS_SDRAM_BASE,
% n6 h, K* ?4 R6 a                        CONFIG_MAX_RAM_BANK_SIZE);
3 t4 ?3 M+ F; s  Q9 o3 _        return 0;
" n! A6 W- w5 F1 E: q. Q" ]}. n' A) q- o) j" \
* h" ~  ~/ b2 }' ?) H; o7 _. u

4 f% b' Y2 |7 g9 O2 n+ {2 F/ n8 t. Y% l+ b, _2 k1 e$ g
6 e2 u+ H; H, Y6 ]  W6 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: [; \, H5 L& T0 ~* _# J/ |

+ a  b' ?* Y( E9 `% Y% c/ J
3 [  a8 V- J8 B$ Q

$ c0 u& |% ^3 ?; Y7 ]% _




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