嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% @0 U# o* H' }8 I* C4 a9 h核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 l6 Q; R6 J2 E; A3 q+ d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 J+ i1 N3 f+ T1 [8 ?
0 z4 }& f' f3 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ l! j( s6 m  Q" y9 F! Q2 a5 B/ h& G) g& F

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. N  J& {. ^; n+ s/*( ?- A0 F$ m8 E
* Check memory range for valid RAM. A simple memory test determines1 @8 S4 E2 `) n/ W* l# _" Q2 S
* the actually available RAM size between addresses `base' and% X% z( H9 ^1 c; j# H
* `base + maxsize'.& ^4 [) G5 C% X5 K9 e
*/3 M5 g& Z7 F, X: S9 Q1 @! A. G
long get_ram_size(long *base, long maxsize)8 \" Y' _! z/ D, h
{
) s- R7 i; p" `% H! p5 q        volatile long *addr;
6 t7 w8 F% D! ^& e8 C+ }        long           save[32];
+ E$ A. d- E0 o/ k, d  v        long           cnt;7 i  k- Q& o3 G9 s
        long           val;
  {/ y$ M! N& u$ t' M' ^        long           size;
1 ^) d. S$ Q6 f2 l5 l8 L7 r0 i3 y        int            i = 0;2 m6 j! F- ^" O  U  i! K

" h9 N* d* O% o( P        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {, j9 r/ y7 d. {: k3 k0 U* @
                addr = base + cnt;        /* pointer arith! */
' U# ~, w- y, u                sync ();
- K  C1 V1 _7 l6 j4 K$ f                save[i++] = *addr;
  U, X6 C/ @% q                sync ();
# p  c  r. g# @& H. n                *addr = ~cnt;, L7 I2 c3 c- |9 {
        }
) \, w, M4 S4 ]' @, H! y0 @7 r: K& F& s& t5 S0 ?
        addr = base;
" Y' Y! ^+ s2 @' G% s2 v0 x+ _        sync ();
2 @0 x1 n: g( ?7 ?; E* T        save = *addr;& G2 L4 y. G9 z6 L* R
        sync ();
. \/ g# a6 g* |" o! ^& o( E, B        *addr = 0;
" `$ C6 b* o- C1 ~. r
. v# g" e3 @1 T3 F! r" T        sync ();
0 z' ~5 D0 k9 Y- H$ H, W        if ((val = *addr) != 0) {
/ B5 m/ j8 d' {& E                /* Restore the original data before leaving the function.
0 d; \" y2 Q& L: V/ Y3 i                 *// l- t6 U- c' Y4 c" ]0 ]3 j- V# A, o* k
                sync ();( Q: R8 |8 r: o$ b& v$ G8 o+ f
                *addr = save;
  O2 l% R, a5 q" |( z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( g. d7 I! z2 |8 n$ i5 s                        addr  = base + cnt;
% C0 x  P. J2 H3 F) P7 I$ p                        sync ();
! E; E( }! _) i% v                        *addr = save[--i];
9 h# [. I* W2 J/ z                }
8 E' f9 f; L' F6 ]+ d( v. ]                return (0);* h4 V: c) @3 r) x, \( ]/ u
        }. C  C, M7 n) T* V) f
8 d8 {9 ?& _; s# n. p6 E
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 R; p4 L( \+ |/ H                addr = base + cnt;        /* pointer arith! */0 {6 N& b  V; p: Y- L# c  u% l
                val = *addr;6 V0 D4 M  z3 t$ t
                *addr = save[--i];
8 N$ H$ @9 M: H0 B1 J                if (val != ~cnt) {  V* P) ~, N" ]5 t  ]3 p
                        size = cnt * sizeof (long);
; S6 T! @3 f" @( f% q                        /* Restore the original data before leaving the function.
) |/ l$ c1 q8 d# I/ V. ^9 f                         */+ x9 q9 @' O) m  w% L" R
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) W" f! T2 H3 }) |' ?9 k, [: \& f
                                addr  = base + cnt;
4 ^' R& o5 u( i                                *addr = save[--i];0 Q6 u0 x9 C$ K. O3 P5 g
                        }
4 O9 J+ E: E5 A$ g# O; G                        return (size);
0 \# [8 C$ `5 i                }
& L) U1 s# n0 |7 r3 f3 d& C+ f        }
) `& }6 O. y: n( e4 \0 G) `
' t) V, E6 e7 D        return (maxsize);3 d7 a& f5 i: D- ]( j
}; j; ~# A$ {- k, v7 l
int dram_init(void)0 K- n* I$ Q7 h
{
, l/ ]* K. x+ c7 y        /* dram_init must store complete ramsize in gd->ram_size */
  C: i* R5 f) ]- N4 m" _8 x6 |        gd->ram_size = get_ram_size(+ V' Q. Z) V2 w( u/ a' V* L
                        (void *)CONFIG_SYS_SDRAM_BASE,3 J6 |' m) @/ J) L2 N! O: K
                        CONFIG_MAX_RAM_BANK_SIZE);
5 V. y7 L3 y& F' E        return 0;
2 S9 B- G& S# ^}
$ A# H! O6 x& i" Y  l& c
9 T2 g6 q: t. o8 s
' {: q  Z6 c: Q2 [4 C  l
. y5 }/ ?0 v$ P! ~" o. f. [2 K6 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# F& G% K4 \0 Y! X0 e, ^

2 h: A& Q" T& j2 p, Z
0 k' i& `% o. P8 I3 o5 U2 C' U

6 L. g" b9 S" y7 i5 ]




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