嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 }* ], {+ o4 U; ^* U
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 Y8 z: c' D5 G2 ^. t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% I" v; H6 E. O6 N/ u6 B  i# Y

2 h5 l( _  ?7 h. e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- ~6 H' m, V- w: f( m* _- j

$ }3 d6 V! D& ~6 r, u
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- F6 D8 I6 A) g4 u/*
# R8 R! y# r7 }/ r" \* Check memory range for valid RAM. A simple memory test determines$ _! t9 P) v  T
* the actually available RAM size between addresses `base' and5 J  Y+ K' H7 z2 R4 ]  `  g) b! d1 W2 Z0 H
* `base + maxsize'.8 T9 r' t) F4 t/ d7 A
*/4 G# r& N2 N4 _7 W
long get_ram_size(long *base, long maxsize)
6 r" l; z1 q) G6 h7 ]. e{
4 ?3 d* B0 D7 r7 W. @5 m7 T        volatile long *addr;2 w" {6 M1 ], e& w9 t5 S
        long           save[32];+ N" F5 b/ w% t; |5 A- z! f
        long           cnt;3 j; z( Y7 t5 }' W
        long           val;1 B: P7 O1 t" |
        long           size;
( m4 m# v& T0 C; y        int            i = 0;& d, }, T; s, A5 H+ e, V7 f
- O2 e7 ]- @1 t3 _0 p" |% M) W# F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 _1 q; {; Z: e- A) m% j  K2 ~: E                addr = base + cnt;        /* pointer arith! */
9 x9 |$ T# N" Y8 h8 _, I                sync ();+ f% T3 D$ x% l# l
                save[i++] = *addr;
/ D7 ^% ]! W/ r- V% R                sync ();
( s; `% d# y0 T$ x& c" \: F                *addr = ~cnt;' k6 @1 C+ K( {3 l8 p7 M- }
        }( E8 B* R! `8 N

7 o1 [6 m7 Q7 `        addr = base;
  b7 w% P/ ^) A5 e! K- R3 c- \        sync ();, d( {$ K* e1 s; _
        save = *addr;$ l, m& V$ u, W% H% q
        sync ();' L" ]  F0 e4 c3 r; ]+ i
        *addr = 0;
- t" ~' Y( ]$ s; T8 {8 v/ H5 a6 S0 G8 s& S" ?1 L
        sync ();
5 [% f% u! {/ q3 `/ |. ]        if ((val = *addr) != 0) {
9 T' T' ?3 C9 C" H# T                /* Restore the original data before leaving the function.
- S, R2 k- u+ I# u& {                 */
: L  b' W' s" D- e4 L& o6 K                sync ();; a2 R3 O& Z! w( @) W
                *addr = save;. C" d* U: u5 [! Q$ @
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {! k4 g* }  K7 `- ^6 L# }  i! c  h: K
                        addr  = base + cnt;/ }. @7 e) P" f' b& ~
                        sync ();( |/ Q. A0 C! X9 o2 f
                        *addr = save[--i];
: W" _  S: j# x% I$ V# `/ ~* n* h                }" M/ h" b0 [- J
                return (0);
2 ?: k! p/ o; R8 q; Q( w        }
: [* Q0 \4 U/ w
7 L& Z7 `; e/ e. k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 Q5 L- q& o: L
                addr = base + cnt;        /* pointer arith! *// B- \$ q4 e: T* a
                val = *addr;
' ?& t7 P) r, q) u                *addr = save[--i];
4 k# a0 c2 l* d; g" W                if (val != ~cnt) {# w4 I2 X+ m2 v
                        size = cnt * sizeof (long);
2 M: M: d$ F! T0 ]+ f                        /* Restore the original data before leaving the function.4 }3 t$ ^- C- T1 p: |
                         */
; a) u8 ]0 K- v& x" a                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* j; m7 ^/ c4 w& r4 E. [) e/ }' ^$ D
                                addr  = base + cnt;+ x1 |8 D% u8 z3 d: n
                                *addr = save[--i];$ |9 }, n3 O; h- `
                        }
- J9 y4 V$ D* c. t8 `( k                        return (size);/ e( I; X5 ]8 x: `% O
                }
4 [$ r- v, b2 i( s# ]        }- G& |; P& M  n- B% }5 L% Y5 S
+ Q- J; f" A9 @  l% D' u  [8 K" Q- C
        return (maxsize);; a: L2 C. K5 Q( t) C
}
& @4 Y- m. Y0 c6 Y3 E# h  W' kint dram_init(void)
( N2 c" }; V( z9 X{/ A: I( w: Z9 f
        /* dram_init must store complete ramsize in gd->ram_size */& k) P4 a4 ~) @/ G1 f. B
        gd->ram_size = get_ram_size(
0 A5 N& V9 i4 y; {                        (void *)CONFIG_SYS_SDRAM_BASE,
* G, d' {0 J1 o8 A& p! g                        CONFIG_MAX_RAM_BANK_SIZE);
. T1 |% ~# g% D        return 0;
; L( S  d  Q& v}* F' H( ?4 b( c" x. i

. k+ l7 ]: R3 f2 G. b& O$ H# U9 G& `# N4 T
) P/ U8 O( J3 I4 \, z, e; N- v

9 x* Q' j/ b1 H8 KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 k" m# [# F* e* M* L- s4 G% u, m. D) H
# J/ u: i' Y* `* v4 o# j5 ^
7 R7 X9 d( L/ z6 ]$ N





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