嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 c' y- D( z4 K. @. O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ `5 W" T  n' ?1 v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?! _  h( }9 V% ^3 p5 u
: `1 i5 g% {1 x. p. M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% ^* H, |4 \; R% o5 G
' z" z$ \9 V8 L7 q- H) I% y* Z
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ T# r/ A" B6 Q) n6 V/*
8 ?. i3 @  C- r0 @* Check memory range for valid RAM. A simple memory test determines/ W# x+ m4 \, N0 g2 U6 t
* the actually available RAM size between addresses `base' and3 M+ `$ \. q, i+ r, D' q5 ^
* `base + maxsize'.6 o$ M: I. i( U. c
*/
( Q  ?  q7 k0 ^$ ^8 ulong get_ram_size(long *base, long maxsize)/ m2 @3 r, z* C. d$ R+ R8 j
{2 o% U& U& K' v% `
        volatile long *addr;: K9 x" L3 j# q3 L5 z- I, z
        long           save[32];1 h* W3 L6 R% J$ k. P% }% J2 S3 {
        long           cnt;
7 R0 d0 ~6 \& u" }, ~, ?- e$ ?        long           val;
! H" P0 f! z- L( Y& H8 i& S        long           size;
+ ?1 \& S7 {8 k7 [        int            i = 0;# i4 w3 c7 j$ Q2 k9 s

) R$ L8 i5 R- F1 ~# y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 G( Q, x! i; |% x. [3 O
                addr = base + cnt;        /* pointer arith! */& k- d; M7 F( k* N/ T
                sync ();
& g( N  e; B5 M- p/ C- @% T                save[i++] = *addr;, e6 b9 l3 w' A; A0 B+ T
                sync ();9 J" {* [* A' |; h% m" k; N, Z
                *addr = ~cnt;
; o8 N. N/ H: R( |        }
( b3 O2 w, y* O
% B* ?' G- U1 Z' E        addr = base;
8 n7 z1 }! c3 i  `4 d        sync ();$ y1 N# X) f( N! {) U
        save = *addr;9 v8 k9 u) U/ x' ]
        sync ();& j$ `! ^% X6 n: }
        *addr = 0;6 y& ]4 ]$ s: v

2 B3 K: Z. |/ O2 W% t& T" W0 @: S        sync ();
6 a5 v, W  p2 y( U+ _        if ((val = *addr) != 0) {4 G! t9 p; m7 |9 r# r- r( a5 q% [
                /* Restore the original data before leaving the function.
% P) B2 v5 Q+ `  y& U8 b! X8 Y                 */; h' E5 a' s# H" B( b! u& H/ r. t
                sync ();6 |. h" N( E6 w% [- T! b2 }
                *addr = save;  P% L( D, s2 @' S4 [" E& b
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; N0 V( C8 U* g1 w7 M# V: g3 m) d
                        addr  = base + cnt;0 l) q" h7 `8 Z/ t, ]) E' c( y
                        sync ();
% N5 N( l) m- M$ l  T8 s                        *addr = save[--i];6 P& e4 ~2 p9 D- H7 C( e+ Y  K
                }
/ {9 {# [- t6 b* v; R- i; q! i                return (0);
0 K# A' [# E+ i3 o! e        }7 Z, N  x  @0 U; ~9 X
, e: H/ G" J4 M& m% _# W6 Q6 W, i
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& T) r, p6 K. G! Z                addr = base + cnt;        /* pointer arith! */
! s$ f* D. |& C5 C( M" |                val = *addr;
! V; I4 {. T! D# x8 e                *addr = save[--i];( z* @( Q6 y+ d" s% H
                if (val != ~cnt) {2 K$ K# t5 y( z8 [
                        size = cnt * sizeof (long);
9 H: D. n% z; F6 i7 {                        /* Restore the original data before leaving the function.
/ ~$ i9 e/ Y% n0 C3 x6 {* }                         */
( K) C8 a- u8 `9 z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" i/ p/ Y/ N% b8 U7 W
                                addr  = base + cnt;
1 _$ \: M3 R0 a2 |9 M# d( R8 Z3 M                                *addr = save[--i];$ v, \) ~* N- V* u& X8 N$ i
                        }
4 H7 {4 z, B2 Z! V: T) i/ k                        return (size);5 B: [0 o4 B" o/ A
                }9 ^4 y7 m: g* s
        }* ^5 m5 H3 _& [  K: a# v; h
2 h1 h- f1 Y! y/ i! c$ r3 b
        return (maxsize);
2 d! ?( _3 e& \; i+ C# d8 P}
4 V6 p) \; v; E* b  |int dram_init(void), w5 a5 [$ G* H5 \9 A" y& x
{
* ^  ]! u" T8 \8 V        /* dram_init must store complete ramsize in gd->ram_size */2 e# X( w8 S) {! `5 Z
        gd->ram_size = get_ram_size(
( H$ }) h. O" I$ d/ E2 j+ _0 ?; i                        (void *)CONFIG_SYS_SDRAM_BASE,
( J2 a' Z5 ?+ \1 Q# s$ ?                        CONFIG_MAX_RAM_BANK_SIZE);2 i7 {4 h7 k0 }( ?6 I( i
        return 0;4 q7 r7 M; ?" q4 ~. t# A( U4 ?9 M
}. r( q; W. d8 o" P

! t" j$ Y4 \  Y
. h& M* B* g  c- l8 T7 F1 o" L/ ?7 e* [8 a3 M
6 o" K- ^8 J4 K  w* C" _
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!( X3 R8 ?, o: d# O
, x: ]! h; n+ U4 {$ p
  T/ `1 Z- ^$ m  V. Q
6 Q$ Q- D6 L5 s. J- u





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