嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& A$ W" y$ G: ^- Y3 \核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 |, W3 A( O+ c4 K2 R2 i这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' ]8 ?( U( r3 o3 Q6 K( H3 b9 B: z. S* V" C0 k0 O) ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 l; Y* m3 t- x; @

4 W5 W# D$ v0 @
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, P' n+ `& ]4 q' T1 G. f! j* H
/*$ L  d3 B5 D7 D9 G& h/ t
* Check memory range for valid RAM. A simple memory test determines
+ ~% {' p' T% J9 ]* the actually available RAM size between addresses `base' and
4 L! t( X5 t: s" o* `base + maxsize'.
, R% k/ O8 o0 S2 U: O9 \*/
  `4 m. K4 f; R, q  X/ J, |% f8 K9 @long get_ram_size(long *base, long maxsize)
5 H' t- c( ~5 y5 ^$ n1 t{
* s+ N6 i- _* B5 n  O$ t$ l        volatile long *addr;' r: \. ~' y. U; T6 [
        long           save[32];: C; \8 B$ |9 n6 p' f0 p' S$ }; E
        long           cnt;
) C  v2 n6 ?* P8 v! x2 K  |& w        long           val;
$ n& \4 w7 j+ l7 E8 G        long           size;
: M8 ?8 ~/ \1 ]# D' `, _0 V4 l        int            i = 0;
# _* q0 n2 a. |' L7 i* h  M' p# c& |
2 v. N7 E% c( r' B  `5 @# j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" n- n, W9 }0 [. n7 Y  N
                addr = base + cnt;        /* pointer arith! */
* X4 F4 s+ h5 l$ x% ^                sync ();3 W" x3 I5 L/ a# a8 j1 t
                save[i++] = *addr;
# ?7 y. R0 U( ~8 m: @                sync ();
5 Z3 k2 s! z5 |' a" {! s                *addr = ~cnt;9 }1 e5 m3 k1 G$ v) K% H/ c0 `
        }  `( @5 h6 ?7 p' i

2 k8 ^( k' o5 R! }        addr = base;* j5 o. |' o. p9 m
        sync ();
3 F/ t* j! K( L- I4 j" Z        save = *addr;
& J: R: I; t! ^! a        sync ();
9 c* N: D2 C# C        *addr = 0;
7 s& s2 J/ l* c' ^0 a. J: \) f6 }/ ~0 Q  [4 r9 @$ _* P/ N0 s
        sync ();
+ u; Y1 N: t+ H0 u        if ((val = *addr) != 0) {3 Y3 D! ~: V7 F3 `% j
                /* Restore the original data before leaving the function.& h* y" w3 @' g0 ]$ w2 J6 P
                 */% Y/ z" t6 P& o
                sync ();
- @6 o$ T9 T5 ~& b, d                *addr = save;
6 t! {8 L! z- k% V+ [5 t                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, I+ b) q2 \- \! {# j                        addr  = base + cnt;
, E. F0 E, }* Y$ v& q* y                        sync ();5 a) |3 A. a* ]' j% W& b8 M% P( q
                        *addr = save[--i];
" S+ J: @. h0 @                }* v) A& A/ D' ^# z
                return (0);
) X- Y% {" L' e- G8 t7 a2 L        }# R0 ~6 }% G% h% }. _- @/ n

  `5 m0 d, i/ P- k* E+ R3 D# U5 M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 q( O  k/ h& d                addr = base + cnt;        /* pointer arith! */7 f) F! M9 r6 d
                val = *addr;
; T2 _  M6 Y" J                *addr = save[--i];
% y- o  T3 w4 P' C% N                if (val != ~cnt) {
; M4 B7 e8 U% t0 Z* _                        size = cnt * sizeof (long);
' g5 K8 [8 c* t                        /* Restore the original data before leaving the function.
" P0 R" ?2 j6 S4 ?7 J, }7 v0 U                         */6 M, d6 |. f% o! m& N( M4 N
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 T: e, E4 R, @; q* l& v( `                                addr  = base + cnt;
  n; L, o5 Z& X6 B                                *addr = save[--i];
0 B& _3 D: }* F8 t, e: L9 U                        }7 g0 X3 h, ^) I9 a. b) O. e
                        return (size);
, Q+ ?  p- x6 Q, T" X                }7 U/ z9 W9 }3 U( K8 w, ?
        }
% K) N' c+ g& g; X5 C
6 r) I: S; p. x1 i        return (maxsize);% z  r; K6 w- E9 q" K. E
}
/ d9 H  M8 v% m3 [9 W7 @' kint dram_init(void)5 {& p6 _( K/ y! s
{
' @5 X* B& V7 A4 |1 k, Z2 _        /* dram_init must store complete ramsize in gd->ram_size */4 f8 h  f" K8 V: X
        gd->ram_size = get_ram_size(6 c2 c. m( Z% W2 [
                        (void *)CONFIG_SYS_SDRAM_BASE,' w  ~! m$ }2 q$ [. x5 }$ S
                        CONFIG_MAX_RAM_BANK_SIZE);# \/ p5 O  \; Q, m* {
        return 0;
* u# U/ m# z* t- t& Q5 ?; O}
; Q! z/ J( A, e% Z! G. j3 Q7 P5 O1 |5 f' J
5 g: c) t# T- D3 Y5 X# K

* A2 A0 R+ h/ C, Y3 N; l0 K7 l( c, K  l. q+ ]2 Y: R
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# q1 f- H6 {* z- F/ A

4 q' T' [9 t  w: J# |
! o# n: T+ Y$ X& e! w& m
7 X1 K" ?! k& p/ ?& N





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