嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 l5 \1 b, W! G9 ^5 }1 D5 M5 V' n核心板2:DDR2 256M Byte   NAND FLASH 8G bit& g$ y, d, d7 F) z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 \: `9 h! ?( W
/ @1 V. n8 @) z" g+ z: N7 h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 b  k4 F" J1 E; t+ [1 |$ Q0 G; {& c: l8 j4 a4 r: ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! o' V5 H- t6 C( T/*( }( g. {/ S6 Q4 i1 e- ~7 _
* Check memory range for valid RAM. A simple memory test determines
% S' s) b: ~% o8 c& V; I* the actually available RAM size between addresses `base' and
8 s+ A6 I4 |! U$ R* W* `base + maxsize'.
4 M+ b5 E6 P0 V$ `' F; p1 I3 V*/
. t) ~4 K' `) Q% j) V; J( s9 glong get_ram_size(long *base, long maxsize)" _5 [6 O& ~9 t' H
{  I5 _! w) s+ J* v. o
        volatile long *addr;% P  _8 q6 {  S' Q' S; o) Q
        long           save[32];
( q0 J# {- j6 P* G1 u" j        long           cnt;
: g! k1 R' ]! e2 B8 B5 W( r        long           val;
1 v9 r; A; `& u        long           size;; p# ?' `; s2 u! T
        int            i = 0;& B+ a4 j2 t) F) U
0 l4 ]! w) A' l# |7 x7 w8 J% T# A
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
; j8 Y  F: r0 d: f" Z& `! p                addr = base + cnt;        /* pointer arith! */& D7 u# b: h- N, E" ^/ I
                sync ();
) U; z0 `6 n1 D, V% P                save[i++] = *addr;
* q. j  G+ {' W1 k& I: m( f4 _. w) M                sync ();5 f; ?  Y% H, X4 r7 |$ V
                *addr = ~cnt;# Z# n+ O7 j# s7 l+ X
        }  U6 v1 v0 l: Q. {5 Z6 D; D

4 m6 s- b/ Q9 _2 t' [! g# Z        addr = base;
  {9 F+ J- S! x        sync ();0 Q8 D. v/ u% J  y- @, f
        save = *addr;1 X$ a0 S: j) w
        sync ();$ g  N# {8 D4 ^& B* j, W1 Y' c
        *addr = 0;5 L% i+ q2 [" G4 c# r' n

, o8 q' @+ s% ]% ^$ A) P7 Q+ z        sync ();
! _+ a& ?& r- Q" _# Y9 }& p        if ((val = *addr) != 0) {
" W0 d3 p" v$ t7 U3 _/ X; @                /* Restore the original data before leaving the function.
. u# w* D6 Q3 l! L7 X( `                 */2 C2 g, ?+ F0 R3 G. I$ J
                sync ();/ f1 q! b6 }* E2 ^+ v; l$ Z2 ]
                *addr = save;
) M0 C. I: ?' W: z# \/ h) u3 n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& c( M; @- D1 A$ g" ?% q6 }
                        addr  = base + cnt;
9 I1 c/ l- }# l+ C1 \                        sync ();
( I& ~5 R6 X% x                        *addr = save[--i];' I6 C( c+ s$ ?5 O* X
                }- g3 N) i0 y: h) j  z5 R
                return (0);0 z. O$ t$ z5 X2 r
        }6 f. n9 l# N% _( A0 t2 T8 K

6 v) F* p$ |3 R9 p% y        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ q2 n! I; d4 d1 U" `; q; @
                addr = base + cnt;        /* pointer arith! *// [0 ~( `9 _% U0 B
                val = *addr;  o) P8 M7 j. Q' J/ [3 ~
                *addr = save[--i];5 g4 a: v4 |/ t* k# ^/ L8 A
                if (val != ~cnt) {
3 S5 g7 z4 C) O# x                        size = cnt * sizeof (long);$ c5 X* Y# G; G6 e
                        /* Restore the original data before leaving the function.! [; Y. V) l6 b
                         */
" I$ L- ]# m% Z: V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ m6 n# [, C0 s# x3 V3 b+ m                                addr  = base + cnt;
- H# m& b' K/ }% b) i                                *addr = save[--i];
( u) \% m) u+ B( a                        }
* F0 r# l' p+ ^1 _3 D" h# l' E                        return (size);  Z7 ^$ `% Q1 O- Q/ L* _
                }  f1 F4 n6 _4 Q* X8 {
        }
3 ~; \" `% N1 P, r
4 P9 @" Y7 G! s, J        return (maxsize);
, T8 T8 `& W2 h0 X! s; ~6 [9 X) d}
4 d3 b1 K0 y& B! z8 Dint dram_init(void). k5 v3 A5 p) N# w" B5 q
{
' \4 E3 O8 E: v1 V6 |" D        /* dram_init must store complete ramsize in gd->ram_size */2 w. E: N+ O+ {
        gd->ram_size = get_ram_size(0 i8 q& t2 ~( m1 Y4 {
                        (void *)CONFIG_SYS_SDRAM_BASE,
& o: l* [& @- C. ]+ b6 {1 O2 @1 b: S5 B                        CONFIG_MAX_RAM_BANK_SIZE);# [$ }) \8 C, E0 n0 i
        return 0;8 j  k: u: X* M& E
}
0 o4 t7 d7 M% p1 J) L
. Y. }/ a7 p4 k
& y0 ^8 X; H' N# x; {/ C) m! b5 k: G( T, @

" T9 z& Z2 a4 N6 @9 C; FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% p6 K; a" v2 {, h3 i, q! S
5 O" h- L) p& m2 S+ ^# Y
( k6 K3 [: t( I; \" H% K

& Z4 X) k& G. D& L, S& o9 j




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