嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ C6 a  x% d) B% H核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  R: g+ d7 T1 N: i/ w5 e3 g% t这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( a& [, ~" B* ~% v0 ]" c
% v  n8 I3 |' a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?9 b5 l) J/ h: e6 W# M5 Q
8 @& r1 i& \6 Q: P

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 X9 a4 o" t! m) [. _" R9 g8 {+ I0 c
/*
2 J1 g9 i1 a/ T7 F  b: t) r* Check memory range for valid RAM. A simple memory test determines
+ v3 o3 ~& g3 ~% x! S& o6 y5 x* the actually available RAM size between addresses `base' and
* p& z' ^3 N% P5 X* P* `base + maxsize'.
) Y8 L4 [3 S. m8 X1 |*/
, c& _7 z7 T2 E7 b* B& Along get_ram_size(long *base, long maxsize)& ~, K  U" n4 u( o7 q; R1 O
{
$ p& ?4 V; p7 x: I; r, a( e7 w        volatile long *addr;; }% [& `1 _0 ~+ k; O7 M6 Q* S
        long           save[32];
  ^2 I( i4 r1 u% J' \' u: z) H        long           cnt;2 B" C6 R, }2 V1 x
        long           val;
9 G' I/ N4 k& j- {        long           size;
/ s5 z/ D; j! c4 q) r* v2 t( ]) ?        int            i = 0;
5 _" E! b: l* W3 q: l+ p+ a/ A0 j+ w
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( n& S6 C: H( {& E7 G  [; v
                addr = base + cnt;        /* pointer arith! */
; ^! J: L# u6 q% M* c3 H* s( Q6 s: x                sync ();; A# @, G: F/ ]- Q! {  F2 M
                save[i++] = *addr;
' i1 w# f& L/ M' s, }                sync ();
* _; J) I$ T) y0 M                *addr = ~cnt;5 f. `% N( W; x1 `& ~- r' {7 K& k
        }& z9 y+ h  [  V% a* s. e

. H" w3 |" _% L; A1 |6 [: m6 ]        addr = base;
7 T  J$ x$ P5 d' g0 @        sync ();
2 ^" f6 O2 u" Q7 S  H2 v        save = *addr;" g4 v; x; W3 i5 r1 q$ e
        sync ();
2 t0 R5 e) v5 e. m        *addr = 0;- R/ Z' E& b7 Y5 Y, b

$ x0 x9 R- O4 e- k3 K  f) H        sync ();
; z7 A, J% {- q7 N# j8 L( M        if ((val = *addr) != 0) {( k- R* |& S1 j
                /* Restore the original data before leaving the function.; I3 Z: n0 \* d0 s
                 */
7 n( U7 W: H- D$ B' j  u                sync ();. u6 F9 `+ D& t4 c/ V! z+ Y! _
                *addr = save;: |2 e' W4 L9 h- j% n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* \# X0 _0 c8 Z' j
                        addr  = base + cnt;3 Y( i$ q2 A# K. h; X
                        sync ();% ^! [* Z- g$ M8 B
                        *addr = save[--i];3 a, F( M1 k  k. }4 l; Q# ~
                }
: t9 B; ~+ w. Z# B+ z( d) c5 I                return (0);# X& C, d9 O$ n; d3 `
        }
7 Y9 [$ F4 u" G- B& `; c1 l( L& c% u) J  s7 F1 L6 K# M
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: p  `2 v% u4 k4 n# T7 t9 B) X$ q
                addr = base + cnt;        /* pointer arith! */# x6 l2 F9 p* w8 A) K# V) r
                val = *addr;' o) R7 d. |! t* S  j
                *addr = save[--i];
1 {# u! Y7 X" h$ x9 r                if (val != ~cnt) {
0 c$ P; ]$ D- x9 F2 x! w/ s4 f2 Q                        size = cnt * sizeof (long);/ n% O7 c1 `" b& g: R7 o4 z1 Y
                        /* Restore the original data before leaving the function.# }* j# t: f7 ^0 k9 o
                         */
5 O3 {! W# f3 `6 V( S/ H- w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; x+ Z* Z- v, u5 n8 u3 x                                addr  = base + cnt;+ A$ d# U2 D6 s9 h
                                *addr = save[--i];- c: c1 R+ _  }7 N2 y# U2 d. B
                        }/ {4 X5 b4 u1 _) s, C! l1 O
                        return (size);
8 E6 o- h6 G* D2 X/ ~9 y                }7 _0 b: F* l9 o2 ^- t% ^
        }; c6 h* z/ J$ S8 r

# Q6 c$ ?7 S$ |- a! ?/ z4 Y$ N        return (maxsize);
$ g9 o! o3 \! r! H; H}% X+ H* f/ B, b: {  W
int dram_init(void)
4 a# ]. W! l3 ?# e5 e2 t; b{
3 z5 o. G8 d0 a1 W' B& I5 P5 h        /* dram_init must store complete ramsize in gd->ram_size */
: x% Y1 f- f* d8 v- v" p) |- }" u  a        gd->ram_size = get_ram_size(' b, F4 g; p, u8 o. q: H
                        (void *)CONFIG_SYS_SDRAM_BASE,: @3 v& n+ O$ g; _
                        CONFIG_MAX_RAM_BANK_SIZE);
0 J$ r$ J2 ^( ^        return 0;
) U7 P+ C8 L+ j0 H! q' I' `}
6 j2 H/ Q( K( C% _' T
2 u; t% g* j8 h4 N, ?8 P& I
# p( v9 F3 `$ \, f
5 P. J% {. o. f  q. o- k  x& L6 p6 e0 h' }$ t7 K- |* `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 e1 Q6 A+ a3 i) w! M- b4 A! S5 |( h+ I/ I
5 |8 ~- V0 O" I$ Q

2 V' H# [* e9 T$ U% J" [" H




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