嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 p: W& K4 @/ u. n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: o6 Z9 m& q# K( n+ T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 y1 `* N. s$ r3 Q" l
# |" B% t( R: k# S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ O$ H) x0 L- ^) ^" O0 c+ T0 F7 e" ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 [7 l; u3 D& u' \4 ?
/*
5 H/ b! H. i1 }; l* Check memory range for valid RAM. A simple memory test determines
# j+ q0 r, j4 C& U" A; _# ]* the actually available RAM size between addresses `base' and9 p, h' m- \" n* G. A/ W# T' a$ `
* `base + maxsize'.
7 c4 Q; l5 \( n* W& s6 I2 k*/
' R8 i0 w( a& D* D, Dlong get_ram_size(long *base, long maxsize)' J4 e1 }6 s; l. y9 a; A/ h5 n7 `
{! q+ p' [9 Z* C. N# d. |1 u
        volatile long *addr;" Z8 }1 E* c" Z; z# K- `
        long           save[32];; v8 I& o2 c" U# A9 l+ n) B
        long           cnt;- Z9 n; L# ]$ [/ ?& t
        long           val;8 @3 B& \8 r& B6 J
        long           size;3 n8 t" F& W* X9 B) ?# K
        int            i = 0;
+ _3 _, W( ^& ?" N
$ Z: @# ]/ r5 A7 J. Y& I3 I# X+ x+ |        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% A; t. T$ P! H5 `, [/ j                addr = base + cnt;        /* pointer arith! */
4 u, ^$ W0 N8 T; i6 d) }3 t                sync ();
- h2 R' J, Y( a; T( N) z                save[i++] = *addr;- `( r- N3 Q% Z3 B" r4 [% y- }6 I6 A( G
                sync ();
# f8 W( E( G0 L  [3 J& J                *addr = ~cnt;
% x' U" V% H3 @& E2 w& X% d1 X7 v2 t        }
+ w, k7 G# Y7 H% }3 Z" L
+ H/ j( O* X: P8 `        addr = base;) M4 G( ?: I; B+ N. e0 p' [
        sync ();
, Z2 z; S- H8 u8 M# g        save = *addr;
# I+ \+ c+ \$ {        sync ();
! J; S' o, }! k4 l) n        *addr = 0;/ E% n8 t# I( W! k1 U- \# l
: X6 g6 p7 a8 N9 k4 p( ]: N, k' D
        sync ();
3 k. h/ V$ X1 v8 u8 W+ t        if ((val = *addr) != 0) {3 }& @& @9 L/ [$ q0 s
                /* Restore the original data before leaving the function.& _8 x' \$ k' t- Z' h% L, W3 g
                 */% `# @% @  o3 \
                sync ();$ O; @3 d* U2 v2 F& a
                *addr = save;
9 A* j$ j# _8 T6 M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, _, Y2 m) o0 }7 I; m                        addr  = base + cnt;* m! E8 C. J; e9 [! S
                        sync ();
0 x" A/ B$ }& }4 O                        *addr = save[--i];6 f1 Z* T8 Q3 H/ Q& N
                }
, |. M4 S: Q4 O. A1 N6 W                return (0);0 R! H2 B* Y. D6 m5 a4 {; W* r6 r
        }
( L: l7 k" D+ q" X3 x! ]. d3 l; n/ A4 v0 X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 h0 z$ _) u$ t5 E
                addr = base + cnt;        /* pointer arith! */. M5 v8 o; k, R
                val = *addr;! X9 v3 @7 ^: H9 _
                *addr = save[--i];) T4 p- k& X* K7 l
                if (val != ~cnt) {
( U& w7 p: C" @3 T                        size = cnt * sizeof (long);$ t; @- T! x1 ?! I2 p
                        /* Restore the original data before leaving the function., _+ o6 T/ A, B) a. o$ E- D
                         */
) q. B6 T" m5 L: L* U# F2 y8 Z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& Y: [6 b) d; i4 u5 j+ f
                                addr  = base + cnt;
. y2 E; ^. ?: k+ w# ?2 h- R                                *addr = save[--i];4 p( \' H. ?3 Q0 w8 F: ?9 H4 C" l
                        }, C" C  J9 d# b
                        return (size);6 W0 \2 t8 {) B( q& [; F
                }
2 S/ _$ _2 R2 p# c; Z        }
" T: F9 r3 R' |0 j) Z; M; \
* \3 `! e0 e  x; B+ ^        return (maxsize);
7 y, w; Q& H& Y" ^) C$ w- X}
& t) v; B8 C: _  Gint dram_init(void)8 d5 F/ a' t! w  D- r+ ?' B
{! t9 X( a2 Y3 _* n: g
        /* dram_init must store complete ramsize in gd->ram_size */
4 ~9 [% ~! H" G        gd->ram_size = get_ram_size(; t! i! \3 {  O) A8 E. g
                        (void *)CONFIG_SYS_SDRAM_BASE,
: Z/ a, e, i( ?4 T- k                        CONFIG_MAX_RAM_BANK_SIZE);' T) D1 U! M! b, _. b. i
        return 0;
4 d5 G+ Y/ u! s  o8 j8 F. f}
  A5 q& H; _+ ]! ^" [
- T- z* u! I1 F- |) Z0 W8 Z  N5 `/ t7 O6 N5 i: i

# R8 {! j7 t8 r- J9 X* d
+ J/ Z3 S2 v0 T. z3 L$ M" ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 S6 Y2 E2 J! s5 d2 Y7 {; Q# _9 z, u, G, Z
( y- `  q3 _2 ?& n! a* Z8 o/ c
. P3 g( K% w9 M* `5 P8 S





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