嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, \6 U* x& ?; K8 h( j; r; l核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 e* v" o7 M& O1 n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% H% z# \, r4 ]7 l" o: t

# a  J( S5 Z2 n- V( F. h" t7 k( ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?$ [+ |5 L; I+ U, `
$ X- y2 z8 n) U4 c9 t" s2 C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  C% Y6 d  d3 H# t! f1 W/*+ ]- V1 I5 N. V; u3 l& G
* Check memory range for valid RAM. A simple memory test determines/ g  R. F7 R  \$ d0 Z% K
* the actually available RAM size between addresses `base' and
1 H4 V# |6 H3 I/ f% J3 K( A* `base + maxsize'.( W; b% K" t8 D6 [- y
*// Z( s8 S" }+ R7 `% M
long get_ram_size(long *base, long maxsize)
4 T+ D8 o* r9 |{. c: d5 r; b/ e$ y
        volatile long *addr;1 {% o4 @  f' }3 R$ X; A( E4 W
        long           save[32];5 I% B0 [& Q$ m8 i" F# v( ^2 R
        long           cnt;
& W. l6 x2 B/ W; W5 T4 S: a) z5 X        long           val;
: D. S: i* C6 Z7 d, r% W8 Y" y1 ~        long           size;% s, {! T5 `& N8 N$ k/ q: k+ m
        int            i = 0;
+ {: @+ s. ]$ J( u* F! w3 o5 y" S' u0 c. o
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. x! E; J; x( D! x8 O
                addr = base + cnt;        /* pointer arith! */. n/ @8 a/ K4 H
                sync ();
& C& d% ]" |% e/ I                save[i++] = *addr;+ s) v; l* t/ p# E9 ^  _
                sync ();
3 @$ R4 @5 {7 C6 V/ U' `                *addr = ~cnt;
, z! M# U3 E6 Y; X# z, N% O        }
2 Z4 o' [' Y4 t5 s& b6 n% s
/ l/ r4 D0 ]1 r        addr = base;& V+ R3 s! ~/ K% A$ m
        sync ();7 O8 w+ k9 @$ K/ Y8 @
        save = *addr;# I4 b* P4 b( B4 J8 U
        sync ();8 P4 t1 S% f" m) ]
        *addr = 0;0 O9 ~7 ]8 {7 m* g  M

0 p3 Y9 a! A  I% h5 l+ P' |        sync ();* I/ x# B4 a  X+ S
        if ((val = *addr) != 0) {+ L5 j  {. p. t2 b& K
                /* Restore the original data before leaving the function.  W7 }: T: X. k2 G% Z1 {9 I( }3 W
                 */2 E) g: l5 @, X
                sync ();
8 s& p! {  m4 K. e) i) ^3 P. X                *addr = save;
$ ^; v) s1 u. l6 e5 ?4 T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% Z; i% a/ F! p' c; G- ?, v" T( t3 T                        addr  = base + cnt;; w3 C. T* I* Z- \- Y
                        sync ();
+ a% c# d2 i) ]2 G( M: q                        *addr = save[--i];  Z, ^8 n7 ?; u, p) S
                }
9 ^  m& \- R+ S9 V                return (0);* |6 ?8 {! j6 x0 F
        }- L% I1 ]7 a/ O

) z9 ~2 n3 B# Y; N4 n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. g4 x4 H- ?8 a9 V+ X! g7 @/ g
                addr = base + cnt;        /* pointer arith! */
1 B' i2 A8 {% D                val = *addr;, u: V1 f" f" S* H4 x$ Y
                *addr = save[--i];
' u+ A6 M% c2 Z/ ^( @' D                if (val != ~cnt) {
9 y) N) L: J" ~" s3 \                        size = cnt * sizeof (long);4 p5 t9 E) F0 b# i5 ]
                        /* Restore the original data before leaving the function.
' Q) ]! x$ a7 u, d0 r+ N                         */5 B# b, y0 x' y# b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {8 y. v7 p3 ~) j4 K
                                addr  = base + cnt;/ }! m. K. c" ]# f6 e
                                *addr = save[--i];  O! p! Y  H, u9 ]
                        }1 ~7 R( s3 a6 `- g: X& }
                        return (size);- ?$ O8 Q) A7 b, i
                }, ]: o4 W) h! \, e9 ]
        }& t. z5 N1 N5 k3 d( f

2 K$ g2 i4 @0 C4 |        return (maxsize);
8 ^0 l, s  `3 `& l) X5 m}
8 l/ Z. ~) O& J3 ^( A% E& oint dram_init(void)
- _& ?) I, t# M4 T{
0 c' v5 [1 K6 t7 A4 S& o6 Y- G        /* dram_init must store complete ramsize in gd->ram_size */
$ }& W: Z7 A* j/ R        gd->ram_size = get_ram_size(
7 B: z4 J6 \: u/ n- \1 w/ b# G                        (void *)CONFIG_SYS_SDRAM_BASE,( T) v5 L8 \. q8 V0 x7 _
                        CONFIG_MAX_RAM_BANK_SIZE);/ b$ i- D. c: @: V7 k( |
        return 0;3 H0 R8 [4 `, [# p7 y; x
}
7 g3 A: k5 A: P1 I
1 v: Q2 ^- t- q. E! w5 q# d% I1 L; s2 l

4 j, @; C4 v; w  J
( N7 U1 i% u: l, j" z; JFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 D. P# E2 z5 L& q0 A/ O. A6 W& n. o

9 A/ m& D1 C0 ]+ C

# e1 s! Z6 k& Z, ?0 X) b




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