嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 }6 y* K% Y9 c" X
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. W) }' {& j# u" H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, y* W& q. e& k
& s2 ^" k8 w. n( ^1 Z2 S# n7 f是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
2 l& E+ X' A* S0 @# U& e
! Z$ ]. B, X, ^, q% z+ D
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 Z! E& @6 v0 P* ^1 I  w& e" \& }" ~/*! b6 s& Z$ C: V0 ?6 W# i; R
* Check memory range for valid RAM. A simple memory test determines- m6 j1 J% i4 a+ f; ^7 e! c
* the actually available RAM size between addresses `base' and
2 h/ k' D; T$ S( X3 k  E& ~& M1 _" |* `base + maxsize'.; P4 }' w* e9 o6 w/ n3 ]  J
*/$ N* W& |$ x' _, W9 ]% ~& \
long get_ram_size(long *base, long maxsize)
8 G" X# }6 _3 R7 r( }6 }# |( {{
  }# M: n  n2 a3 c, Z& z6 D2 }/ G        volatile long *addr;
7 n3 Q% {& h: o0 @! s        long           save[32];
' I4 b" S& u% M5 H9 `  w4 o        long           cnt;
2 C' D& e: x- K3 N6 Z0 n7 m        long           val;  ]" U& O- Q% E+ h* o1 i' ]" u
        long           size;
/ F2 r4 `5 K- Y        int            i = 0;" x9 t8 K1 d: }4 K2 ^8 b+ \
- Z# f  X- V6 h8 F6 C5 a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. A3 }, v6 q: j" x; s! l                addr = base + cnt;        /* pointer arith! */. B9 a" Y' U/ s8 k5 [
                sync ();
$ P3 R2 z& P( w+ c4 }/ H! U                save[i++] = *addr;! M! o# }' n" J, h
                sync ();: ^! l: q* q* T/ A
                *addr = ~cnt;- v+ t/ D: U' Z' u, m$ }( L, V$ ]
        }
" \9 J6 K' K4 z: I1 a8 c8 M
  v$ p4 P; C! ~; ]; I" j$ Z& e        addr = base;* w! g8 @. @: s: F% `
        sync ();( g6 w, C% T8 g, q' \- Q- h
        save = *addr;' v. J4 ~+ ~! _) V/ ?
        sync ();
- \4 V6 F$ U) }7 H/ [        *addr = 0;
) l" z& ?8 o8 ~! B5 v
2 A, j" B+ L, b: f        sync ();
* T  Z1 t6 h8 N$ Q' l        if ((val = *addr) != 0) {
. ]& x( E1 s% u* f9 m                /* Restore the original data before leaving the function.6 z/ h# ?& ~* b& z7 H( Y: v. g
                 */% o* A: P3 h! a) G' n" U
                sync ();
2 V2 R' q. e6 V# {' `% p! Y' {                *addr = save;# `5 O' d; b. t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 E) D% `7 u  c0 P( Q& {
                        addr  = base + cnt;
# |) a; A: v0 ]' |4 U7 y                        sync ();
, v7 s6 y7 c  H6 e9 |2 ~$ w                        *addr = save[--i];
' v4 E8 X& O: V0 p( U' }                }6 D# N9 L# r7 [# S. N- S
                return (0);
, g, x( o* u% N9 H9 x8 b% Y        }
  K8 V' f5 `- u
! w( [8 s( q% X$ f+ l$ W: m. V" u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 ^- P9 g. f5 Y; t3 j( }- w                addr = base + cnt;        /* pointer arith! */
, c, |& S  t' \  M( j8 z                val = *addr;8 t3 q3 g& N6 B
                *addr = save[--i];
' @- m; P! C5 S4 T                if (val != ~cnt) {
3 {& ]3 N( y8 A, g- k; G, s                        size = cnt * sizeof (long);
- W. r+ a' w0 T* ^) R                        /* Restore the original data before leaving the function.1 g7 ?9 T3 s, j" `) N
                         */
' ^5 O( B/ t6 I0 W& N( t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 @& l: m7 t# d                                addr  = base + cnt;
4 J+ Z3 p+ [. T3 b( ?1 o, p                                *addr = save[--i];% j3 o5 r7 ]9 [! S( Y% [' ?
                        }9 E5 c( }! t2 G. b( E* p( K
                        return (size);
: D2 Y2 L6 ?' F8 n2 I8 z                }; O% n/ s5 v: H/ w2 s. i
        }
# h( c; K& o* f
* ~8 u6 G( ]  N        return (maxsize);+ A  i$ v$ V' J1 C+ ^. a0 Q
}" {; K6 l% g- }0 ~! s) d
int dram_init(void)
$ }5 q) d# Q# g{6 O9 V& G" J- b9 J
        /* dram_init must store complete ramsize in gd->ram_size */. `) A8 w' i  c! Y. F$ \; q7 K
        gd->ram_size = get_ram_size(
1 |' @6 w+ C6 \5 f, h                        (void *)CONFIG_SYS_SDRAM_BASE,: Z2 Z% q. U' \9 N- M
                        CONFIG_MAX_RAM_BANK_SIZE);+ T2 }9 [! L6 d1 f5 Y9 C3 A
        return 0;
; D( R3 @9 ?; Z9 ?7 l  f}2 S7 L7 P0 x, O5 y
, t! e4 o1 P9 p7 v% C

! {5 \# t& _* _. P. Y5 s1 _# r: O& M; O/ V/ Y) v' q. P
- W: ~, m5 {( D" k; a& }/ t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, Z1 r  S  Z/ |  k: ?6 G

& s% |3 p# q1 E& K, }
  B- x* P( P. N9 H" B' O
; K. G/ S9 D7 ~4 z





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