嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 p. ?$ o& S& }& N+ k( L核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 X# ?( d% X) h, D, p. i5 @# r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 j$ a% E1 A2 v1 O. E
. x" Q$ t/ e6 s  T, R6 W7 V' A) G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 R4 c9 s, I7 V" o5 r9 @6 y
' s& {1 {3 t+ [; L& G- n: C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( c6 ^# a9 B  C' x7 L) N/*4 y. o0 C+ I& t  m; D( G- r
* Check memory range for valid RAM. A simple memory test determines
" \) f5 _+ x' X* the actually available RAM size between addresses `base' and7 R6 d2 I8 h' }# F0 ~0 b! d% W, R
* `base + maxsize'.7 ~: v; Z" s7 X2 h; o
*/
" @) \* ?. v, Nlong get_ram_size(long *base, long maxsize); l! B. N1 Z" N/ i% {& [$ h
{5 c. c0 P1 r  e1 |) e  l  L
        volatile long *addr;
5 k' W. ^. ?0 |        long           save[32];
& ^! H8 k9 V. Q1 M5 s        long           cnt;
/ p- Y6 a- r  X0 O& \        long           val;% E, n9 R5 A# E  t6 q% h
        long           size;0 K  m, g7 ~+ j+ e4 Z
        int            i = 0;+ s6 ^3 s. f7 k! A! g6 a
% s; K9 n3 p9 ?9 z" e  I
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' L1 z; j6 @# g% O. t* M1 @4 h                addr = base + cnt;        /* pointer arith! */
( t- ?& T& e8 L6 o                sync ();; {! k3 }! N$ U/ J% c1 I0 Q
                save[i++] = *addr;8 n) Z4 _" x8 O
                sync ();" }, C% r2 U  m/ k- n2 `. J5 `
                *addr = ~cnt;
( v0 m8 ]. R8 O' j0 j' ]# X3 S2 B4 H        }4 m" n! n, D/ z8 H( |6 N0 x
# Y+ B3 b: S. q9 F8 d" x5 L: T' {
        addr = base;
8 E2 n& F4 M( V5 W* q        sync ();4 a9 A& C3 ^/ G( z* Z0 n2 A! p
        save = *addr;
7 B" d5 M9 d3 L5 U4 o        sync ();
7 j; Z4 }( N( c1 k/ f, b) q' ~+ N  O        *addr = 0;
* z6 h2 l& |8 m+ b
5 C3 |- a" |# v8 T5 C        sync ();
9 z8 f& k: A+ z: Y7 I; ]0 d5 C        if ((val = *addr) != 0) {( }5 B& C7 d# a, I" G8 `/ @
                /* Restore the original data before leaving the function.
1 b% A! J$ \$ X+ }* ?" y                 */
2 t# M  o* o8 L5 \) {8 c2 M                sync ();
% i, u$ c1 Y& f+ ?6 c! L$ e) e' O5 U                *addr = save;" z0 P; w0 ?- v: N0 G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ k, ^" x- P  t9 r; l; \7 o: r
                        addr  = base + cnt;
# y6 l9 y# P; x) z2 G" \8 K                        sync ();. J2 e# E% q% ?; k
                        *addr = save[--i];! Z9 k7 Y" F( ~( T: E" m: D2 o
                }
# R3 _8 C4 Y( ^' s; z" W                return (0);1 A/ H( ]1 Z3 Z+ z
        }2 B- w) w. s6 e$ S& [  E
$ U# t) `$ b. C4 R/ D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ v& n& D7 Q, V9 L, C, \. v
                addr = base + cnt;        /* pointer arith! */9 m/ T) {8 n7 y( F' |
                val = *addr;
" v& p  ~$ w$ H9 E                *addr = save[--i];
. c, O( s6 R  s% I* L8 d8 \                if (val != ~cnt) {! K; p7 _/ ?$ m" l) Z
                        size = cnt * sizeof (long);, c' R9 o! x! }' K
                        /* Restore the original data before leaving the function.& r) Z. T. G$ _2 S  D0 z
                         */
  ]9 g2 {& u4 ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 u2 }9 ~5 ?7 Y( A  W                                addr  = base + cnt;
& ?; ~( R1 z4 y$ `* l% q                                *addr = save[--i];
! P* A' ]" r/ t" X2 G1 E: t6 ~  |                        }5 b# Y8 P1 {" D" p$ u; ~
                        return (size);
' k2 O( Q/ `  N% P5 @$ B# H8 T6 G+ A" q                }
1 K7 L; r0 ]% u; P. r        }& @" `' e  I4 _
. P, k' S/ F$ Y  A" ^
        return (maxsize);
, S  f4 y6 j" f3 j4 E4 L! [. b}' J/ H* P4 d$ r5 Q) M9 `
int dram_init(void)5 G6 ]; Z9 e  s$ b
{7 b  v* T. Y' }$ X0 Z4 M' m
        /* dram_init must store complete ramsize in gd->ram_size */: O5 S' {1 J( a6 x1 y
        gd->ram_size = get_ram_size(
! b0 Q3 p( A- a- I8 ^$ x3 x5 I                        (void *)CONFIG_SYS_SDRAM_BASE,
9 K7 ?6 t9 f; b3 ]                        CONFIG_MAX_RAM_BANK_SIZE);
# }8 ?" L0 Y9 ?) T# V& B1 B3 L        return 0;2 P6 g3 b6 z+ i
}
' V% l/ f/ v- |
7 \& P0 f' I* P/ b- ?- w/ k( x. D: E: U6 C
' A: J5 V, J' ^" A' K# `

# Y: x& Y$ I0 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# k9 d0 B' e3 S* g2 \2 A! D4 m5 F9 p
/ Q" m5 w! q* C6 O5 _
# h) s7 q! m  u5 ^4 S8 G: [





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