嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' z# Q% C0 W1 a
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 W8 R# k  k6 R! _; I  \+ i
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 c9 i+ e% K/ r/ C
- ~7 Z# [) P/ O6 r7 q3 J8 T1 `: J; i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% v# ~3 N4 y; u( e! V7 g
, y' p) m- x3 U- w
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  O. Q% T9 D, `; U* e/*) _1 }$ b' `+ M, j! W
* Check memory range for valid RAM. A simple memory test determines  M' g6 Y/ Z) q# [# ~
* the actually available RAM size between addresses `base' and
: Q' P, P8 g* q* `base + maxsize'.
) u: T* n: ^8 ~7 e0 u, V/ x" I*/  n2 n6 T- v3 V" J+ ^9 H. O! W
long get_ram_size(long *base, long maxsize)
1 [* w" S9 i  _5 Q6 b, T{
0 B; l! ]2 b! W+ a4 G) e& i        volatile long *addr;
. Q1 r6 z! x# m0 s3 ?        long           save[32];
# u, z7 f+ d. Y' K$ [9 |        long           cnt;% i& }$ Y2 E0 e' @9 X( Z
        long           val;! Q! g+ _  A: g% \4 R6 g" L
        long           size;8 T' g1 c, m- d* Z2 n; z6 B
        int            i = 0;
$ _& ^- ~; e, E/ S$ t8 j6 j3 }# ~$ e5 K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* q/ Z. F/ p  R+ a4 b2 g
                addr = base + cnt;        /* pointer arith! */' w- l; G* e4 N7 l1 L3 k  y6 L8 y
                sync ();1 @& r/ i2 }5 @/ N7 _' s
                save[i++] = *addr;" v  U' k6 E" ]) B1 {3 u  J- ]
                sync ();
% l. {1 b5 O: n# G                *addr = ~cnt;
6 Q# D" A4 K- q& \        }/ g; T6 N9 R. w3 j% ~2 n7 @

% l' d, M3 ]: C        addr = base;
9 P5 Z4 t, p9 H4 N- P. T) [        sync ();
& w, ^; [+ u7 c: q1 G: g" h" b        save = *addr;) @$ D2 p/ O6 ?! ]) ^/ s! Y
        sync ();
0 K5 l1 u( h. q$ q        *addr = 0;
* ^7 p( o! Q/ e5 @1 y
6 L3 O  U0 x9 x6 T        sync ();
2 N2 B8 G1 t, D/ H* ]        if ((val = *addr) != 0) {
" H/ {% y& d: @0 B# p9 n2 o                /* Restore the original data before leaving the function.
. j4 N/ K3 b9 ^  F- L                 */+ [4 k* U8 F& {. L: U3 C% L
                sync ();$ \# L2 H. m" c
                *addr = save;% r% e0 e& o( c( V7 C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 a/ \5 I5 d8 k: q% z% O! n8 M
                        addr  = base + cnt;
5 E, s- b& m/ V) B! X, g* M4 A* Z                        sync ();
. |* P) ?# C" J$ ~                        *addr = save[--i];5 E$ y! o8 E9 W
                }3 g8 u7 g2 F1 s0 q: ?* X: b) e
                return (0);
  @0 c* f) _5 W/ H; @4 A        }* W8 R- R* W+ b; ?
  t) ?0 n: i& z% A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 i8 A6 }8 S7 a& D
                addr = base + cnt;        /* pointer arith! *// q- g. m0 ~" z# H- S
                val = *addr;, d6 c3 j4 \+ v* }: Y# v$ O
                *addr = save[--i];
3 T! Q" }. h- n8 P! P; U8 i                if (val != ~cnt) {
$ X( C% }$ B; d                        size = cnt * sizeof (long);# H2 s; k2 w- |2 _
                        /* Restore the original data before leaving the function.  m$ `+ Q/ |9 B/ b- j
                         *// b5 I0 _' k3 ]6 d8 U6 x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 ?5 p2 W. {  D' Q+ d: x                                addr  = base + cnt;
) T4 F$ I& L+ e5 A! O" z" P0 x                                *addr = save[--i];
$ o( M6 |  Z5 H. y# [- f                        }
7 k+ w$ K* r0 e. C1 f2 p, }                        return (size);- R: H+ ~; N& T8 j
                }0 B- Q" r0 E$ O& M
        }! N/ j! P  A; r  ]) f- E
2 v5 }, n- |: m5 O3 p
        return (maxsize);
" l3 W+ |% t: N: Y* n8 ^; _}4 Y% p& h+ T1 q: H8 m, H
int dram_init(void)5 ]5 m1 u  C, i* j, i/ C8 K; K
{$ P( K8 r2 s; C! B: A8 b
        /* dram_init must store complete ramsize in gd->ram_size */
# Z) z% N% i) v) ?# @        gd->ram_size = get_ram_size(( H! c1 A" R# i3 f3 S: a
                        (void *)CONFIG_SYS_SDRAM_BASE,5 K8 b, i. C" T. p* S$ ~3 w) b
                        CONFIG_MAX_RAM_BANK_SIZE);
$ m$ f2 I- I9 I8 f6 |" ]3 Y1 n; ^        return 0;
; I% ?! |1 T0 ~- L, m; S}
/ r5 q. Y6 Q, x+ A% F# C1 d% @1 }5 m# L: z( r" U0 o7 x

/ X" \$ t" L3 v7 E0 Y: J8 G! D
% i2 N1 f. V( _5 Z- f5 s: n
9 Q8 V  N* r! h/ Z  J$ CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% i5 s& G5 q+ L6 \

$ B9 O7 l) I% j/ f
/ R( ^. C* ^, m+ m9 Y. o/ r
) k) A8 J! y) k! V





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