嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 E8 ~* q, m% u# B- r) {! y/ A核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 |% P. {: L5 _5 S* T' h! N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?/ c) _# s: j& K/ ]
" @: |1 e( r7 E) B: k: U! \: K* s+ q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& a5 d2 E3 Q! U) O
( P7 g) c0 _* ?+ X9 T  n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& H. z+ G: T4 r% n! N# w! A- v. b/*+ o7 E$ b/ |% L
* Check memory range for valid RAM. A simple memory test determines4 [: x. P& n" w9 w; ~
* the actually available RAM size between addresses `base' and
" t2 W- A* s* w6 M6 @, a* `base + maxsize'.' J$ p+ K; b8 m' l
*/
2 X; Y% K2 p/ C$ r- mlong get_ram_size(long *base, long maxsize)
) P" O$ i2 b2 {{! v3 A, C2 {; \1 a
        volatile long *addr;
4 R) ~6 P- i' I        long           save[32];
1 t& S4 K, d4 {8 C& b/ m- Z2 N5 ]        long           cnt;# y8 f3 S. G" j: u
        long           val;
0 Q6 X: J: [1 Z( H2 N. B1 d        long           size;
" O. G1 M5 F5 g1 [7 P- V7 z        int            i = 0;9 S0 N5 o7 N- ~7 b6 P

! `6 D+ k  j; g; V8 _8 X        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 k/ d* Y8 a: |) s2 x& t$ F" A                addr = base + cnt;        /* pointer arith! */
' i- Z2 V, y9 d# b7 T+ R  R! w# E& v                sync ();8 a4 N/ o) r/ o9 b$ R" b% v9 s& g
                save[i++] = *addr;
6 j: g' a$ _$ Z9 ~  K* H0 T                sync ();! O" `0 Z/ ~$ i( J
                *addr = ~cnt;
8 c! C# `& M3 y8 Q+ t! Y+ e        }' U! }, y5 j4 E9 X

' p& ]; u# }% L: @1 E4 F        addr = base;
7 J5 e4 G4 y" G& J3 p2 N        sync ();
+ b8 v6 a$ I3 a3 G# j$ B% c# Y        save = *addr;
/ f7 d6 d* O9 E8 }7 A9 f/ N' D        sync ();" `7 c/ D4 D8 {" `! h, z2 {6 A& @, x6 W
        *addr = 0;3 S" A% b, K' P7 B  p& l
% q  B6 S, ], B3 y; Y
        sync ();
8 r$ I2 }' F; L; k* W' Y        if ((val = *addr) != 0) {; D, F3 U9 ~/ L6 y( |9 A/ ~( B# ~
                /* Restore the original data before leaving the function.* q8 u+ G5 L% t* h/ g: K& e
                 */
3 x* _/ y( P2 m5 ~) P* G$ ^/ ?                sync ();0 o2 A6 d: _" {& }
                *addr = save;
  X8 i5 _  Y, t/ E( H+ x% @9 e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* i, I/ v9 y' b. z& N. o
                        addr  = base + cnt;
& }8 E% w* F; F& V2 s0 n                        sync ();
* z( ?; a8 T7 R$ b, W* k                        *addr = save[--i];. s) l0 l$ m; I4 U! o
                }4 P2 I% w9 A% S7 U2 _6 g+ Q4 B
                return (0);
0 l4 ?3 m' h3 F! l% v/ ]$ A; r' \        }
$ _1 b4 {$ t. j3 a+ `
8 D" ]7 r4 p+ U3 \& O4 l        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( ~1 K$ v- L' o7 Z5 w+ v                addr = base + cnt;        /* pointer arith! */7 r2 \, \" `: S" K
                val = *addr;
6 _* Y0 k! _) ]* Z, M+ i% }! {                *addr = save[--i];0 S$ V, U8 _! W; k% v8 }
                if (val != ~cnt) {- c% @8 P! j; n  u, O
                        size = cnt * sizeof (long);4 m% K" [$ o) {5 D" a+ u) q- Z
                        /* Restore the original data before leaving the function.
6 a) O4 @% j, s7 V2 h6 o                         */
) S4 ^7 q5 `" P" Q) ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ s/ l6 a$ o2 l; ^2 j
                                addr  = base + cnt;5 h* @5 ~2 F/ H3 |' `6 z- _" G
                                *addr = save[--i];
$ p% n  _! F. v: t4 F                        }
1 F7 E2 ~9 E. i8 P  R                        return (size);" a6 I9 m( ?; O2 D( p
                }$ k- L3 b6 e) p% X( |# L" _) }
        }- A; I6 Q5 S5 ^% N8 |

& U( R/ O2 Q, K: S# ~7 j& |. Q        return (maxsize);
4 n' s& p$ e# U2 A8 p! d- Q2 ^}
9 I/ m4 P0 D  j' d7 Y) R, W6 m5 M: rint dram_init(void)
+ x& `9 U8 H9 U8 T, i) D{
% u7 F* d$ o% v5 q- y2 B" Q. d! i        /* dram_init must store complete ramsize in gd->ram_size */
: ?' l- d; {4 r1 ~1 P, S3 O        gd->ram_size = get_ram_size(
4 u0 R2 b% Q8 l2 P  ~% `7 u2 A                        (void *)CONFIG_SYS_SDRAM_BASE,% D  ]# \( M' d1 a. T  Y* L$ M5 N
                        CONFIG_MAX_RAM_BANK_SIZE);
" z6 |) N& F! O& f* [        return 0;* l2 ?; M5 ]" T" h4 n8 T8 f9 d
}. L* m  l$ P0 K% n( G  ~2 X- C

/ [# M' u4 P6 h0 d% p- I" b1 v
# ~2 Y& u- h: G; `' W" |$ z8 G
- |5 B, i% r) t4 i7 F* F5 p% O" A9 X* ~" _# j3 ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 m9 D9 k: C& e
5 t& }& C! h- _5 U
/ S1 l/ l! j6 I* l0 |, j
& L) t4 ^% {) P4 z( g





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