嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! R) Y- R7 j  g核心板2:DDR2 256M Byte   NAND FLASH 8G bit% R- ^# G3 S& j* T3 Z5 M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ g, o! r1 s6 Q. ]9 h$ a( B% p& j* m- Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* p/ U" H; @) J: s8 A
" ^1 ]& J3 t& N% S5 I* \; u" E

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ e1 s5 ^, e8 b3 O3 v; S7 l/*
* o2 a3 [' ]% @6 V$ @- {* Check memory range for valid RAM. A simple memory test determines
% Y7 c, q5 w$ Y" r* the actually available RAM size between addresses `base' and
- N* t7 a4 B; _9 u% \- I) ?* `base + maxsize'.
' p8 }: {! {8 W*/4 c, \0 I6 T" U9 B
long get_ram_size(long *base, long maxsize)) x9 D$ d/ b3 A9 [. A
{
/ U; T9 s2 n1 [0 \. ^# n        volatile long *addr;
# F) u  V+ S9 k0 B* F        long           save[32];
* ~8 B5 `0 \1 v7 V* S' z: o        long           cnt;
7 @/ b1 {5 L' K' u6 i! t        long           val;8 ^* b) U% w% ~! o; T
        long           size;' M$ T( N8 v+ f1 Q, _/ R
        int            i = 0;- h: ?7 n' A' E. U
! J5 U, ?$ m4 O6 Y$ k/ Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- e8 x- P, j0 k6 Q' A                addr = base + cnt;        /* pointer arith! */8 B' \" a0 N  u4 J5 Z0 r! M
                sync ();
  {, E/ p' g% Z1 K5 d) D2 Q                save[i++] = *addr;" Y& g( ~% V9 K6 j- X# ~
                sync ();
8 I- j3 R4 w  {/ ]1 S8 K" s  v+ T0 }                *addr = ~cnt;
5 J3 P4 l1 n8 ^: F/ I1 ~        }3 @. l. h, S& w1 k. r% G

7 \  F& c9 ^% S; S) r  ?+ a7 I        addr = base;9 X' D# Z. _% [$ _
        sync ();$ A( R2 p8 G7 J& f) G- p7 ?
        save = *addr;
( X( l8 N8 V: n0 t6 @7 |5 Q        sync ();
$ F8 l/ g! o+ y; {  o- Y        *addr = 0;
* L0 i: z# m; B+ n; ]" Z$ \( M' d( c0 x* @) k# f1 A
        sync ();  N# f# g5 V( ~) S5 P' W
        if ((val = *addr) != 0) {5 V1 z3 c* E" z
                /* Restore the original data before leaving the function.2 W% g5 f# X# t, q  K& i' U8 z2 {
                 */
+ m4 U/ |; C. t  D                sync ();# b. ]; m# K0 P& S
                *addr = save;
1 o, t2 t5 W" X; M0 K* G% `% J; ^                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( j8 \6 @. x: B; x5 U. Q) |0 Z                        addr  = base + cnt;
+ e5 e' o& p9 `$ b                        sync ();
& ?+ S$ E5 w# R                        *addr = save[--i];
3 r+ j9 f8 d$ K+ m$ h                }( `4 \& u1 @9 g( ]& N# B. q  f
                return (0);
# u% Q; B5 ]0 L& ~. H        }1 ^+ a" ~4 W9 l' N& {7 Q. D% C

0 R( A: s. S1 `# F( k  }1 r        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, L' ?) x) P# Q3 I4 o
                addr = base + cnt;        /* pointer arith! */% ]! s0 z6 \3 g
                val = *addr;
9 u9 O% y% b/ V! L                *addr = save[--i];
' K) B7 X  ]* L- X                if (val != ~cnt) {$ a* J6 H( Q6 h7 {' S4 V
                        size = cnt * sizeof (long);
' D  M2 ^: b2 u, I. Y" v                        /* Restore the original data before leaving the function.
6 m6 x7 ~) _$ }6 v( n' a" u                         */
6 w2 Y4 S4 ?3 _1 i6 d: _6 ~                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& w3 Q: s* \8 {7 u0 X' E8 ?) }3 w+ @                                addr  = base + cnt;
3 y- H* D2 y4 ?, Q9 N: H                                *addr = save[--i];5 p  z9 [3 j. ~1 f: u% P
                        }) Z% e7 z9 N; S' `' T* }7 m# n
                        return (size);
8 A! F/ ?5 p2 Z! J& R                }5 h; t6 p- s3 Z- A3 W; L8 R' m
        }/ Z- r* ]& m0 {8 i0 }
; k% ]: p3 C! q. q4 g6 G
        return (maxsize);
5 S" x/ K/ z' K$ K6 }}
$ S# `; a0 v' [! o' aint dram_init(void)" G2 C  V0 E6 j( l  `9 ]
{) ^5 r, k! T4 `3 [* D
        /* dram_init must store complete ramsize in gd->ram_size */$ q  x5 z1 q% R% z
        gd->ram_size = get_ram_size(
/ ], h& x! p3 H0 x/ D                        (void *)CONFIG_SYS_SDRAM_BASE,
8 _, ]# U, g; N$ I0 g: e: F# L                        CONFIG_MAX_RAM_BANK_SIZE);
8 X9 M' D8 T! M; f. M, y) }        return 0;
- i5 O3 |3 Q; u( e' _}3 ^6 l  h# X+ m3 i- k4 R+ x' G
, g0 Q. X( U+ T7 O$ L

( g3 G# M  N( S  L3 K) J% v  k9 G% l4 V0 G
0 W4 @8 r7 [* Z9 s4 N" b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% [$ C$ w9 g; R+ x! @
( L. Q# l9 P$ n5 ]5 `3 Y* g  A. \0 Z) i# i8 ?  r2 ?

1 v& D' X+ c9 H" @# A: X, a5 Y




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