嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- o) ?# Q# S% T核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ W  D% b  N2 Q5 v7 y) i这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 ~: M0 ^9 \* _4 n6 c0 O) L
+ o9 i: g7 }9 L
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( U: [. u1 @9 o0 `' J
' @+ q9 D- p7 k: }7 w8 W3 A) K
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* c: Z1 H6 b) n0 p1 M' V/*
* J$ t7 k( |8 J* Check memory range for valid RAM. A simple memory test determines7 H0 S# `, G5 L4 m- b2 D
* the actually available RAM size between addresses `base' and% s$ I0 Q/ K) P$ Y
* `base + maxsize'.1 [0 v. p' n* Q) i6 c( x$ g' h' \% G
*/, ?- n4 F" n8 V
long get_ram_size(long *base, long maxsize)
# l& I" O* @' j( l{0 e% B1 `9 Q: c) F# h
        volatile long *addr;
4 b9 t2 B! C5 a) ?* E, Y- P+ T6 f        long           save[32];* ^: J( w: x7 r+ x9 k: ]8 h
        long           cnt;
# l! G( ]' Q. m0 }        long           val;
; X; I7 }) S; e( g% _5 R        long           size;4 U! T/ i! _4 H: F+ I
        int            i = 0;
$ y9 ^# }6 h8 j( m5 E3 B- M$ a" }( |  h: Q
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {6 `8 C1 F0 P: E8 d, X0 w) T
                addr = base + cnt;        /* pointer arith! */% g) ^4 ]1 q: k: f, v2 m1 [
                sync ();4 a/ v+ @6 O( S3 G
                save[i++] = *addr;
+ N, |# W; C) D8 S5 |9 w/ V$ ~: [# i, v                sync ();, ?3 E4 u# m1 _! }
                *addr = ~cnt;$ `8 |0 g: }" N) J1 I" R2 A
        }
5 ?; l# H# F1 S- y1 k7 E3 g6 F. H
        addr = base;
. T5 N# @& @! }0 ~        sync ();6 s+ s6 K/ K- C9 m& `5 U6 ^, g
        save = *addr;
0 k# i! z4 e7 J        sync ();
) H9 ]/ T& a1 T7 D, R  O0 l( q        *addr = 0;
6 M$ W* \: d; j6 y4 S. [3 C5 h  O% x1 \: `+ J9 t4 C5 D
        sync ();
) a$ I5 h5 m2 |& C6 e. Q9 c        if ((val = *addr) != 0) {
% d% {. H8 P' ?" m$ _                /* Restore the original data before leaving the function.
' s' C% k; g% }! g: Y                 */( v2 u+ Z) T0 \/ o' J
                sync ();
' e; \6 |. N  S2 Z9 Z9 f- Q( c                *addr = save;) s7 f* r2 N' V, K) `. r2 @: |% @
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ J) C. V3 D- ?                        addr  = base + cnt;
6 L) g% k3 F1 X% l6 y+ B/ x                        sync ();
  J$ ]5 N- L( r, y1 ~                        *addr = save[--i];
) X4 f6 S6 ~/ [! R                }
5 y1 N/ f* _; H$ P- N& A6 ]                return (0);6 B2 @, Z/ n8 \: J. U& e" }* J
        }, B+ p1 A7 J8 j+ a) \! N, X# @- y4 W

0 [( s  Y% n0 a7 l# H        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# }* w, g: y* U                addr = base + cnt;        /* pointer arith! */9 B9 }% s2 C5 ^' @6 F6 l7 P
                val = *addr;
% ?8 z; ~6 X/ i                *addr = save[--i];2 C2 O. c" q, c4 B0 a  _
                if (val != ~cnt) {
. [& k$ r3 N; o# p' l0 `9 w- [                        size = cnt * sizeof (long);1 l: E" X# v( y- B4 _; G% d
                        /* Restore the original data before leaving the function.6 f! W5 Y+ n$ P# Z' G3 l8 W( q
                         */4 G8 K$ {9 K) v4 ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 s  r2 ~  {3 ?, S! s. O
                                addr  = base + cnt;
9 H3 j, ^# p# ~$ V, ]) I                                *addr = save[--i];3 s3 T6 Z, M/ F. A8 L; x
                        }: W$ E" c) a  E( F" z' a
                        return (size);  s, @9 L0 p& U, E. R' B1 A; I( S# ^
                }# w" \1 i  w' c& q: n
        }# h1 |* @" q  a3 }

5 |& a, C2 U  X" r8 l( j        return (maxsize);
* k' z9 l! B# F. U}6 ^4 Y0 b* d2 Z1 H* C4 X2 Q
int dram_init(void)( Y+ J! T3 U7 C" H* f
{
# g' u' o4 ^  v( S4 J        /* dram_init must store complete ramsize in gd->ram_size */
1 _) E( g& P, I2 e) Z, I        gd->ram_size = get_ram_size(
. k4 W0 C* S0 L                        (void *)CONFIG_SYS_SDRAM_BASE,7 n% g6 J0 r' S
                        CONFIG_MAX_RAM_BANK_SIZE);! j9 n: o: u* }; R
        return 0;
3 f4 n7 M0 t% q& l. L" m}2 Q! l, @5 w. D/ ^# J

. u; V# K+ [/ p* r! ]5 z( R; C4 U' i4 S- J, e8 `8 P+ B5 h, G

% i8 t) N" E( F0 p! l% p! M% n# c8 s9 L" d3 |5 X1 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, q. W2 R% B$ Z7 t  f

+ s$ P0 L+ \  [- q' ^3 A
) G0 s# s6 b) a9 o# q

/ `0 Z/ d, E5 A7 S7 Z




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