嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- O% E( i$ n# i1 I5 T( \
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ f# X5 D+ _  F5 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% S8 }4 s0 a- C+ x, Q* |2 U

1 t$ W) q% L2 W8 q* B2 p( O3 L" }1 I是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) H  k7 N' r* @5 [- G

/ O. j! K. i$ {$ G1 T/ W
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 d% S% e  U% H0 X: C3 Z/*
9 n2 P$ n4 J5 F% d1 z! W5 @* Check memory range for valid RAM. A simple memory test determines( j0 f/ V4 h- T5 v. q
* the actually available RAM size between addresses `base' and, q' d4 t0 j4 Z$ N$ ~5 d
* `base + maxsize'.* |  `) g# t' P5 v
*/
$ B* k+ M( e& llong get_ram_size(long *base, long maxsize)
3 b  a, b2 r5 x0 U) Q9 i% N1 t- b{5 Q7 s; w$ A& T: X/ R; S
        volatile long *addr;* a1 v& z1 y% `
        long           save[32];# C* G+ x0 S2 V+ y
        long           cnt;
- e' L& t8 r! v' u4 c5 b8 v% p        long           val;# F. y8 F* ?2 q. Y
        long           size;7 s( X) K& W6 G7 I7 S
        int            i = 0;/ i0 {) j5 c4 V0 t2 m) b% U

) b! P& P7 g; {) J6 [        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' t7 @* o/ m- b: `                addr = base + cnt;        /* pointer arith! */" ]  `; s7 [$ T9 w$ `
                sync ();! l! f3 z& n! a
                save[i++] = *addr;- v" S3 f1 z/ z
                sync ();
) N9 e# D0 D6 i                *addr = ~cnt;
: y/ @$ N/ M( n- D0 R5 z        }
! c4 j- y: J1 z$ o- r
# x8 R& `. I$ N: A        addr = base;# k6 v3 S! c0 I, W, ]& M7 `! l
        sync ();
+ S+ m5 r- A7 Q6 u3 |        save = *addr;! `) ~* `  E7 i8 `3 Y
        sync ();
4 e4 y0 d2 A) m1 p3 N/ s5 y        *addr = 0;
' y# y, `+ @2 j- @. Y& C- q5 n; i* P& w
        sync ();8 g4 I" {% T& u4 `9 m
        if ((val = *addr) != 0) {" }& a$ N. g* Q# s+ d
                /* Restore the original data before leaving the function.
% s& Z- }, D/ n4 H) g8 e. @  V                 */% P  N. X8 a% s2 U
                sync ();
" N; R" _- u5 U9 d3 ?( M: h                *addr = save;3 \* u5 u: c1 ^2 c
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ U+ T# m. F- t, G1 t6 u                        addr  = base + cnt;
# e: e# A0 V; b0 ^' b                        sync ();* b' x3 ?6 U: y7 J3 P" Y+ o" Z
                        *addr = save[--i];; u) u) N8 h+ x4 i& U
                }
+ x/ j; \& k& Y9 }                return (0);/ ]7 b  s# i# t& i0 j( j5 i7 E
        }
0 T& q/ r. i0 j# g* Y8 n/ U
/ e% |( v; l7 F% i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( N0 ~2 F7 I5 z, O6 Q* W                addr = base + cnt;        /* pointer arith! */
$ }4 W" _' l. _0 B7 `' `                val = *addr;( i! b0 K2 `: F8 ]
                *addr = save[--i];/ W' q$ D4 L8 ^( y
                if (val != ~cnt) {9 b+ R/ Z" X3 i& q
                        size = cnt * sizeof (long);
0 @+ x1 M* _# k& ~1 _: l; _# K, U/ F  R                        /* Restore the original data before leaving the function.
; O, A0 r9 _8 a! n- g7 H* k                         */7 L# h8 M1 @  L" X9 U8 E7 l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 K5 S% S3 a1 i3 N( U( @8 l
                                addr  = base + cnt;/ c& W. k9 l# b% I" o
                                *addr = save[--i];
8 z) u# K- d* v% Y1 [7 I5 Y                        }2 ~: P' h2 d) |- s
                        return (size);
7 ?2 Q+ _: H( {  z% l  E4 b4 T  w, C                }
/ }- I$ U9 T' \! g& B7 K3 p        }3 `" l9 e% V1 W6 j+ l! X6 k* o

9 l- F+ J5 q, W4 c- m* }/ s3 U) x        return (maxsize);
, H0 \6 C% w7 Y4 ^}
, ^) q, o0 S2 Eint dram_init(void)/ I5 s* i6 R: O$ d7 H% C0 s
{
' K6 u0 y5 E7 a% t& W) E  f1 f        /* dram_init must store complete ramsize in gd->ram_size */
/ b* Z5 ^# U* ^$ z4 i        gd->ram_size = get_ram_size(
" x+ _7 t' T" H! s5 Q. `' v                        (void *)CONFIG_SYS_SDRAM_BASE,3 c- _  U# v" P* ]2 h* G% e" x
                        CONFIG_MAX_RAM_BANK_SIZE);
7 C1 ?0 Z7 ?8 e3 Z0 ^        return 0;& Q5 \- E" }4 F9 f4 C; R
}
/ J( P, ^6 ?) p4 E
( G( V; F$ F, @# J8 m) h
% `9 ~# V( o, ~/ {) O
6 k. Q" f* t3 C3 o4 [
& E7 e- G4 T: Z4 C' {$ PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& n7 X0 Q* u  m) q+ e4 m
% [2 r9 u" Y8 _- ~
& A' \, j  P' v5 A2 W0 n2 k( i
- S; W/ Z( v. y+ X+ r' [4 v





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