嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit8 f: a9 c- O* l; r3 u+ M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit- D$ V+ c, s) I' O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?! U1 b' c* u% p2 m* E( u
7 @2 _/ g% ^& c. o' V' p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! y: d2 \9 ^6 n% P5 Z( K

) m% t; k/ Q2 |# u8 r9 y( E
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:4 t* q; Z& h( W
/*$ ~" {9 f  M; F! ?8 M; s0 q
* Check memory range for valid RAM. A simple memory test determines9 s8 t0 u- E; q4 @9 t3 F# _
* the actually available RAM size between addresses `base' and; g4 a* P  z* i% ]7 Q+ L% z4 N
* `base + maxsize'.
  l: B7 F" I$ O1 q, I& g*/
7 \$ H: H& F9 V+ Flong get_ram_size(long *base, long maxsize)
  z' S8 G: V! b{2 S3 g1 W* b- P, {- k
        volatile long *addr;
8 A- Q; H3 U- T        long           save[32];
; T. Z) r$ X% X9 ]' Y) X        long           cnt;1 o. ^9 ~6 v9 V
        long           val;% i) @4 K0 A3 h* ?
        long           size;) P& ]' O+ V2 g* V" z: f! L+ P% @
        int            i = 0;* m0 j) N  r" S# w7 }6 s/ W

+ f$ g  X( K/ M% X; f        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ h- k* \2 ]6 [- ^% y% }7 l
                addr = base + cnt;        /* pointer arith! */
* |! D0 B3 n9 j" {# e( X' s( x                sync ();8 M# A; `4 g# H
                save[i++] = *addr;
% F) C  z1 `' a4 P; _                sync ();; G( N9 d8 k: K# Q) B: f1 K  p
                *addr = ~cnt;
8 _5 H9 F" m1 T' Z        }' p& p2 k8 R* z% y0 Y, r- T2 T

' [/ @: P6 h! s- R$ B! d; @        addr = base;6 T& Z! \" q) T, B/ N5 e
        sync ();7 [% Y. y6 S: P+ L6 W1 o8 M
        save = *addr;
) Z& G! Z" T/ s( [% L0 `        sync ();
- J3 R3 P- g! |* I# d        *addr = 0;. r: @: @# c+ c# K! V" v" X
4 H# |# q7 }; B' X
        sync ();
, H0 @: `4 d' f2 Q  v- a        if ((val = *addr) != 0) {* L& ?$ h8 l# h! H% ?
                /* Restore the original data before leaving the function.
! Q. v9 R0 o( n% D. d  a                 */
' C" `" D7 Z% ~                sync ();
6 U$ U. L/ H6 Z+ T2 ~  A                *addr = save;- F6 @3 ]7 h% y* h
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 z) X' C+ `; p5 V
                        addr  = base + cnt;
- |, v/ e6 R) n6 @) r                        sync ();3 z9 N. j0 ?: o, M0 O" ]# `6 S' j3 X
                        *addr = save[--i];
, ]3 R# d9 H3 Y' j( B' e                }
& s. E5 v, |% X6 I                return (0);: I4 e% F2 n, n9 v# u
        }' m  w& l+ p' h8 l

7 Z3 j$ C1 d. ]8 c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 I# d# s" Z9 j0 N, k8 s# N$ ^                addr = base + cnt;        /* pointer arith! */
$ M4 n: C* t6 e: J- @9 p5 o- r! u0 r) i                val = *addr;" n2 r; y2 W# N/ a* h
                *addr = save[--i];4 L9 |0 x7 u$ ~) s% I/ E- Q5 Z
                if (val != ~cnt) {9 d1 I( g: S6 g" X8 @
                        size = cnt * sizeof (long);' J1 a! G/ B& I
                        /* Restore the original data before leaving the function.# v2 H5 P0 S& O
                         */- C! ~2 }$ k% N* w8 b3 }: q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 c- r+ J/ G8 v6 ~4 l+ ~6 k- P1 A                                addr  = base + cnt;$ L, {0 ~3 E9 ?
                                *addr = save[--i];. Q  v# ^% [# ^3 V3 @3 `+ K
                        }
4 B% `. z; }" h' ~& R: c% }                        return (size);; I8 k1 O6 Q) l# y% n  G
                }
" ^0 }: O+ H1 S, t4 U$ ?( X; H        }
; d9 k' v& r% Q; q1 w% v1 w! B2 s0 s( W, k3 K. a
        return (maxsize);$ t: m; Q: _9 y$ v$ P
}5 c; s9 G; g7 o- P& d: D
int dram_init(void)
1 u2 h) p# o% c, @( p3 S{
# k! L8 v9 J2 j2 S5 x2 B. L        /* dram_init must store complete ramsize in gd->ram_size */; ]: M+ a7 `& @9 I; s0 j
        gd->ram_size = get_ram_size(
2 Y& h& E0 O6 m" l& J                        (void *)CONFIG_SYS_SDRAM_BASE,
0 S. {7 k$ C% |- i: C0 o  Z                        CONFIG_MAX_RAM_BANK_SIZE);
4 {8 n& {: ^  v* y1 c        return 0;
9 I* w7 b8 E6 `- M& V0 l5 d  Q- [+ t}
' t4 i; A7 H! g- P; U; n3 Q% A
4 T* ]( t) D. a7 b; T! R% S, M
7 g3 _# E- H: j) K0 {  F& o1 Z1 L1 m* E
5 B+ ~/ n6 R& w- }" }9 Z0 j5 h
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% d1 E# y( K0 q; f
! l1 t/ R9 u  t: }/ X) `+ x1 ^. M, H1 ?9 z) f. \, p
7 z6 Q% @0 G; y





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