嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ Q/ F( H9 t, M; c( q3 s% S8 ^2 y核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 a7 u' y# U# c1 o8 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 s* _. H4 K, ?, r8 f
, T% q& {2 T- p  V4 P3 G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( `& V7 [4 J* @! ?, y

) d% v) F1 M$ y2 {4 V' [% c; n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" R3 C. u0 c/ A5 O. \; a- p/*
& p( X1 w) A3 ^; w+ j0 K* Check memory range for valid RAM. A simple memory test determines9 e! w: g5 l7 S8 I
* the actually available RAM size between addresses `base' and/ _0 m. {& B: x
* `base + maxsize'.
" I& t: @. U) t6 W- }3 f*/
* ]( ?0 B' H5 k2 I) x/ L" S( @long get_ram_size(long *base, long maxsize)
0 U4 c/ l2 _7 ?. O2 [' l% i{
7 J2 u, h2 E6 W        volatile long *addr;1 V+ r' |! H3 Z1 y; u# n. j3 i& y+ k
        long           save[32];( F* W: K* x) S; s$ S: T+ T
        long           cnt;
: w: U) V$ u; @/ K- @% w        long           val;
4 O0 p+ |1 b8 i4 e) }. [        long           size;* E' z3 e0 t0 I  \1 [! W- P7 G1 h
        int            i = 0;7 n' K- p) Q' Q7 M0 c9 I6 o
$ l6 W6 N1 B" q  [9 I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, V2 U, \! u) K7 I4 w* m, n) Z" ~. w$ X                addr = base + cnt;        /* pointer arith! */, v' F: v. r4 z" ^( Q4 c; @
                sync ();  N( Y0 r7 }: h# @" M# }
                save[i++] = *addr;
4 Z" t; n  s$ |, p; t5 e                sync ();0 ?! U5 M" E  f: p+ v
                *addr = ~cnt;, m0 ~9 v4 x5 k; Y" ~+ B
        }
! ?/ \; z  C! Q9 d. q$ T
2 m! x$ Z0 J! c        addr = base;
. r) A! p; f+ O. u* j        sync ();
9 \8 D! O7 O  D$ H0 r# N# s        save = *addr;
& W6 m2 s$ m. G- w/ O/ d        sync ();
# Q3 r( Q% C8 z  b        *addr = 0;* R; H' f! {& b. L: n, u
5 h5 k- d( k+ f* P7 A
        sync ();
0 N/ l8 |" [8 T8 X9 B9 l3 ]" {4 j1 @        if ((val = *addr) != 0) {% s9 \) f8 c. j' @
                /* Restore the original data before leaving the function.; V( V) W9 l$ V- h3 ]1 z8 y0 C4 j
                 */
3 a! U  k! F+ }5 {+ b$ v" L                sync ();
6 K- k: v- ]% S                *addr = save;) B" G/ e" N5 R' ]% X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ]9 ?, q+ P/ i+ V6 ^, n
                        addr  = base + cnt;
3 Z! ^* L" g: g6 g) m" c; [                        sync ();$ z1 j8 R' S/ W& L( e
                        *addr = save[--i];5 j/ t. a2 _( h  v
                }- m, X$ Q) `( y2 ~. l; ?
                return (0);3 L. L% G) k& w6 @
        }& F. m% C# ^  Q/ v& s7 D
) J' _  p$ l0 M- h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* g3 `$ s+ L/ l2 y  Y+ u7 Z  {/ e5 m. p
                addr = base + cnt;        /* pointer arith! */
# E# H1 M1 E' f- `. N; `                val = *addr;
/ `) w1 C5 _3 C                *addr = save[--i];
' |' V; e& N: Y1 u( @) w  P                if (val != ~cnt) {: L6 a' p7 b5 L3 v8 c
                        size = cnt * sizeof (long);- ^8 w9 t2 h" P0 z$ |) F5 S# _
                        /* Restore the original data before leaving the function.
" m+ Q6 T0 p' m# v. ^" @  V8 Y8 Q0 Y                         */
1 I/ S8 C$ F, O* o! ~3 ?                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ {' ?4 D6 m( b; [! t$ v0 w                                addr  = base + cnt;
% y. X. y* B. ~8 \3 D                                *addr = save[--i];
- `/ l, I- I' D% T3 V. v# f                        }, m3 M) F9 X( t- r
                        return (size);
% n. U* Z! W% B& P                }
( V6 b/ ]' @1 G/ h" j        }3 _" o6 a$ o# B" H1 h

: c* V; |7 q5 i8 L4 P        return (maxsize);
8 U; e, O( \' t; b1 w7 t; e! `: G}
4 X; B0 m3 R9 h( iint dram_init(void)
0 @' S  x# o# W{4 D3 {! L7 z. }8 v
        /* dram_init must store complete ramsize in gd->ram_size */7 |0 a4 z' I5 v( i1 `
        gd->ram_size = get_ram_size(
' J" a/ r' d% V                        (void *)CONFIG_SYS_SDRAM_BASE,
: r5 g8 }7 X! C$ O0 M3 O                        CONFIG_MAX_RAM_BANK_SIZE);5 x# ~- N; g) B# d* u4 e% R" e5 r* R
        return 0;7 O) [# p2 {- A6 e) u% x
}
1 k( X1 U) ^6 b8 s% q- I4 ^; A. ^, V4 E; |" ?. S

# y4 C8 U7 u7 |( Z# Q
9 F, f$ ]6 K! w3 @/ f
1 H8 G6 |. O- G6 Q2 k! HFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 O3 f6 N, D; v6 g1 {9 |7 a, L2 Q7 E8 h! R' G

6 Y4 q& ^. C. Y$ p+ r  }/ f0 i

; |  m5 m; G6 E4 k' F9 _4 A+ G




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