嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 c; A3 q. l1 \, T+ X* O+ ^2 D; w
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 K8 c( \# R. K& p6 b4 U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 w0 @4 u, L. b& m! z5 a; S0 u
: X1 E& j: ]+ F' }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ k0 p7 ]5 Z/ b; J6 m# C
3 J+ t9 A+ H' T' n* H

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* F8 R  b9 X1 l6 R8 [
/*
, n+ n0 }) k) H* ^% J4 N* Check memory range for valid RAM. A simple memory test determines' \* e# a6 R" U8 ]3 n
* the actually available RAM size between addresses `base' and
3 X5 R- L+ ?1 i* c' s* `base + maxsize'.) x+ h$ C4 V" z
*// D; B$ X2 T+ q/ A
long get_ram_size(long *base, long maxsize)0 Y/ a/ k3 W5 s7 m% G
{
1 f, u; R1 L& W8 R/ j        volatile long *addr;
  J% U- k" a4 f! m; Q5 f' _- k% d        long           save[32];
% ~2 h8 ]* E3 a$ x        long           cnt;: j- ~+ g5 p2 K. q
        long           val;* w3 G  Z6 U- ^2 f+ B
        long           size;1 A/ g3 {" u% Y
        int            i = 0;
5 g9 A/ f3 @8 ^! A  ^* o
' H3 ~1 c% d+ b  p) t$ I        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 [# a7 M: y5 ~) ?0 m) D
                addr = base + cnt;        /* pointer arith! */! z4 y/ d$ z7 s" B
                sync ();
2 y8 Q. o% U- M$ K                save[i++] = *addr;1 N- x/ @  V4 A$ A7 p% p
                sync ();
, F, u% j+ H2 ]$ c  ]                *addr = ~cnt;
$ M$ _/ D: l  I- u/ |. L        }1 K1 {- X1 ^- Z- V0 L" [
% W7 `. j! A) c* T/ P
        addr = base;# `9 V/ M! i- ?' c
        sync ();; D* w3 s( A+ W- a5 [4 T" y
        save = *addr;
0 u/ v. q# n6 L        sync ();
; u) ?2 U$ A# X, E7 I0 L7 z% ^* g3 Z        *addr = 0;
9 ~: Y: x( h% W  [! T9 \3 a6 D$ z2 P+ d+ k
        sync ();( j; a0 K* w0 B. \. V7 W7 r) r6 g% j
        if ((val = *addr) != 0) {
8 \6 d  R5 s* a' Z" Z. [" @                /* Restore the original data before leaving the function.; r  p% B1 @, c/ ~0 _7 ^4 {% n5 z9 w- j
                 */6 c' r5 r' l9 m4 z& @7 T
                sync ();% W+ g* K9 ?: ^/ T5 J, H( Y
                *addr = save;; M9 u# E$ l# p: m1 j& A
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( I9 k3 L! N1 B* A
                        addr  = base + cnt;% {7 s9 {; j* Z3 m
                        sync ();
7 Q3 x8 Q1 p' k                        *addr = save[--i];$ P# E0 i7 O  }
                }
! O( I" N8 j! M6 ^                return (0);# d5 c) r: M2 F( H1 `+ @
        }7 p( {" M4 X7 A" u9 h* R$ |" r9 m
- e$ `# }) Q9 Z. D, D' R* c% N0 `
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 n! |8 i2 E' T. j+ M                addr = base + cnt;        /* pointer arith! */+ f) ~; L; j7 n- a6 K8 A% l* V! O' |( s
                val = *addr;$ E% }$ H3 h- ~& x$ z' ~
                *addr = save[--i];
% A+ L4 S4 C# m! C. X                if (val != ~cnt) {
% `9 \7 ?8 Y3 G# B; a' U3 T" I                        size = cnt * sizeof (long);
5 c2 h; o4 K' e2 K0 k  y4 D% ^8 n                        /* Restore the original data before leaving the function.% x/ i' e/ C: ^1 e7 |
                         */
( a1 r3 s3 ?* `- w& |% b$ J                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, f! x' Z1 w! X  m( r" t% F                                addr  = base + cnt;
6 q- B- @: k+ T  ?5 {                                *addr = save[--i];) U" e- s( w$ T' S& W
                        }9 N* r1 {" k# e6 v$ [9 u! p
                        return (size);
  E( k/ B+ F  G8 D- r2 q                }; z* n- m8 r. D- V8 @. I
        }
' W* I) G0 L  U! j
6 I. ^$ W# I7 w: X        return (maxsize);
, v; N8 i% t5 Z9 T2 t: t7 b3 c}2 p0 h. B$ ]3 e! q) b5 A4 K
int dram_init(void)) ~/ Z- ]/ S6 v: M
{" V/ [2 U' A5 q; B
        /* dram_init must store complete ramsize in gd->ram_size */
% L7 l6 z$ h' A/ P7 w        gd->ram_size = get_ram_size(, {+ a( s) c$ v7 a$ C  u# B: u
                        (void *)CONFIG_SYS_SDRAM_BASE,8 F8 a( h" u2 m' l- f- `) X! k
                        CONFIG_MAX_RAM_BANK_SIZE);; S" B6 k* O3 K; r2 ?  {7 K3 ^
        return 0;. l, D3 z5 e7 G, z% C9 A+ g
}
2 \/ A7 d; f  }6 p) |
7 ]. U/ R8 g4 m% ^% f9 a4 I# v+ j- b" u
& U$ w* L, `6 {# [6 Q) j1 w" t
! z( f, L5 s& D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ ]3 _# {3 C/ ~
1 Y0 I8 ~  S( {5 [

- ^1 ~6 p4 u& |4 O( P

$ s( b& E/ P5 r# x8 n# ?




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