嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 A* A7 A' f/ W4 x* Q% O) g) \: C6 N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 V: M8 i, p  I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 C$ O4 r9 O5 b0 Y4 Y
9 R" Y) G  T: J# r' `- o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% X) h) w$ k1 {! {" _: m
- \, T. O1 }4 V. Y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* I2 o4 M' o; Y- s6 A; c8 l
/*/ F8 E0 ^. T$ H6 s3 ?* c
* Check memory range for valid RAM. A simple memory test determines
) t6 w) E9 F* p' @* the actually available RAM size between addresses `base' and& @! d+ x  M9 G& J4 Y7 [
* `base + maxsize'." G1 J3 y! O9 U: w5 S
*// [( M8 h" w" h" g; v5 ^
long get_ram_size(long *base, long maxsize)
' O+ X6 V( x& i- y  J{0 {0 h) p* ~/ f  P
        volatile long *addr;
2 ]4 m+ q! F) g' r+ B* C! b        long           save[32];
$ F# Y, J. C  I8 ~) x9 v: y) c        long           cnt;8 J2 C! _2 E, e, t3 G, H# t
        long           val;6 s$ g, j* q; t/ Q; a$ ]
        long           size;
' A7 H* U" h! S, i& ?8 I! @+ D) [4 \: @        int            i = 0;
% @8 }9 ?3 a8 s& S5 }, o' M( _( Q" q, r  `2 \0 F& K) T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ i4 u8 ^. `- J4 ~0 u' M                addr = base + cnt;        /* pointer arith! */9 e3 j9 J. ]8 y- z
                sync ();
8 z+ |/ @, a; R                save[i++] = *addr;, U) P  }- I* `; w2 w; U
                sync ();" p4 m, E( O, W  s9 ~6 R! n3 k
                *addr = ~cnt;: s4 W2 \/ v1 H, B6 ?
        }* f: G: b) T8 x5 O
! R; m7 ?% x' `# R* Q
        addr = base;
0 {4 @  L. _2 @3 @) B6 I- E( }$ b        sync ();& O; @" G, G" U6 z' X! i0 D
        save = *addr;* j/ o( n& P9 E- y
        sync ();
' w' ~$ @7 v/ W) l6 E# J        *addr = 0;
5 T0 [+ R) ]" {
1 V- X2 ?- `2 y& Z- b/ I0 G        sync ();
7 b) @3 J: e2 M" ~        if ((val = *addr) != 0) {$ l5 l# k/ s. V* z* k0 O* x
                /* Restore the original data before leaving the function.9 r! C# M* L3 w6 Q
                 */
0 f/ P# R0 L5 k6 i* h# l8 l( N  X" E                sync ();! a! f! i9 e, {" j
                *addr = save;
6 L( [0 x* I- i                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 S3 t5 r! X2 D5 O; g
                        addr  = base + cnt;: K' Z3 Y' w$ K6 s2 ~
                        sync ();
, F7 q6 _( @8 k7 Y- d* A  X                        *addr = save[--i];
0 |9 c( Z" \$ s                }
! B+ h1 T- b( t                return (0);% e# U5 w- f$ w+ v
        }3 K. J  ^* C* a2 g5 l3 |$ c. @+ D

/ S, G. i. _# }- N9 E        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m2 F" }  p( c1 d                addr = base + cnt;        /* pointer arith! */* O# N+ D9 o; o4 I
                val = *addr;, f( m) W' L9 f7 e0 z  X
                *addr = save[--i];
. C5 i2 f* K7 j4 b: @                if (val != ~cnt) {1 ^" L" v1 F5 B' }/ b
                        size = cnt * sizeof (long);9 a0 C  u* h8 R6 w
                        /* Restore the original data before leaving the function.
; v$ s2 |: L; \5 E2 k                         */
. V, i7 l; g, O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ u; r$ ?/ G) P# x% {/ F                                addr  = base + cnt;4 I# G( T( x: v8 C6 V
                                *addr = save[--i];6 A" A* W8 d/ M. l) a' T
                        }
6 ~4 I( f8 V/ W" k' e                        return (size);+ d0 [7 W* p4 z# ]% p! f) \
                }
4 N3 \) E) J8 t6 P) `5 t        }7 k0 F0 h: \6 B0 y% R& Q6 u/ j
7 z( d. d8 y% J, t9 X! A
        return (maxsize);
* N4 ~: k( S% j. ?2 Q}
# @# Z! _( P& ~% L' Hint dram_init(void)0 K9 W5 t. R& b" V# h6 S
{# ~- r. ?8 Z' z! n3 k$ L
        /* dram_init must store complete ramsize in gd->ram_size */
6 {  J! a/ Q1 ^        gd->ram_size = get_ram_size(" h; X1 w) u0 I! Y% c+ M- k
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ m+ w9 C7 J" P# K                        CONFIG_MAX_RAM_BANK_SIZE);9 R8 [9 p' J$ @+ O# b& S2 K
        return 0;
+ U: A5 o/ C( H}
& d. B+ e2 b- `' N; U8 v8 j) O# ?- @& ~2 }# P

1 a, V1 \7 o! `- h) e0 `6 D4 J( [, o9 D3 E5 u" ^

8 b8 r9 u2 V, u+ I2 \FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ T0 t! T" y* }( M7 R- X
7 O8 a/ |/ ]( s; r
7 V: {, Q% R! |$ e
- F, L' r" P# R; z1 Q





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