嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit, v" U" k2 t3 O, y- g5 h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; R- M/ ~! d, S) G( @" Z0 U; e( P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, g9 E- q! c$ i# m

3 x% O# Y7 |" R是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 p, @3 t1 s# J; Q1 c' g* P2 I+ U

( ]$ ~3 X- M6 f
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 b0 B% h& o) C# ]
/*' K4 K% ]' R0 Z0 u, \' [
* Check memory range for valid RAM. A simple memory test determines
, E7 G4 Z! T7 u/ b7 P( _* the actually available RAM size between addresses `base' and2 X5 d; L# ~% x) J3 B
* `base + maxsize'.
! m4 r# [0 b" A3 H' |. {*/$ ~$ U& O) _0 S5 z$ O
long get_ram_size(long *base, long maxsize)
6 R% _& m1 j8 P" ^: D{
6 S+ c6 E  w! U% h        volatile long *addr;
6 J; E9 p1 }* f4 k# z        long           save[32];5 G! x4 R* [5 X6 Q+ j, A3 A
        long           cnt;
9 O! r. F. P5 @. X1 Q4 S        long           val;
  C7 b. h0 l, u7 m3 g        long           size;
$ E- E( a) a! K! J        int            i = 0;
- L  Q/ u# q9 }' z0 ^6 t" f
8 T+ \! r) ~" f( b; G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 n! M; X( \0 @' v+ K1 S                addr = base + cnt;        /* pointer arith! *// ^. [! D4 ~* U0 C  Q) ^- h
                sync ();
! `5 Y: A- C- o                save[i++] = *addr;3 M/ V5 L! e' L+ X3 O
                sync ();
4 R+ S- X7 n5 i: T                *addr = ~cnt;
5 A5 I# i5 G! T" ?        }4 Y: V+ n# y  Z( [( Q- b4 d* B4 a) m
- Q: C# T5 B3 J5 E
        addr = base;0 o. J# P, V* N4 Y0 x; W
        sync ();
+ n/ t! a8 ^* g! Q1 j        save = *addr;
. V( e# ?+ D1 d9 n8 J" H- [4 K$ ~        sync ();
" C% L. M( L  Y; `" r% B        *addr = 0;$ l3 C8 J- R3 S( Z
* Y: o* L& ^2 S3 ^( g
        sync ();
& c* L  a2 S% F# J        if ((val = *addr) != 0) {% Q3 q3 K. r$ \2 C
                /* Restore the original data before leaving the function.
# T' S) E% r* S7 u4 ]                 */7 F2 s% F& ]' s
                sync ();
) x- E4 }6 s, `; q0 S+ N6 a                *addr = save;
: h' ~% M0 k3 ~# ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 O  j4 Q, N! d; y$ H; i
                        addr  = base + cnt;3 D- c8 [1 Y5 E- h" m/ o: S
                        sync ();
3 J& ^2 Z& z: ~( b  k                        *addr = save[--i];
& E# d$ L, l. r8 T# r2 G                }* e& @* h7 A( V, [' p6 ?4 Y$ N" M6 @
                return (0);  Y- J' Y5 x; u4 D
        }
7 l2 P! s( i. e/ r+ p8 j$ T1 }/ K9 }  Q" T. Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, O/ ^* ?3 J) ?( X                addr = base + cnt;        /* pointer arith! */7 ~1 \* p3 ]- z
                val = *addr;
/ C7 v+ D. R6 `  f7 ]2 H# V                *addr = save[--i];9 L& i+ Y1 ~) o! ?$ I
                if (val != ~cnt) {6 C2 i% S5 z9 C4 I/ J0 y
                        size = cnt * sizeof (long);
6 Y/ w9 y6 K, J; \& t                        /* Restore the original data before leaving the function.
) W( r+ P6 l4 ]/ S8 R5 h$ C4 @                         */
5 z+ z& R' z% [. R0 O# Q9 q) H* }& ]- f                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 U7 h1 W/ y0 g) ]9 G! A
                                addr  = base + cnt;$ P+ m, C3 z; P8 K) n7 T3 \
                                *addr = save[--i];
& C. U: F4 ?% \                        }
% p/ [  z2 |4 T; s3 m. Y                        return (size);
8 G) K7 J( b, i  e+ C                }
" c& o! Y6 {- \, ]& O        }" J; p3 `' R* z1 Z& O
; Y8 r! U7 r! X3 C3 B
        return (maxsize);8 a2 m, Y; l8 W$ ^/ x4 B
}, N3 d! P! l4 d. N! z) D; |9 A
int dram_init(void)
0 m3 C5 o/ a) j9 t9 \) N{
0 q* J+ W( i/ A1 {3 P% |        /* dram_init must store complete ramsize in gd->ram_size */) Z9 \2 U/ ~& k7 W' T( [5 w
        gd->ram_size = get_ram_size(- M) s& l; _  e; S& w9 s* A
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 {; o/ _# Q& ~1 f5 ?                        CONFIG_MAX_RAM_BANK_SIZE);3 e  N0 W& o- B; L1 }) _& G% h9 U
        return 0;
; R  ~4 Y7 G0 g}
% p$ q" g/ R2 }( b3 e- l: e5 i( g* [6 Z3 ]4 z0 M! x

6 u0 S, [. m+ C' W* s7 U- \  A
( v$ w0 E2 s- s; }& l
& M! z. ?7 r$ ~FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 J! Q5 Q( R! Q, h4 A: M/ Q
$ g2 e) y9 m. i! n$ v4 L: O/ i+ [6 v+ j, I
! w- |: ?0 v2 d- l4 g4 s  L





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