嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 G, P0 U- f/ `9 F8 E: Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit  x/ |3 R4 G5 |- J* E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# }- b, H2 q" R# b7 o5 B8 j

# u, X4 t) ]( \' b( X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 v6 c/ {5 |5 N/ U( u% n

- j8 G0 P/ p- \  b
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: n" v, P  o8 T: [  o5 L8 K/*8 n9 q: l/ P3 L6 X! u; ^) [. i
* Check memory range for valid RAM. A simple memory test determines5 S0 ~4 C3 C6 R% t$ h, O2 m9 h6 y1 D7 e
* the actually available RAM size between addresses `base' and. T9 p8 T* G6 b1 Q. c) h; Z
* `base + maxsize'.
: e+ g5 m) l+ \. h3 v$ |0 m# k*/
, ~% z7 U2 B$ Y, ^" ?long get_ram_size(long *base, long maxsize)
7 H: [- ?3 y4 i4 O8 ?{
5 w! M0 ?' Q$ ]1 h4 s        volatile long *addr;& {0 `) [: v" h6 u, R. |
        long           save[32];
" k4 a" ~$ p# _. y7 }        long           cnt;
# n: j, F3 s4 |) Y, E        long           val;$ X0 U  C; n+ |$ T3 Y; q' I
        long           size;
9 ]& r; x* b3 g( B. w4 Q        int            i = 0;
" u* t; e( F* {6 k8 D) v+ S3 ^$ l- r, F( `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' O* a9 @" |7 M6 c
                addr = base + cnt;        /* pointer arith! */" F) g$ Y0 f/ r8 ]5 B! V- a5 ]
                sync ();
4 U$ N: L! Q* Q" b5 p                save[i++] = *addr;
3 T6 _9 Y: ~3 V3 L4 [  d                sync ();. o1 K1 X4 j5 k0 M3 ~0 c5 w! w7 S  {
                *addr = ~cnt;
- L' I' q; Y$ W        }0 ]$ I. {  K! C3 b2 \" t

& @7 O4 a' j2 P6 Y  p8 q- u        addr = base;7 {; E0 v# D% F' a
        sync ();
1 W8 K+ P( j, {# [( E* r+ [        save = *addr;2 W; S" ?8 J' m: M
        sync ();
# A: g/ g% f4 @% ]        *addr = 0;
9 F" Z8 [3 K  m1 H3 v7 x* _
0 m" X* l. ]* I+ o/ g        sync ();- \: x3 F! P6 g& M8 b
        if ((val = *addr) != 0) {
6 W# r# _3 u9 P                /* Restore the original data before leaving the function.
# p8 m# I6 T  L0 R0 u$ K. e                 */
6 S" x1 @2 d3 V6 ]5 r) M                sync ();7 t$ g9 a% V1 c1 @, k$ Z0 Q
                *addr = save;! H' Z# W) h5 \5 m$ u5 q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 G& e- P+ v1 F                        addr  = base + cnt;+ m' s. L9 y) g0 e& F9 Y) @+ D
                        sync ();# Z# ~  ]( N8 R2 j& B5 @
                        *addr = save[--i];
$ C  \$ E5 m, J+ ~) }7 v; a/ g6 i                }/ u9 o3 y# V# c; _. g
                return (0);5 [7 m" n4 H9 y. x; d1 q" p
        }) ?% U# h: d, K8 |  _4 Z; S

5 A8 G; q: Y" e9 |5 N8 v$ O        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; b8 L/ C) k) b( t# K2 [
                addr = base + cnt;        /* pointer arith! */
# ?9 q* W$ d9 N0 H1 Z                val = *addr;
) b! {& h5 P$ {                *addr = save[--i];
5 i  R4 ]' t. ^, Q# ]* h, T0 ?                if (val != ~cnt) {
; e2 r& k7 A( s- l8 V8 Y, B- W                        size = cnt * sizeof (long);
; _3 l/ t0 i; W+ @/ V7 q2 ~                        /* Restore the original data before leaving the function.
7 ~( ?+ O8 z! T5 X5 ~& O2 c                         */3 N7 o6 _8 U! Q& I5 a" Y- T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  _7 q/ U8 [* b( e5 `9 p% l; B4 g
                                addr  = base + cnt;
7 j) |, C1 R6 S9 {( w                                *addr = save[--i];
: F: q( ]- q5 k0 }/ `2 W. {                        }7 y! J/ t  W  w( j7 [$ F
                        return (size);7 L5 a* W. J( U) W
                }
( k1 v7 b" C$ a        }
4 ~1 Z7 u0 l: ~4 b  J# A; q/ l" `
        return (maxsize);& t& j; c& L- G4 r& r0 H
}
  ]  T9 H6 t* i/ V7 `) z- {int dram_init(void)1 }8 {# S- `2 }! Y" p( D0 G" o- X
{
2 i0 Z# Y6 @& z5 g+ g, R        /* dram_init must store complete ramsize in gd->ram_size */
& G$ ~6 e, V3 [$ J: ^+ S2 Q1 A        gd->ram_size = get_ram_size(
; g' e9 {# }2 T# A  Q                        (void *)CONFIG_SYS_SDRAM_BASE,
" p" e0 ?) C  j: d                        CONFIG_MAX_RAM_BANK_SIZE);2 c+ G* o2 C) f/ u% u
        return 0;" J% L3 \* ]* e/ g" n/ h' d7 _
}, W2 O  o& d8 ~) e" H: _4 M+ E% g
  m; h6 O# ]" i/ w7 P( {

, }3 O5 v4 d9 m' ]( `
! {6 _* ~9 T2 f. @: e: u5 B& @9 q4 I8 T( c. G9 J$ H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' b0 U+ t. }7 q! d3 ^" r$ L# L
' a- q- j/ p" A4 ?( ]
  f) Z& _* n) R4 Z. [8 A: Q

- }6 F+ w0 e; `




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