嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 {3 r$ L+ C* ?; t/ M5 K
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& O. D; ], v# l6 K, p) |6 @这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. c0 E# h7 e; z) v7 V' K
( Z$ U5 M% O! P3 g$ M  y9 _0 @, j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( G7 \7 X2 B+ L( [* `6 B
; l& K$ ]7 t, C$ n1 O1 s
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( i1 k" b  P. `* ^- w8 s- v
/*
: H- {1 _5 B# i& [8 F8 l* Check memory range for valid RAM. A simple memory test determines9 f8 A) e+ W! I* O+ _6 r. O
* the actually available RAM size between addresses `base' and  B; `$ c8 s" e$ b
* `base + maxsize'.
+ ^1 k" ^, u. X7 C*/  u0 Q( [; D& }' j. c/ l
long get_ram_size(long *base, long maxsize)
. X, @9 _' g: V" u4 j{% b; Y7 E7 _' q4 ^! f9 r! `
        volatile long *addr;
* R3 |$ ]8 N; Q. l; Q        long           save[32];
2 b' [' z/ [- G2 e  F1 J        long           cnt;- j5 f" Z! c& e9 Q/ J
        long           val;: F! C0 M' h  Y) ~( E- D1 b
        long           size;
* j0 j+ |- E9 G+ |/ |0 J/ S        int            i = 0;5 U7 J* L& d0 J- B
& L  m4 C7 D8 d1 Y) x
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ ]8 J& U- ]+ r# X                addr = base + cnt;        /* pointer arith! */
  T+ s1 h2 F5 M                sync ();1 C5 q/ |$ V# C& d: d. i2 S1 O
                save[i++] = *addr;
, a2 ]- F/ \; ?% y+ ], @0 P                sync ();; L/ c. u$ c2 W  x7 ?- ~1 N( Q! ]
                *addr = ~cnt;# R+ {, m) A, ]8 D' K
        }
9 l) ?$ V6 g) ~% T7 b; _0 y
% j" t  h8 s# O; P! r        addr = base;
& [! z: L9 p5 ~5 t6 C& D        sync ();
4 V0 `" R9 h- G" W! a; i, z) Z, G        save = *addr;
# w; V) o, a' S        sync ();
. w" g3 y* ]. P3 t        *addr = 0;
: h  F" S% w6 H( h* n# }1 G2 ?: q; u+ k- X3 d1 l! j
        sync ();. |2 ?$ N) _+ j! \, q# o/ r3 D( }
        if ((val = *addr) != 0) {$ m. A# d2 M% r, B3 n- \
                /* Restore the original data before leaving the function.! b* ^: \; J$ W
                 */: X) ?! Y' U; B; k" I
                sync ();
5 G. e# e1 O5 n. V( i7 A- e, |) t. E                *addr = save;
& ^0 l% d1 \3 M6 D1 L/ j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( u- K" G' c5 P" C# ~1 v2 J; x% i3 J                        addr  = base + cnt;
3 \, g* n5 `  q0 R7 o3 j                        sync ();/ R; Q' Q2 h0 A" ?6 T  v" O
                        *addr = save[--i];0 w$ d0 f; p  A( y( _. J# u
                }
: V9 m7 t3 T/ a7 e- [6 w; h                return (0);
' Q1 p9 ^3 J6 w) X, n+ ~        }! O; [5 E/ @9 N3 b& P

, X0 L% _" [) v$ g        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; {# O  q9 |; b9 ~; {  H7 x
                addr = base + cnt;        /* pointer arith! */' x. ~- `( G' l/ D
                val = *addr;
  M9 q; b0 U. ]& g6 G2 q, Y( L: f                *addr = save[--i];
2 @" R5 \! C! G                if (val != ~cnt) {
2 F1 _5 F' n- @0 [                        size = cnt * sizeof (long);0 }9 }& N! K: X+ O+ _# e7 P
                        /* Restore the original data before leaving the function.
8 Z, N# D) r% r, N2 p3 a                         */0 E4 ]3 [% T# A9 s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 @$ R+ g& d2 C4 f5 X                                addr  = base + cnt;
( I3 r8 g1 x3 ^                                *addr = save[--i];
1 |$ ~" h' W5 m) ?' }$ Q* T                        }) @+ h: k0 A3 G
                        return (size);5 Y; i0 {* H! j
                }
( t# x1 i1 i: @! }( @) E- e! j        }
8 D1 B: `% u+ S8 F  q+ ?% E
5 l% V+ z; p6 i/ `( u& d( s        return (maxsize);+ |) y6 r3 P2 V: g+ Q; l
}$ z5 I7 I1 X( M4 L- U- A
int dram_init(void)
: c: P4 ^! q2 I' {2 h. F7 ?{
, W9 i4 Q* G# T# h        /* dram_init must store complete ramsize in gd->ram_size */
( i, Z4 X5 w0 |        gd->ram_size = get_ram_size() }% p$ u, A- `' T: x4 W' X
                        (void *)CONFIG_SYS_SDRAM_BASE,* _' z& G& Y4 M$ I- A
                        CONFIG_MAX_RAM_BANK_SIZE);* y* U" `0 a$ F6 S
        return 0;) Z8 J" r% o% q8 R( U1 [
}
9 J( N: m6 _" \; e3 j2 \& f1 q, F4 L* ~& @" x9 v% g
4 J1 D6 j5 ?* J+ _1 \
+ k5 ^* v' ~' d* k2 ]/ o) u

3 D2 t* @' ^2 R. g( ]* }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 R7 m; `% x( N0 h9 h& s
& ]  W2 g% F) I5 ]/ F! ?

; i1 _2 J2 |! w- |2 \- N

7 I3 G. }$ f% M7 |- ^6 f+ s  [: }




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