嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) ^7 |; p7 {, S$ L  _核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ v+ |8 T. s# b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 b/ y- q- y  Y( g, \$ R& @, O7 T! A+ F% n3 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  v# ?& G3 p3 a+ M
4 Y$ U1 ?: a4 Z, `
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ k  H/ y9 I7 }/*; J4 j; H5 [: S- V/ B! x9 W
* Check memory range for valid RAM. A simple memory test determines4 E8 F2 A$ j+ ]6 h
* the actually available RAM size between addresses `base' and
. \# I: ^( P% f* `base + maxsize'.
# r( L/ J/ k/ N/ f# G/ O*/4 t2 y( ^4 s; o6 ^: r5 `. L
long get_ram_size(long *base, long maxsize)
# M: u8 ?( w5 p{: @4 o8 r2 Z. C- Y/ z  R
        volatile long *addr;
7 T( R$ p, t( u7 k1 w' e, N        long           save[32];
$ D, _/ Q* ~8 `2 t* F        long           cnt;0 P! P+ M+ N" f; q$ I% k
        long           val;$ b: Z! i+ ~- U. b5 n
        long           size;
. n; @, B$ K1 u: [. _        int            i = 0;) F. K( }; W7 M# D) ]7 F/ N; r

" T, k" w$ Z6 p, H, m) Q+ P) t/ k  r        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 S) A4 Q2 W  a* h# c4 {8 R
                addr = base + cnt;        /* pointer arith! */
/ _2 u% \* T: I: R- O' S2 v                sync ();
3 N1 r3 V0 H$ Y! q" P( n+ O9 ?) C                save[i++] = *addr;
- N" ]8 n# \2 C) k! N& u                sync ();; A; n' u/ u) E; ]7 n3 A' |. c
                *addr = ~cnt;9 G& [5 z2 W4 M* F
        }
& I! Q$ v. O% M4 ~9 U  E9 |( P. S: k4 G- t
        addr = base;' i* \$ y2 U6 W: x/ ~% ^: N; Z" g
        sync ();# R, w& B6 ~5 h$ [# B) [
        save = *addr;
; O- G9 S# s6 L- Z2 Z2 z        sync ();
! B1 I  b- \( O# ~        *addr = 0;. q4 q2 Z' j( [' }2 g" P- m

" U+ r2 a# }- |5 R4 T: x0 o        sync ();9 w- j+ M- V" {. q  ]! w. j0 e
        if ((val = *addr) != 0) {
9 i+ P0 @0 }' ]7 k* Z                /* Restore the original data before leaving the function.1 B( w. y' u# Z9 K; Y
                 */% \3 [8 k& A4 k5 Z; P8 H0 ^$ }
                sync ();
& k7 N% r- z) \2 U# R0 }' N0 g                *addr = save;: j2 D* p- j! P$ g+ J' d
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, Y3 u& u& _, Z; M                        addr  = base + cnt;
, o6 J8 ?6 m; z# z                        sync ();- N( r% w0 g7 G) k
                        *addr = save[--i];
# L8 O6 c, ?! n" ~                }( M0 n; R4 Y0 F" y
                return (0);1 _9 b2 A7 d8 ?% x
        }3 L& _8 e9 R  [% h3 I
  ^# M9 N" ?9 M' K3 T( o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 ^6 r8 ^- t: G* I4 W
                addr = base + cnt;        /* pointer arith! */3 a1 _* w- S1 i; E" I4 V
                val = *addr;
" F! ]- _! t9 m; D& y0 L1 y8 I                *addr = save[--i];
" }8 m5 Y' ?5 K% \                if (val != ~cnt) {
( \! M) V1 }* u5 i                        size = cnt * sizeof (long);
! r4 H! R  D* A: p1 ?9 F                        /* Restore the original data before leaving the function.: X7 U( [* u. H& |3 |2 S2 ~
                         */4 i2 p0 x0 u$ f+ M6 I1 u* Z! r% E
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 s0 h! J% s$ t4 p0 m                                addr  = base + cnt;
. I2 Y" ?. h# d6 i  o' l                                *addr = save[--i];
5 u/ c8 r& ?! r1 l  d& e                        }
- H' l7 @& b8 @% d! G                        return (size);
  a& @  ?  e& x7 K0 p2 {7 S4 U7 l                }
- D/ B* \1 R7 ]0 G$ g' m2 v3 F        }* ?0 b+ u- e5 [
. n2 A; e/ o. i) O# m
        return (maxsize);
! k0 s, Z$ ~, x, v; I}- E! \; Y# P/ r, R3 ]
int dram_init(void)" R& @! a9 D* i) h7 k0 F# F
{8 n# [' {1 v5 z2 i' Z- i5 g
        /* dram_init must store complete ramsize in gd->ram_size */- I2 N6 ~0 r$ f$ O" |
        gd->ram_size = get_ram_size(* B' j, L# N' ?7 T' Y) G
                        (void *)CONFIG_SYS_SDRAM_BASE,
3 X4 u0 ?0 H5 z2 V0 ]                        CONFIG_MAX_RAM_BANK_SIZE);6 s, b) E! g8 }6 I3 e
        return 0;9 G* q) L( g/ V6 X. r
}
" Z, H4 X; M9 [7 m8 I2 M8 n. x0 U5 \* f- K" A! a+ \

* I# l4 d9 }  {3 L3 t* d- @5 f. \9 g+ ^) g1 i( R

& b' t# p5 s; hFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( J4 y( m1 F2 k: o. f1 O# k6 U: Q
+ k- f2 L- t, I9 |

: p. x# @# c0 }- L: G

. D: W3 q9 f7 G




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