嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) a# P8 n& k: v# W: T* W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: E4 u8 M+ R, |1 j  x这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# B0 L% b* Q1 p; W1 x0 l/ @/ V

, v. e3 _' w# y5 d- ?是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# ^. e, B2 J. U
; y+ F0 b4 `' U9 R* ^# Z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 Q- b' {5 F. q3 x, q6 v" |/*
" `6 i9 R* X) T4 K* Check memory range for valid RAM. A simple memory test determines  Z# j. l, `6 i2 r. d
* the actually available RAM size between addresses `base' and" k1 @- O$ O+ u8 [) h: \5 T
* `base + maxsize'.: y5 `# [  e4 Q5 j
*/1 d+ v( `4 w$ E
long get_ram_size(long *base, long maxsize), ?+ W6 {9 S8 ~+ ?
{
$ f1 V: z/ j; r        volatile long *addr;
+ R% a- _6 Q9 ^/ }! n        long           save[32];8 `% Q" V: P' k3 V, t: P
        long           cnt;6 d  v) o5 [; {: D- T
        long           val;: i  K/ v$ g0 `. S8 S
        long           size;
8 M$ q, u# T9 s6 t        int            i = 0;, q8 L- U3 L/ h

) M! b& a2 S! x% M: L: \# i        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ r( g' P  h' V6 u/ r* I                addr = base + cnt;        /* pointer arith! */  w' ?4 K; Q% b& [3 G# Q8 k
                sync ();( |+ A! u1 d4 ~# r0 k; z( i# f
                save[i++] = *addr;- o. x3 |& x9 L% h+ y" G
                sync ();
0 L4 i' G4 V% E3 z; O  v& I                *addr = ~cnt;
6 T$ }' o2 a) z; x        }. n& ~% {! l* a* |
5 ]* a1 U2 Y( P% H8 W* T  }% F- _* Y) e
        addr = base;
2 ?- y' u% n3 z' |0 a        sync ();2 f" C7 U1 ~9 B
        save = *addr;* W; }$ L4 T& Y$ x5 R" d
        sync ();
  y! R* K! g6 x        *addr = 0;+ \3 _  D/ V" j! |( c. i4 \1 y
/ e( s+ y8 R2 e! J  E& C; \7 E
        sync ();8 x% F0 Q: x/ b7 `& v+ f7 H& {
        if ((val = *addr) != 0) {
) e% z& \. `9 S                /* Restore the original data before leaving the function.' o; D% Z) {, l9 s$ c
                 */
% F0 k% \7 T0 }" M1 R                sync ();
" C1 u  u7 b  O, M$ J$ `" E                *addr = save;
+ G0 l2 r* ?3 O( U; \                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- V. g* u& l& z% H, }" z$ \# }
                        addr  = base + cnt;# r: J* y+ }% i
                        sync ();
, a  M% W4 V2 F) j" h( r4 y# I                        *addr = save[--i];: F8 {3 K) l" v; A( m
                }4 |. y( ]8 {: s' o: b8 W% x1 q
                return (0);7 H9 c3 s, Q" K+ p
        }0 E' g) M9 A. Z1 w5 J. b. S6 U6 M
  @' f8 e' r$ Y( j, e
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% L. R! z  B" d9 i" k                addr = base + cnt;        /* pointer arith! */! A/ j- z" K' u" r, I7 R
                val = *addr;
1 \3 W8 z: h# ]                *addr = save[--i];
' D+ Q% z/ h) u. A                if (val != ~cnt) {
/ a  g" t5 I' v8 o" n& s; w# H                        size = cnt * sizeof (long);9 l- g  N/ O9 A7 F* A+ _( s
                        /* Restore the original data before leaving the function.
* s$ Q9 a8 i% [                         */, ^7 ]0 |* a+ G2 f+ H3 V7 z+ k
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& b9 n9 p, Y  e6 J) M                                addr  = base + cnt;/ y4 V- d% F6 S
                                *addr = save[--i];2 f( b7 i" \+ V: ^# Y
                        }* O6 Q% w2 B2 \7 Y2 m# L# F
                        return (size);+ N% ^0 n. s9 U( j
                }, g$ J  D& T( A9 D. [. f, e4 H7 l
        }7 c0 F+ o* v* ?" T
2 l. l% ]% l+ a
        return (maxsize);6 c: T& X/ }8 x* T, x4 t
}
+ f& u9 ~5 T9 H2 {5 w/ q( kint dram_init(void)
* [# G! e4 \9 }$ r{2 t6 m* Y# `- c: A# O* R/ j  t
        /* dram_init must store complete ramsize in gd->ram_size */8 u) p: L" o. w7 g, S; @! W2 W3 v" p6 B
        gd->ram_size = get_ram_size(
4 R4 C' B+ w2 b) ?1 P/ p$ c$ ~                        (void *)CONFIG_SYS_SDRAM_BASE,# j$ z; M% ^/ J# I( r; g, s5 Q- p9 S+ N
                        CONFIG_MAX_RAM_BANK_SIZE);4 M) j) F' D9 X3 S& J/ w+ v! t
        return 0;
1 D0 E' R! u! _, k' P8 v}
3 c/ \/ H; @7 _- ?' D/ v: s, W) W
  l! P- S# u! c& I5 E: X" C3 I
0 D- [) o1 |, i9 h
% {8 Z/ `6 q" G
1 r& j' Y# u2 u" g: TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 G( ?+ q5 l+ d4 ~
% @: @1 V5 w6 o+ ]1 e2 o0 [
, M$ L% Q: ^2 {- K3 P  }
! Y4 o* ?) K& p1 U* A





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