嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; A) p7 K" G- G2 l- A- F' x/ P" M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ Y/ \. @. N8 x. I; J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 _4 C$ e/ ?" f! z' Y

  y* Y4 O* E& ?: M是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" V, T1 J7 \" f
, [3 w  U' T% }# N4 i, u5 s

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& T4 I# w% Z. f( Y, j! O! V. ~- v
/*
4 ^8 T; O9 A. X& p& J% S* Check memory range for valid RAM. A simple memory test determines* }* M/ C7 q" b: S! N1 k' r/ o  Y: q
* the actually available RAM size between addresses `base' and
- G' y; a+ h: z; q' U* `base + maxsize'.3 o- u! H1 f! _
*/3 R) p8 O: r) C# S
long get_ram_size(long *base, long maxsize)& e. d% k8 d( S4 Q
{' V3 p, Q5 E( V' \+ Y" E# K
        volatile long *addr;+ K1 C5 K* Y1 C0 O" @! `- m
        long           save[32];/ ^: P( N0 p' g# w$ U! \+ W
        long           cnt;
5 J4 s% l5 J0 G        long           val;
8 @' o7 v' }, P4 Q$ J$ X        long           size;3 Q& s6 z2 w. G1 O" W3 d" T
        int            i = 0;& h$ ~0 w* r2 b3 C+ G( G6 Z
; [4 o7 m% r- t& K2 P8 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 n- O! B; Y, \9 {( H
                addr = base + cnt;        /* pointer arith! */8 Z: Z6 D/ l  z/ M2 b) D% k' l
                sync ();/ _$ H5 h% B2 T  R4 G2 @
                save[i++] = *addr;
* N" c' W7 a6 A* o) ~                sync ();
; `& B/ M% W; L1 k2 l1 B                *addr = ~cnt;
% T' W1 @1 T, r5 u        }; ~' K- L6 y1 a% _( T/ L
: a) a% h0 O; H, ?0 d. o% v
        addr = base;
4 |4 Q. \/ ~5 D$ n! ?        sync ();7 ~* F  H  T2 Y% r
        save = *addr;& k" l2 u9 [; o8 r8 Z- h: P
        sync ();
" e0 M; K* \( k6 l+ \$ P' i        *addr = 0;7 M9 {( s5 y1 d" i  z" ?
  E1 a4 g+ w0 D- N# I5 p
        sync ();
7 c2 G1 p5 J5 K% u# |# c        if ((val = *addr) != 0) {, y6 f! ~) a3 s- m" u. C3 f
                /* Restore the original data before leaving the function.
) P8 |% W. h2 H6 n2 u                 */
2 C8 F4 Y0 \4 @% c: t+ j" Q" q9 J& n5 O                sync ();* H4 }% @4 C4 \, T9 w" X' J
                *addr = save;
: b. q- ]0 O3 Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& }# ^4 O3 t$ Z& l$ l                        addr  = base + cnt;
6 J- {' p& j7 {% h& Q( y! M                        sync ();
* P) E& v6 \3 T. g6 q                        *addr = save[--i];$ q9 w; S) c% G( b' S5 I. q
                }0 E7 K1 \' J7 K' @  g$ Q
                return (0);3 s3 F" q* X  M) ~2 h* X
        }
5 u$ g5 x( }( P/ t$ ~! T* v  s+ _
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ z$ u, A& M/ n! N                addr = base + cnt;        /* pointer arith! */: S2 @, M) P1 U+ Y# n+ V9 h5 {
                val = *addr;
& f5 w8 M# g+ C- `2 F  g                *addr = save[--i];
5 `% t: Y5 Z' \                if (val != ~cnt) {
  f1 X0 L0 M- y# g. x6 R$ b" F                        size = cnt * sizeof (long);
, f. T) j( y) i& U  P9 @& m                        /* Restore the original data before leaving the function.
8 S- F: u6 g: `& t& M                         */
; Y  S6 j* V" e+ ~! e" r                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 j  c" E: k. j: ^* ~                                addr  = base + cnt;
7 X0 s2 ~& s3 ~6 D                                *addr = save[--i];, m. G$ |" i- [* I4 U" g9 l- H
                        }
+ ~; D5 R; Y; l# |+ Q                        return (size);; R, g. u0 B) [% L7 b4 k" l' O
                }+ S% P8 o3 k6 b( b
        }
/ P1 l' F  d3 A; {' H% D: K6 T9 T' H, O: P; f8 ?
        return (maxsize);' L) t6 ]$ b+ S* v. Q9 K
}
) ?9 ^, X9 X% Y, J4 _! u* }int dram_init(void)
# g1 \. @6 g2 q! R{4 |  X0 v' |( F5 u
        /* dram_init must store complete ramsize in gd->ram_size */
: X1 W  Y3 |7 L& v7 Y        gd->ram_size = get_ram_size(: J& ?7 v8 [  I' L% ^( N# S
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 b3 w4 `: k0 e% C. t7 k) ^                        CONFIG_MAX_RAM_BANK_SIZE);
1 u& x  E) ]' _! }        return 0;% k+ T( m/ }! b! L
}5 m$ M; D% `, ?9 y) D" C
& K, U# m  g; B' A+ c/ d9 N
, g  ^+ s& d+ A$ f; r; B- X6 h6 e

; {: l1 r, _* u/ F$ W
. F3 l+ t. O( P+ a4 t' |  iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!1 z' i% F% K- p8 b; s3 N
7 h9 u8 b! Q# C
8 ^) ?- I/ s! F  V, N) j: r

0 O& Q' G1 J9 K9 ?




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