嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% g$ ]( v! F0 k: [- X8 Y& Q/ z; U2 v7 X' I核心板2:DDR2 256M Byte   NAND FLASH 8G bit! l$ u! v! l! M/ g9 e5 x! a! V3 e: Y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* c$ l; k1 I% W7 v( ?" I& x& m1 N3 u' O) B& x4 z& C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; K; Q$ _/ v: r' N' S7 G' j' O
; A$ D3 B+ w1 S$ v! z, D6 H6 B
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i; @" t: |+ @. m2 k/*
, B6 T8 F- g3 `! {  r* Check memory range for valid RAM. A simple memory test determines# Z6 Q- W2 s% ~" c. x! K
* the actually available RAM size between addresses `base' and; ?% J, K- X3 W  k! e
* `base + maxsize'.
' J& K, q/ ?" |8 K*/! b- b0 e- v9 y6 H6 m9 ]' ]
long get_ram_size(long *base, long maxsize)
' p4 O, Z- m; z* I$ r' j# @{, n& x8 G% x" w
        volatile long *addr;2 T' J. h, o4 I' v5 g% w
        long           save[32];
2 R2 W9 o! h/ X  O' ?, Y: M5 _        long           cnt;" Z, r3 W( [9 u* A, F. m+ w
        long           val;( _# D, {6 E+ x- [
        long           size;, A- b" g* ?! g1 m# Z0 N0 O
        int            i = 0;0 u  i4 q, g$ V

/ p% ?5 v2 Y* V: _/ _        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 n( l) |! W1 _- ~$ O. C1 g( M+ E% v# c                addr = base + cnt;        /* pointer arith! */
. h; |2 G/ c  w7 }0 X$ M  O                sync ();% a4 ~* u5 y$ N" C5 `- Y2 w
                save[i++] = *addr;& w+ u, _: ~* I9 q0 f5 N
                sync ();$ [& }: W3 y7 F" l) {
                *addr = ~cnt;$ ~( D* o6 F) b* u
        }
5 w& n* f3 \: F% g! S
1 ?0 q6 r9 h5 k# _5 E# q: T        addr = base;6 n& N% ~' M. J' R* [/ c( g
        sync ();4 U, M2 j: o: R, r, a/ f
        save = *addr;
# S( D" `8 c. z% H' u; v; K* a        sync ();
( A# [, v& C# \/ @! j6 e( S8 ^        *addr = 0;
& H4 k& [- s. U1 b
/ p# H3 h; |: c& g% ?$ l+ _2 n        sync ();
: ?. F7 q/ G2 |        if ((val = *addr) != 0) {- w4 {, d. m+ K' ]3 e4 D
                /* Restore the original data before leaving the function.
  n/ w/ J' y  s' `- i0 ~                 */9 t+ J" M+ o5 N: z* V! ?: p  p
                sync ();/ t7 g3 x' [# F) w5 l* f" a; ?
                *addr = save;
" v' ?1 J$ v- i! Z' z6 F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 H4 d! T) F8 q/ A0 Z                        addr  = base + cnt;
. H( A& Q2 Q8 q$ {4 W' }4 g- }                        sync ();
5 [& v: z& B; _+ n# M7 u                        *addr = save[--i];
+ ]. b: j* l7 ~& y                }
6 G. q7 `; {, x9 L  h0 t                return (0);6 q- j& D  l; m) O7 `
        }, T$ d. G, L$ O( ^- v/ j

: H) e: p$ b. l5 `; D        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" J. u5 i" D8 Y% Z+ S$ B# I) w3 p, W                addr = base + cnt;        /* pointer arith! */
! X' [5 \) Z. J- D8 w: T4 P) K& Z                val = *addr;
3 e0 b* `& x, s. ^# O7 l/ w( L                *addr = save[--i];0 L0 t1 o. q' o: J  j8 y1 \
                if (val != ~cnt) {
) w& W+ F" j+ K; P                        size = cnt * sizeof (long);# H/ [& I/ l/ a8 `
                        /* Restore the original data before leaving the function.0 P3 _4 |# Q2 C$ Y, T, D
                         */
2 p" g5 d1 m4 d                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# P5 w- F3 B' W9 v' l, A                                addr  = base + cnt;
$ H$ ~4 [( x+ }5 G- @" G  E0 l                                *addr = save[--i];
% u7 r9 Z* I- \. w                        }
# t4 @0 c8 l6 _, d                        return (size);
) \. R, f9 ^$ a5 B, f6 e: z6 \( V                }
; u2 c% P4 ?/ h. f; ^0 f7 d6 M        }1 l# o2 A8 K: S' F. V5 W

+ j$ q+ U5 q7 f        return (maxsize);
5 B% L/ ^) M1 w3 M4 Z' K) U; j* o3 m}3 H* b5 Y4 b! K5 x+ Q  N
int dram_init(void)
  ], C& r  z" O; @* p{
; @* ]# P. g# d% ^        /* dram_init must store complete ramsize in gd->ram_size */
' I( X; }. [6 f% Q& n1 `7 I; x  z        gd->ram_size = get_ram_size(
# [' X' ?: |' b                        (void *)CONFIG_SYS_SDRAM_BASE,
4 d0 ^5 ^# c+ B9 `                        CONFIG_MAX_RAM_BANK_SIZE);/ \* I, H" A6 M# Q  H: S7 E% j
        return 0;+ Y: `+ m$ G; k! Y+ ]; Q* C
}  Z4 C1 @6 |2 T" P: f4 _% S; p, S' l2 i

) q8 j1 ~' @! k3 |/ P) o( c
& n2 w: v4 F/ A& m6 U/ D
( `/ G7 C  n/ m7 f# P( ^  S
3 p! K0 B8 w% UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- S' m0 Y1 w: U" O, f% Q0 B' j! D
; i6 K; \. g/ `; n) F* P6 e$ y) ?! H% L6 `) n
( t, R' _+ w) o





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