嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* b5 S% n" ~+ b* T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 N# W0 l. [3 J这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' {8 |2 i( T, r) P  f& M

2 j6 e2 ^$ R' R- m5 n* ^" @是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) L" p+ b" S, R, F. x- w6 V: O5 m: R/ E8 L  Z% A- w

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; `& k4 M& O5 v/ \+ I+ x0 H0 D/ n/*- U5 F' i/ \: V. V: Y2 H7 _
* Check memory range for valid RAM. A simple memory test determines2 W( S3 A1 C. j" D( W2 x6 X) `3 g
* the actually available RAM size between addresses `base' and1 j0 n4 _: W5 M% }+ }* @
* `base + maxsize'.$ {. {& @0 L% f8 b" V# j
*/9 H/ z1 q4 L! s6 a+ Y" `4 I2 ^
long get_ram_size(long *base, long maxsize)
1 u# ]1 H# A5 z9 a' g# u: Z' i/ o{
/ E2 b% {* k& B* Q4 t        volatile long *addr;# Y" G7 \3 |# }- {2 f9 k) y
        long           save[32];* e/ z+ ?/ S" v( M, K3 c8 \! {$ n4 T
        long           cnt;
+ E5 h- W8 ~6 c3 L/ c        long           val;5 x0 A+ E! V3 B, f! F9 I' w8 p
        long           size;
8 c6 J4 P( O  b+ |. T        int            i = 0;& v/ X. r' T+ R5 m% K
* ~2 F" F: J, J1 W2 ~% y% q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 Q1 c' Q8 q# J1 y1 k; B
                addr = base + cnt;        /* pointer arith! */( v( B" f! o9 u5 K+ t
                sync ();
" V, U( n, r1 |                save[i++] = *addr;
9 F2 ?( m3 G, c2 Q8 C2 W/ c) e                sync ();1 E& g/ _; I3 Y$ {$ k7 K3 A% f
                *addr = ~cnt;9 `: {; |6 E5 H7 Z
        }  _3 Z+ d9 A6 S: v1 N3 z$ c! w
* q/ X( l3 z7 D' {
        addr = base;9 I" a5 i- H. b
        sync ();
8 Y; n: g' C2 S% _5 N& y) k        save = *addr;
7 h+ B3 B+ ^* B. }        sync ();7 h4 \; H; c3 g- Z
        *addr = 0;
1 I0 r- o# U" Q# c
) Y( @' ~6 L2 `        sync ();! V" l6 ~* _# f$ r: ~  ?4 P: o( R
        if ((val = *addr) != 0) {
9 R/ i. y) p. ~8 G  g- j8 a                /* Restore the original data before leaving the function.
9 l9 F9 O# G0 @7 |, E                 */+ A7 F& v3 Y6 ^. e
                sync ();
# V1 z( N8 C+ a& G1 z                *addr = save;3 A* q* q- b8 ?) ~; h$ x9 t/ l9 i& x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* p$ f' u/ Q5 c' i4 J                        addr  = base + cnt;
3 y- T1 s# ~6 M                        sync ();) P$ M/ X' R% P  w9 O. F( c
                        *addr = save[--i];, U# q  |7 j  C/ z5 w
                }' {9 S5 k" b2 n) M
                return (0);
# G# {* u/ O3 j/ ]        }
- \! q9 L. t4 m' d* a. q# f! U" E; E7 k- s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( _& v$ m- s0 y# N! H  g+ m1 f
                addr = base + cnt;        /* pointer arith! */
( N( S$ }. }4 D                val = *addr;
: M' B& l! G) ]2 Q; \3 K5 g                *addr = save[--i];3 |9 G# _. x6 g$ E) X. ]' w9 T
                if (val != ~cnt) {9 Z+ Z3 r* h4 O
                        size = cnt * sizeof (long);0 w! i8 h5 Z9 P. c, b( E
                        /* Restore the original data before leaving the function.
, ^' R4 B5 l! u* g3 _" N                         */3 U1 |* }  W9 Z% r, X# ?7 @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  t8 M' @) \. C+ [, ^& \9 l                                addr  = base + cnt;
; c: @6 j6 c3 ]4 H3 k                                *addr = save[--i];. L8 v7 _$ w7 p. M: p% W
                        }
/ m- f) W3 L& R8 V4 {* @( o- g                        return (size);; N+ U1 n5 J/ E: E" p
                }
' O0 q. p1 I0 ]( v: r* L        }
& N! W: ]9 b4 y& s* o, b
/ S) `" m8 W. M7 z0 N5 W        return (maxsize);
$ V" y+ _0 C6 B9 g( k/ k- {) v" ]}
. L' N% }7 Q. |, i  @int dram_init(void)
3 w1 {: [4 E/ }/ w: X{" T; R5 _+ T2 W* R( C* j6 \
        /* dram_init must store complete ramsize in gd->ram_size *// Y; H, Z( l0 z# c; i: ~3 h
        gd->ram_size = get_ram_size(: T) G( S+ x2 ^! _5 d3 C* d; _
                        (void *)CONFIG_SYS_SDRAM_BASE,3 o. @4 z3 q( W
                        CONFIG_MAX_RAM_BANK_SIZE);! x9 B1 u/ V5 z# Q
        return 0;$ J& Z* j; a+ b& K! O; f
}
& \$ ^3 z7 Q8 Z9 j
: w$ a' ?2 Z; k3 V; K
$ l# r, h( R1 @+ m; L: I1 b2 }1 j/ O0 j9 l7 }) A) d  s9 E
& W4 O* n- }2 Y  A- _; D) M9 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 E- ?" @6 I8 M( l1 l% i# o8 r

/ Q2 x# u& C0 k* S& ^3 {& ^( _! o7 i2 ]- u* R. G1 n
* U+ e* M# K* [: z8 G8 ^8 a3 a) x





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