嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* k- Q! \* f+ a; Z' j核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 c" L# }  E  V4 R& w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?$ w9 q0 Y9 _! @4 [

7 a3 e8 s) Y* z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 k2 u: _/ N0 O! _

5 ?$ K% f% J9 r4 R" ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; }4 e/ G# f% \
/*, s. W! N, Z& e* O' n" G
* Check memory range for valid RAM. A simple memory test determines5 e! }1 z" P. x% j8 J
* the actually available RAM size between addresses `base' and; M6 b6 T* N. C6 i2 m9 k/ n* ~% l
* `base + maxsize'.
5 }; b  P+ K, P! f  `3 l: D2 ]*/
4 Q5 {7 R2 W# v6 ]/ ~long get_ram_size(long *base, long maxsize)
4 r) T& v+ s/ N1 {5 u$ L- d{) w- N" u& `7 }1 t5 P. j
        volatile long *addr;
7 ^7 n5 s1 ]$ B3 W. O        long           save[32];" r& H( T+ G8 `5 v
        long           cnt;
+ G5 T- I8 S4 K+ V- H$ ^! m        long           val;
& p9 Q2 i( Y* `9 B        long           size;7 Q; D9 U% N  T, F7 l3 O) b) }
        int            i = 0;
' P% i7 m5 U* A3 [2 ^* C* {
3 J, E5 t$ b  c, v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. _+ S8 k( {' ~; w+ e6 p! R) r
                addr = base + cnt;        /* pointer arith! */  A0 F7 y! D- j, P6 N# V1 h
                sync ();" R( r! y# X' \/ ~" P1 x4 `
                save[i++] = *addr;$ T/ ?: `; I4 v3 Q; ]  M# g, d+ R9 @
                sync ();
! v# _7 t1 b; X& u3 q                *addr = ~cnt;
. e2 u0 N0 S  O0 U        }
0 u& Q9 ]$ O3 |5 H' j" t6 f3 o: V3 G; A+ u2 d
        addr = base;
1 t: K6 Q# _- U6 `7 z        sync ();" ?9 A* m! Q7 N6 O# I
        save = *addr;+ d2 F2 U0 E# ^
        sync ();) e( [9 f* N% n
        *addr = 0;8 A+ A3 W/ B$ p' W5 h# ^' M3 ~
! h; D% K' Q8 z/ q
        sync ();
! F, l  O, W. \        if ((val = *addr) != 0) {
: S6 e+ e( x1 U+ k" g                /* Restore the original data before leaving the function.
# M2 Z4 l1 m; N' j) F/ ]                 */
; u9 t# L5 F  H                sync ();
  n! w  b' R/ C; z4 e8 l                *addr = save;) W9 C' L0 Y9 Z6 n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: C4 a8 i2 R$ B1 H/ s- ~                        addr  = base + cnt;
/ |8 o2 v# t& O; i9 ]; @                        sync ();
1 V& S  z' K6 {: i9 Z! A                        *addr = save[--i];2 C' j: b! g; f; A) U6 j# D6 r
                }
# p. H, D4 W5 M, l" j' M                return (0);7 i: B- X- E) ^' F
        }
" l8 b3 _# j2 i) L  O/ U) a  u2 q% _1 D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! u# A9 e, m7 E& u: T, s$ q" y                addr = base + cnt;        /* pointer arith! */
+ P; \" K4 D1 M                val = *addr;7 h: r  V, M- a7 G1 B
                *addr = save[--i];
/ k9 D8 r5 ^4 Q% q5 k                if (val != ~cnt) {
9 i$ t5 Q& U* G( j% C2 H. n                        size = cnt * sizeof (long);2 S2 f* Q8 A7 \; a" y
                        /* Restore the original data before leaving the function.. A4 ~" s( v% m% l$ b' U5 g9 H
                         */3 v- X" A$ d9 A* L6 N/ k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 S" S7 `/ Q  G+ e( \' J) h2 x                                addr  = base + cnt;2 n) a, D: |2 K0 E" r" J# j
                                *addr = save[--i];
6 }$ R' G% O+ g) T/ {/ h9 j, K                        }( z5 c8 |1 h. v: ^; S
                        return (size);  E1 w9 i. _' S( Q) b+ n- J
                }
8 W" N  C7 c: x' V% `) o        }
3 B4 `% ^. t* G- D
  j1 d$ G* s! F0 K        return (maxsize);" I, s' `) N+ ~  q. c
}7 O! ^! n; i$ Q
int dram_init(void)3 l: W9 \0 N- c9 G
{* t5 w( S1 V3 y# f3 E
        /* dram_init must store complete ramsize in gd->ram_size */. o6 O9 q: [3 S7 D" \9 L' f( C
        gd->ram_size = get_ram_size(
0 g& O5 `0 P6 E/ s0 G: k                        (void *)CONFIG_SYS_SDRAM_BASE,& B; _- g: P& j. I
                        CONFIG_MAX_RAM_BANK_SIZE);* P6 s! f9 l7 k+ p# ~
        return 0;
' d' L/ [6 J" e( e* ?$ @}
2 A, e3 T* C1 m( B1 E6 _% n$ f$ F6 j/ M! ^" B) M  h+ F4 o

3 r# T9 Z1 c2 V# B6 ~2 G5 |0 m5 \+ U. K" U, K1 N( c$ {, u* ^
  @# z. h+ l& Y* j) ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 D/ Z$ j( r0 J# p. q
8 V5 O) J% U7 {! j! T+ ]: l# p1 Z- F: S: F
$ G% }$ W/ |) c





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