嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- e, l$ q+ j7 y2 k8 _* `( N4 h核心板2:DDR2 256M Byte   NAND FLASH 8G bit: v0 a: s. ^$ L. X4 L3 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
8 I* D4 H7 \0 ^* ]( ~0 U
$ r0 P* \( p. J2 J8 \( `1 `, e是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: N7 J8 C7 }7 p+ a8 b

9 a. g3 N* E; p' E( b# H
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ I' ^3 t- x: r+ f( v+ c/*
- K. [0 s: k3 a$ l: I4 E* Check memory range for valid RAM. A simple memory test determines  U% r- n7 S" ?3 Y( `4 A% T% a) m
* the actually available RAM size between addresses `base' and
8 E) N) A, b1 ^* y3 C# c" s* `base + maxsize'.
! e( O- w0 i' I0 E& m4 H- J*/
8 E9 X! }. J5 V% L) Mlong get_ram_size(long *base, long maxsize)
; d6 L1 H7 a+ O6 J7 d. i- E{5 V- r. Y* V) K6 O
        volatile long *addr;
1 c! x1 R5 X: p6 V1 I0 _        long           save[32];
! ]3 Z# K$ {3 n' o( A7 @        long           cnt;
& a) o1 C* B' R$ s: J) s) J        long           val;
0 \! V! b  h  g& r$ Q        long           size;
3 z8 g" z7 s7 W. W* E+ _        int            i = 0;
+ r0 _) |4 f; u' D" _9 B8 K& c: J" E2 ?  y( X
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 r/ P) |0 m/ I/ U( P4 o* M; ?                addr = base + cnt;        /* pointer arith! */
  b# [" v* z" _  P2 m% ^4 X                sync ();0 ]. W0 U( `  u. @8 F, b
                save[i++] = *addr;* g2 \- x) w/ `4 A9 r# y5 {- o
                sync ();# s! `0 I5 s  w% ^: v2 N% I
                *addr = ~cnt;( b' P4 ~2 R2 `( P: Z
        }
  E6 Y/ r+ J! x5 _1 y! @% z9 Z% y: f8 i4 ]# l. f
        addr = base;
9 E) ?) r; E; Z/ h5 O$ ]        sync ();
% U& P, m$ m2 U& D2 e! j2 M4 q        save = *addr;
1 `: K5 c$ G& g        sync ();2 h2 k% U8 A; ]7 _7 q
        *addr = 0;8 b  Z; q9 _9 \  f) x- Z  m

6 T3 E8 _; G/ d3 S2 W- y6 _- {        sync ();2 _* y% y% u! O* v1 M
        if ((val = *addr) != 0) {
% o" c* |# m) R9 I( F5 c                /* Restore the original data before leaving the function.
$ a6 ~6 w) A% @                 */
2 a+ o1 k# k8 I                sync ();6 [: ^5 U9 _" g( D- }8 B
                *addr = save;
( ?7 Z$ l6 c) `) [' X2 U& @                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 R2 g' _  C6 \% q. B                        addr  = base + cnt;% D" i' f6 v) i
                        sync ();
# W. L$ @4 R' h+ U4 W) {  X                        *addr = save[--i];
# D/ z: B, d5 N# D. q                }0 k3 u3 M8 l5 r' w1 |4 R
                return (0);
1 U1 r; j% l0 g* ?7 t: T! n        }& h" J0 K6 a2 a2 l8 G! R2 P
, h  Z" @7 J9 M' I$ b0 H
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# O+ _, w! I; y4 n! S( C; d
                addr = base + cnt;        /* pointer arith! */
# V" Z4 [4 C  h5 S/ m                val = *addr;
1 y, h4 a: L3 L' D7 {/ P                *addr = save[--i];+ m/ p' ]/ J2 s& P  e
                if (val != ~cnt) {) q- H: j* M" v4 O; v9 L
                        size = cnt * sizeof (long);2 h  d' x- s- a. x
                        /* Restore the original data before leaving the function.( q0 m8 V+ g* c" x6 H/ A
                         */* O0 v7 O, J+ `% z1 a
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: E; U# K+ _/ e! V5 _, b
                                addr  = base + cnt;* W( a6 S4 w& Z3 C6 c1 d; L
                                *addr = save[--i];& V0 t, p2 M% N  |+ t' B( q
                        }# P8 m, h5 F+ ?% O- G
                        return (size);
4 {2 }. |2 f3 Z                }
' d# f9 J0 Y( I        }' J: J) g) ^* Y' F
  z( G: A# U- ], j- I! C
        return (maxsize);$ N& ?4 R, d/ p4 u' m
}% `5 d8 W: e+ n1 Q) T
int dram_init(void)
( U# ?1 @* M3 R4 B( u{3 q9 g  W  ?; K1 _4 O
        /* dram_init must store complete ramsize in gd->ram_size */8 f7 m3 r' l3 Y- S% E
        gd->ram_size = get_ram_size(
( G$ s9 q' k! ?" {" W/ [                        (void *)CONFIG_SYS_SDRAM_BASE,) n. S, O7 y) E7 ~
                        CONFIG_MAX_RAM_BANK_SIZE);+ ]2 Y5 [& k2 l, R. D; X. d
        return 0;* T& {, ?. `/ G
}1 R4 C0 p( Q( G$ v& `
1 S3 }# Q9 G- Z) f' t) ^  N* J! A- e1 [

# i' i- D: X4 u9 q
3 g0 q" L8 M7 _+ d- W3 R
* b! g! E3 y% W4 O, h' Z. E: g4 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ T3 L5 N$ Y6 N4 [* b. S' ^

5 s+ a1 {0 X. Q5 x2 c; i7 t" K2 O1 S. R7 \

  n& t; W: m" R$ v6 a7 E




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