嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 V! J6 s( ~' C- c3 `% E
核心板2:DDR2 256M Byte   NAND FLASH 8G bit. ~- c) B0 H+ @& ^: `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?' \# o1 {" ~0 f$ o9 U

* R# l7 V: t$ ?. o! Q( q" E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% A) E& r/ `  c3 \2 P. k/ x: a* i3 P7 y6 f* {/ u

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* G$ L8 z7 @* F/*/ M/ a9 |' N1 M' z/ B
* Check memory range for valid RAM. A simple memory test determines
* H( E* ^2 I' y) r* s& d* the actually available RAM size between addresses `base' and
5 n- Q9 G  D+ c* `base + maxsize'.
5 I# _0 {  |- d/ Y' h*/
( u  N5 n$ E! \8 t4 Z$ elong get_ram_size(long *base, long maxsize); l1 T/ r, r0 _& N' v* p
{1 N. }# U4 e9 Z! \, e
        volatile long *addr;
2 y: D4 ]& E1 _1 K. c$ E0 {        long           save[32];  ^. R, @  r9 H, t
        long           cnt;$ ?# M4 ^% j9 |$ K" F9 N
        long           val;6 N# Z& Q) D! a9 K" d
        long           size;( A9 Y1 n0 S0 q+ f9 o8 [. a
        int            i = 0;! A  y0 v( ~2 N, Z
  R, K7 {5 Y8 Y; w% Y  S+ ]( i5 m  C# A  ]
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( K+ ]! N4 r6 Q( d( A) o7 r                addr = base + cnt;        /* pointer arith! */
: {: K6 f7 N( G& c" e! x                sync ();
9 G& Y  X5 R* q8 O2 G+ C                save[i++] = *addr;3 d9 X; z& X7 m
                sync ();
$ }- A& @0 c8 P* t                *addr = ~cnt;
; S  L# d' U$ ~& U. U2 N0 ?* n( g/ u- N        }
8 U2 ^9 \. s! ]" C6 k1 p7 E6 W! K& ~9 A3 R" q
        addr = base;, n( D$ E0 w* o0 s
        sync ();
1 v2 M6 y% ~) M! B        save = *addr;0 _+ F/ r1 e# e, E
        sync ();
, p- ~1 L# C. l2 r$ F        *addr = 0;+ z7 g! ]# t6 |8 t/ p. `- L, ]! t

2 _3 ]6 J( F& b) R6 V! M; K. K# V        sync ();
2 @+ Q7 \% n7 N! l        if ((val = *addr) != 0) {3 U9 _) D9 c& [2 d1 m
                /* Restore the original data before leaving the function.
/ Z" V0 _4 L" ?- v  o4 E5 z- m                 */
  g7 A3 B& R9 p. p                sync ();5 N& ?! b2 {/ S9 Y
                *addr = save;% t' g& }) d8 e" ]) B" S. a0 i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; ~- \1 @' T* ]( ^- d* \' j
                        addr  = base + cnt;+ s$ C4 k) X( a/ `: e
                        sync ();/ b0 k( B7 N6 P8 S$ q. k" ^
                        *addr = save[--i];0 G+ A: U$ \4 v# ]
                }
8 Z+ |3 f$ _3 H" R                return (0);
4 h- S/ D! a; q  C        }
5 [! i6 k) a/ w# p/ o2 r( N; u; n4 Z! B& [+ m8 H* k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  i4 }6 h& h+ Y1 _0 x                addr = base + cnt;        /* pointer arith! */
- l: A- W. v8 R1 c% i( c! o& Y8 y                val = *addr;
, u$ X& ]5 |7 t+ s                *addr = save[--i];
) `1 N+ a# u0 ]                if (val != ~cnt) {* Q; s1 G/ }) @& J! a
                        size = cnt * sizeof (long);- J, C/ |: r0 p* H! ~# U, {
                        /* Restore the original data before leaving the function.) b& V/ u3 R+ g* H8 q, p, [/ ^/ C! o
                         */
/ |* J' j. P4 R% z4 N, P7 C                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' M1 ?. r$ g: f1 F0 W! U1 o
                                addr  = base + cnt;
' p. V, {; `, z                                *addr = save[--i];, b0 \2 ~* o) H/ c+ C7 e  l
                        }
: y( M# ]8 L/ q                        return (size);! j0 l/ V3 P' ?
                }
8 y+ R! m. }  x4 B/ K$ x0 a        }9 ~7 r% a3 I. j& T8 s) S
" p% |4 C# ?* g' w" b( C
        return (maxsize);; s& z8 V+ Q- ^- |/ v# g
}
, }* y+ L! Z4 @; @int dram_init(void)
' G6 L+ }8 a& ~5 p6 p{
) p, s6 @  `2 X        /* dram_init must store complete ramsize in gd->ram_size */2 l8 q8 Y' Z# Q7 g
        gd->ram_size = get_ram_size(- G, D: s: R2 ]
                        (void *)CONFIG_SYS_SDRAM_BASE," ~7 Q) @. {. H+ b3 V' D
                        CONFIG_MAX_RAM_BANK_SIZE);- r' l: n: K3 g0 {
        return 0;3 u- i9 P. q* P/ |% d1 c# x5 S
}7 l: U) m7 W+ \! d

$ Y( B- i* z8 x2 b8 f4 k, @, n/ N/ x+ d; Z

# s& _5 Y, D( |9 w! _0 z2 U6 B9 L' k! S! M5 S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 q1 L0 ^- L6 U6 h+ ]. B: M3 h5 Z) a( ?2 v0 N, s9 d, j( o

( n& z2 D" K, b
5 k3 @7 d" }7 Q0 v# C: Y; b: i





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