嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. _, O& X, {/ S* Y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
% Q6 \- ?7 T2 k/ y% {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; ]! p' A' J. M! _( [
' g" p8 ~- ^% P+ y3 P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# x3 F) E0 P2 V- S2 W7 t4 Z* ~
% _! Y( v6 R% q2 u; q
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 l7 {, r2 _% N: A* P- u3 ^
/*8 p1 x1 ]+ U) B( I3 n
* Check memory range for valid RAM. A simple memory test determines
( v4 X5 E/ V, ^* the actually available RAM size between addresses `base' and" B8 `$ ~: l# b
* `base + maxsize'.: D, d  O2 [  l/ N
*/1 `2 e9 I1 S- X) f! `+ N
long get_ram_size(long *base, long maxsize)
5 n4 ~4 }! r5 w: p2 w' j6 P{
# }- u: Z4 Y0 X7 C; ?! g6 C        volatile long *addr;) ~0 O$ Z3 e) o+ Z' g* \3 t% V- _
        long           save[32];
) k- K2 Z4 L" y1 N/ m6 J        long           cnt;  ]/ s1 }) N0 F1 I$ M$ U
        long           val;
& T: S6 K2 {0 P+ T" s        long           size;) ]' _* [! M+ T+ f* b+ m, x
        int            i = 0;- Q6 b% s3 ?, g: ]; a
, }/ H4 E2 E2 Q/ h! ]; U
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ r7 M- e' ~9 W; y9 {# L! ~                addr = base + cnt;        /* pointer arith! */
* l5 g, K2 A, [$ t                sync ();3 C+ y& f2 f& ?
                save[i++] = *addr;
9 j$ y* c5 H0 {3 V) }; n                sync ();  e; R) m) F) j* A) s
                *addr = ~cnt;
- F  Q. K$ l! y9 J& V        }' q! [) J; i# w( |: c; K. J
; W3 d" A; `9 e2 N0 F& u: Q
        addr = base;
1 U' q9 f; X2 ?3 l        sync ();
: x. g! f3 P3 H* i  K; j1 p) D        save = *addr;" w2 q9 D, Q  l. ]; P
        sync ();
, I; F& c  j* x  W* J& J8 ~        *addr = 0;
0 {! U& V0 b9 M+ F- c* W- D) \6 Q6 g( {+ v- L
        sync ();
$ n/ p' P. r0 [        if ((val = *addr) != 0) {; ~5 U  w4 y6 t2 h% C2 s
                /* Restore the original data before leaving the function.$ Q; f0 b. w- G; C! f/ }/ s
                 */
$ F* ?- R8 [. z1 n+ `+ l- K7 a                sync ();
6 M; U6 b# T) F9 M% ]( Q% g2 m) s3 L                *addr = save;
9 h1 X1 h7 O$ {% {8 S: Y/ E3 n                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 L( G* G; Z' [9 _" F; T- l                        addr  = base + cnt;
' X: u  y3 [7 A* f+ m0 u- T                        sync ();
3 h/ \+ o3 j% I, Z                        *addr = save[--i];
0 _! \  u) y6 y5 y                }
" E$ s. d* Y$ U! C" `- E. I% N                return (0);7 s6 T0 K& ~7 F7 K: p4 I7 \
        }9 h. r" Q1 z1 t( S* l# S
# R/ O) ~8 u  A) Y/ U; m4 Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# O' n% T3 b0 f- _6 j
                addr = base + cnt;        /* pointer arith! */
% g0 t6 e% X" G; |. B! i6 @                val = *addr;
0 R) R3 \  c% u& \0 J) `4 v                *addr = save[--i];
0 J  Q' L" g' [- y                if (val != ~cnt) {: W; v3 Q$ b* [
                        size = cnt * sizeof (long);# t# S: w# L. t0 V( w
                        /* Restore the original data before leaving the function.2 x4 \. [) f# [+ p5 C0 X2 g
                         */. m9 W, S; ~9 B: l' ]  m5 a8 _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) ^! @! v. \( |; N5 Q0 C) q
                                addr  = base + cnt;8 L! b: E4 i" F$ `
                                *addr = save[--i];, ?' O6 ^* {# z: c; T
                        }
; m% _0 |" {: K8 |0 D9 r                        return (size);
# Z% X$ n/ s) j) \                }0 P# I: z" n% Q: ~: |- W3 S
        }
# U$ E! p- ~! h
) i$ g. V& m& _9 B- t/ X        return (maxsize);9 D' c6 b6 M5 @$ c: @& u
}
" p& r1 \) X/ ?: S0 Uint dram_init(void)8 E! X0 O0 S# `8 J" e0 C
{
) ~; l/ m, ?  a& F: J. `        /* dram_init must store complete ramsize in gd->ram_size */! G1 z5 i! R3 s* D3 s% r. Q- y
        gd->ram_size = get_ram_size(( x% i" C  Z2 e. A- ?
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 v! |  L- i, a- |                        CONFIG_MAX_RAM_BANK_SIZE);
5 _2 k% d$ c* u. l" E* f" f# T        return 0;8 i% K$ a0 ~2 w% L2 t5 \
}) o8 Y+ _/ @" r: }

9 x; F2 Q3 K. `, F
4 ]" E6 g$ [5 W0 q  W, T) s5 [( s- W/ E- f0 k# ?/ _  S3 k& R

7 E6 _1 I/ P4 R  Z' MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ @- [- t7 R: x; f9 M+ @5 e% ~
* g! O4 D! ~5 r+ q# M& O& d
& |0 l; s& ^' x; E; x1 o; l7 U
* Q, T2 L' v- T: i  W: Z( o





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