嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 Z% g  k" _2 v; S2 _
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; k1 s1 A) p' m- n# Z/ Z5 A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: `6 m# _. ?  Z/ X: X/ N
0 w2 Z$ Z# U( y8 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
6 B2 O0 G( ?( g% C" |/ \# g; S
3 Y: I& X  Z$ `- ]( O
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 I  }6 s& Y) a  ]& _
/*; A; p3 @+ A3 D( A$ L
* Check memory range for valid RAM. A simple memory test determines0 Z3 p# L8 U( M; [( x6 `$ P& Z! ~
* the actually available RAM size between addresses `base' and: P0 S. g# S+ h  K9 g; _: ^
* `base + maxsize'.# {- I$ P4 C9 m4 v. c" O
*/
5 u5 f. r! ?# c# Blong get_ram_size(long *base, long maxsize)2 ]. A  w( ]" O. a- h/ q& F
{
/ v3 j. Y  O8 D0 f        volatile long *addr;
6 |/ N4 Z5 w2 v, l5 ^8 ~        long           save[32];/ `' e. X8 {. d* q
        long           cnt;
" d, g- K  J2 {: {" T( L, J) p$ E        long           val;& ]$ o9 T: S& _* {4 j9 g
        long           size;
3 k: \: T" }5 |6 q; b        int            i = 0;
( n0 ?1 ]# O( m  X! @5 O. ~2 P
- L$ w$ k1 Y# h2 X. A/ G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 `$ y  B( C2 h% c4 I
                addr = base + cnt;        /* pointer arith! */
1 g# y0 X' _. W& b- r1 T                sync ();$ Z; ^, c: x- _5 V* I. x7 E6 t3 L6 @
                save[i++] = *addr;
7 {! ?; s  b  O, T9 R6 b# `# m8 a                sync ();
: n2 v/ P  S1 _! a; \                *addr = ~cnt;  r- `: h8 v/ \7 E9 h& C3 E* a
        }
7 W  U3 u$ B# o& E3 S2 C: `
9 A# r$ i: l; D/ Q! `# F        addr = base;% N$ a' ]. Q" v5 a& x! n
        sync ();
  M' a1 O9 S' u# M- X/ C        save = *addr;
4 ~4 l3 P7 A- B4 J# P        sync ();
& o1 H& p& Z9 S" w        *addr = 0;
; V$ r' F% Q  }
" Q; n( A: C: P6 M) d        sync ();
5 g. c3 X3 |6 C        if ((val = *addr) != 0) {$ \- z0 {  p/ t( x* G; F, t$ c
                /* Restore the original data before leaving the function." x- E# r9 T: I5 E" F
                 */
$ j" \+ M$ d- Q3 |( `6 j+ H; A/ z7 I                sync ();# z; C, v5 I! w- x  J$ w" b; g
                *addr = save;  `5 ~9 }. ~& g9 t! ?: {9 o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 p2 N$ G+ G$ A7 T0 _+ f5 b' {/ u                        addr  = base + cnt;
' H$ d! R+ _6 l                        sync ();
% j- p0 `9 Q7 a; d" \2 Z9 x                        *addr = save[--i];$ L1 @! S/ k: c  r
                }; I5 l+ G" N/ j8 K
                return (0);
) ~+ w5 z' h9 U$ N        }+ W3 ~3 i+ n2 d( Y4 J9 r6 p3 i0 g
$ D7 h$ i7 T) I+ ~, L
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 P2 ~0 G* a$ |- k7 n                addr = base + cnt;        /* pointer arith! */
  o) X9 L3 }3 N+ N1 D                val = *addr;/ c' I0 `9 W+ i- F; M' P" G' K
                *addr = save[--i];1 h$ q: i# o' S$ K7 ?0 M* \6 y
                if (val != ~cnt) {4 p0 D% @  A3 m1 ~# x( v, c
                        size = cnt * sizeof (long);
0 O4 B( {2 k2 c; U8 y! G                        /* Restore the original data before leaving the function.$ Z1 i+ R, I" V6 A2 V
                         */
" J+ q3 q$ q" P' [0 I0 {" t2 V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& @: z6 l9 T9 }                                addr  = base + cnt;) ^$ M% ?' g" i
                                *addr = save[--i];
, ]: R4 D, u1 d# C                        }
. r5 @: {: S: o$ ?( C) }$ j                        return (size);
6 a/ L7 N. m! A* H! ^  l7 o) K                }9 e: Z& O% q  Q4 t/ [
        }
1 u: V! X1 r5 F5 h4 K( t; x" ~. M" }5 J# L+ i
        return (maxsize);
4 J! s( n) i- x6 ]( b3 l}
, x1 X, Y: Y; i- lint dram_init(void)
* Z/ d6 ]: d, A; N! F{
5 u. b1 o$ ?. I9 Q3 h1 _        /* dram_init must store complete ramsize in gd->ram_size */
. T+ N# G* F  e9 @$ Y        gd->ram_size = get_ram_size(
4 S. t% o  G1 D/ S! }) X                        (void *)CONFIG_SYS_SDRAM_BASE,8 |8 l- x6 i1 o3 x
                        CONFIG_MAX_RAM_BANK_SIZE);" I# g: T1 h5 x) ?6 [# G9 V/ U2 J* V
        return 0;
- a, @" `1 V# v( q. @: X: N' ?% P}0 q! h+ i* T) q. P8 d8 D

! k0 o* J. g! ?  E) V  ?2 F6 Q# u
( k' K9 v1 O% T1 [0 O
; p3 _2 D# f3 X$ O# ~0 m4 D9 I2 B" B% y8 k0 I9 o
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: D( T) ^! N( D
3 K( m0 I# Q& K

; W6 {3 T/ X6 z, I, o& t. }
, x. |# r2 Z2 o, z1 m





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