嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( W+ |0 a- c( o# T6 j核心板2:DDR2 256M Byte   NAND FLASH 8G bit  U' P1 t( b+ [6 @! h: d# I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) q+ Z7 R, S, s9 s. `9 f
" `2 M5 ~$ ]; v: w: i; {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" W3 Y' c% F( a8 v9 J" X. x) d  W  I
2 c0 f: V9 L2 R, y( K8 |: m2 f' g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. c" D, E' b" p3 V7 w/*9 S) [$ [1 c) L# D. y9 D3 ~
* Check memory range for valid RAM. A simple memory test determines
8 }9 `* x( }: k: F" C4 C* the actually available RAM size between addresses `base' and! ?6 `  K2 O% m. M. s
* `base + maxsize'.2 p9 {% G  W/ F$ M) A7 x0 L. l4 |8 b$ a
*/
. C5 m. j2 E2 E* Clong get_ram_size(long *base, long maxsize)  V! v+ M0 K2 t9 B  o
{
" f2 R/ d( ~" Q$ J6 t        volatile long *addr;
( W) }1 a5 M& i        long           save[32];! ]& O7 g9 w* D4 m
        long           cnt;2 W7 `8 f4 J6 d
        long           val;  D+ N% C+ \* u( }
        long           size;# ]$ X2 }0 {( O# {
        int            i = 0;
  m* G- p/ D2 U4 j* H
7 T9 z5 j' e. {2 {8 s        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {3 o' F" u. o7 S; \
                addr = base + cnt;        /* pointer arith! */
& D( |7 h5 P7 S" A+ @. Z+ ~                sync ();
/ B8 }+ @# J+ c                save[i++] = *addr;! R; M4 i- {4 ]8 J% ?8 q
                sync ();9 x3 o+ F5 u6 v( q* a7 D
                *addr = ~cnt;
/ @! c; `2 o' O        }; i- G# P' w3 n6 [( e) ^' N

2 W; h2 `6 }7 o! q0 m8 S4 s& b        addr = base;3 F, W0 Y2 V: h
        sync ();, |  g6 y; Q2 |/ k, N" q: J
        save = *addr;
1 i( I6 @3 U+ ^% V2 P6 N        sync ();& u* V5 N3 U" n, Y3 ^. P
        *addr = 0;
( H& W! r! |5 _6 z7 P% D9 n& ~, n. o9 D  c0 H
        sync ();) c8 Y) e+ d9 N% y: s
        if ((val = *addr) != 0) {6 x/ T! j  ^7 @9 f/ I1 B# x% Q
                /* Restore the original data before leaving the function.# Q; ]8 ^  }; {& [) d* {
                 */
, o' {' {' R2 o. }* F$ y- A                sync ();
- ~1 Q3 C6 i' A. W2 I                *addr = save;
( l; Q$ f2 I  [7 {  I2 p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* x# }: _0 I# z# `- |4 A
                        addr  = base + cnt;
: w0 I4 E1 o" X                        sync ();& r+ V, _. o/ d: O' Q
                        *addr = save[--i];! e6 b6 l! `# Q7 p1 A
                }2 A; L6 [$ H1 f) ]* E+ k: C
                return (0);
9 H5 Y" x( [7 A& x$ x        }) U# L6 N" w# W' f1 E  L0 ]

% B) e$ c! {2 A, S        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( }0 Q- n  @5 f1 [; D0 I+ R                addr = base + cnt;        /* pointer arith! */
# a$ f2 i3 |7 [, t1 ?! k                val = *addr;
1 j8 r# L( I2 ^                *addr = save[--i];
# [4 m: z2 S6 v; l9 \& t- e                if (val != ~cnt) {* a. u  M5 J/ ?$ o4 f3 o0 m
                        size = cnt * sizeof (long);
) X& d8 H/ R) s                        /* Restore the original data before leaving the function.
1 t" \0 m& @: M/ Q                         */' P, k$ o6 z- x8 Z2 z  ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  d. |3 T: Y: U; T# `" u7 ^6 j) y5 O& _
                                addr  = base + cnt;6 `% _3 ]( K2 R4 t3 |
                                *addr = save[--i];3 `* v9 c! }$ Y3 S
                        }) P( z  f' B) W
                        return (size);
) v- G8 O" K& G) I                }( C% U* R; J: |9 t) O
        }, w$ q0 d% @+ c

" T& J* `+ k3 c+ F" C) d7 P        return (maxsize);. S  i' {5 j7 _$ k
}
9 R4 r5 y# P6 k% F, d% rint dram_init(void)3 l/ M1 q0 T7 S( }% A. R( N
{
& b0 q! J( I) ^8 l" w4 E& l# J        /* dram_init must store complete ramsize in gd->ram_size */( I2 [% {' c) Z  A8 r7 A6 h( ]
        gd->ram_size = get_ram_size(( V. J# t, s1 }2 F# c  b
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 V7 R% f: f: @0 p                        CONFIG_MAX_RAM_BANK_SIZE);* M+ f; B8 W5 w8 d6 b# c  F
        return 0;
) Z3 @3 O. L7 }. n}9 ^( F9 `, O# b6 ~$ W

  e% _" _3 i. @1 l6 ^% @9 e" w6 S. e' j: x6 g; a+ i8 p- p2 x
1 u# F" f4 @% B( m6 J$ Q3 L
4 Q* v1 G0 M. ~9 v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ D' z8 z- A  @. r0 p
; {$ B$ n$ ]8 V  P: n) i) ]- }. o" z8 Y- x

/ f) A$ [, w9 e. t7 Z




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