嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 b$ |6 A4 e) {+ Y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 ]" Y' i/ G$ `/ r' t  d* h
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% B+ f5 F& z) l# I1 Z! ?+ o* _

9 l5 E5 a" J1 H+ e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& ?, n/ ?) c" t8 U4 z% Y
; E6 g8 ?: B  t* G/ f" A+ ^; K( L- ?
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 c# Y# U6 p9 P4 m( N+ s& M- d/*
  p; N0 E, |6 f% n+ G) m0 i* Check memory range for valid RAM. A simple memory test determines4 y, P! O7 P& @$ z4 F6 M$ E' b
* the actually available RAM size between addresses `base' and+ V/ M0 r% c; o
* `base + maxsize'.6 Z8 X# [1 O3 z& }( h2 v4 R6 r
*/$ y8 U. z9 a8 W8 E3 i9 S) g
long get_ram_size(long *base, long maxsize)
- }- P2 G6 I3 @' {7 x{& A6 n# ~  f9 w( k$ s3 d1 l
        volatile long *addr;- g. I, C7 ^  n0 O' J. @
        long           save[32];
$ I4 D" g2 L9 a        long           cnt;
. |0 p5 J6 t3 k        long           val;
* s$ ^2 C3 L7 K: p        long           size;2 N, J3 }& K% A* T9 X
        int            i = 0;
8 b& f" ~% r5 T; b
" e. ]- m& I9 ~( B        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: t9 C) Z: F- k- W$ T; g: s) g
                addr = base + cnt;        /* pointer arith! */
$ p# N) A# a) W. F, X, t                sync ();
! p6 Z8 L5 o! D. M% P0 t1 L                save[i++] = *addr;
2 o& b6 A7 d9 R* Y2 F+ V8 \                sync ();8 R3 H0 J: P# L8 n% h
                *addr = ~cnt;
2 e& I1 k% }& G) g        }
! C5 {9 E4 u% D' D$ c6 a5 i
0 Y, q: C$ |; J3 H# `, Z1 G        addr = base;
! Q" Z, N0 D. z* e$ ~$ s        sync ();
& V; N9 m' N3 g0 p; U        save = *addr;
, c8 [( J# v! x; B6 b7 W        sync ();% M9 Q" e2 C5 Z" b  J0 {
        *addr = 0;0 _: x- }3 e$ s& n

1 U* l' M) Z+ }% d; n9 {( }        sync ();
4 L6 u2 _7 m# k2 j- Z9 C5 y0 l/ k        if ((val = *addr) != 0) {$ s7 L$ e3 N/ t
                /* Restore the original data before leaving the function.3 O7 o* y" }2 e8 z7 {* O  z
                 */0 T* I, F' P" @1 m
                sync ();/ l- }& H, r; N, X9 y5 l8 f
                *addr = save;
7 d, A# t* a4 o+ y1 F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 I6 [# Y1 g0 [; i. Z1 M6 M                        addr  = base + cnt;" T' Q% K5 _0 x! [( S4 c
                        sync ();. Q. P/ S* R" [8 q: X& O2 h# q# d
                        *addr = save[--i];& h4 J# O4 S8 f5 t$ u" {1 R
                }0 l/ K( w; }' @7 t% O
                return (0);
' m4 A( d1 i3 m7 W        }
6 m: e1 O2 c# f6 @2 i2 k7 m) U
' A* H: n1 i; u2 a- p- i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  w* [1 ~" h$ [1 e
                addr = base + cnt;        /* pointer arith! */3 @3 K5 B, ~9 D  i# z
                val = *addr;
; G9 I" J1 A$ |5 U" n                *addr = save[--i];  p8 t5 b( F3 |: i) H6 a- \7 f
                if (val != ~cnt) {, J2 O" ]8 e' ^# t2 C: c/ R
                        size = cnt * sizeof (long);) ^9 R5 u( _& p8 F
                        /* Restore the original data before leaving the function.0 J: k2 \# i# N
                         */1 Z2 ?) S) _- \" K6 E
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' j( d! \5 J4 Z5 F7 J! U
                                addr  = base + cnt;
& O7 i" t% j1 U( P                                *addr = save[--i];
  ?; s4 i& C1 f- u. o                        }
  S4 N% Q. N0 q6 Q                        return (size);. D) ^7 [% `, `3 B' W8 V$ P
                }# c+ j/ q: k' E; g
        }
% Y/ i2 W( I1 i4 {* l/ l3 x( O& |. `+ _
        return (maxsize);
) `) N2 ?# J. C0 J  v6 b8 D* B}
6 v; ^' V! W: e4 D1 ^* U$ }9 }int dram_init(void)4 m7 x4 I& m+ r/ P; V
{) B# G  v0 p0 I7 {+ p% P
        /* dram_init must store complete ramsize in gd->ram_size */' b4 c: [" {0 P3 @
        gd->ram_size = get_ram_size(! m6 q8 m) k) M& `1 {. \
                        (void *)CONFIG_SYS_SDRAM_BASE,3 B2 S0 f- W7 T  f1 f) x* f, ]
                        CONFIG_MAX_RAM_BANK_SIZE);$ h4 a: t' m" i7 r: i6 x# v2 Q
        return 0;
( W  r4 a7 u$ O' D}
0 w4 M0 ?& U: w; ?8 {: j- `
* o" d  o  x9 [2 U; A
+ l6 ?: D- x; @# U( ~* g4 O' z/ J6 I" X1 L! u- ?, L2 E
2 ]" ^: n; e% C1 x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 T# Z7 _$ d" ]
, z8 C( N. z! `, b% _1 i: g# _
1 I% E( a6 f+ E5 G/ d- r1 B- V

( l$ J. A. m6 ~! f1 c0 @/ U* O




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