嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 u5 _0 l! t: p, v$ I; K核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# \, b" v% r2 {3 k9 C( _* h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 ^4 v, }; M( ]# K

2 B) A0 E" W- A! a$ H) j是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# s1 }" n. s/ h1 C9 m, \" u
( {5 ^. W& s5 v: a* o* ]

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) W! O. V% D* ~8 O4 w5 C5 d9 `. b! W$ ~/*
) m8 Y1 Y! {7 H* |" y. M* Check memory range for valid RAM. A simple memory test determines
2 D1 c4 q& }2 K* N1 Y! M* the actually available RAM size between addresses `base' and8 P# e6 Z( n0 F; B
* `base + maxsize'.
2 ~1 t- `5 [' {, [3 W% G; U1 i*/2 }* |$ Y/ o: o7 R
long get_ram_size(long *base, long maxsize)) t7 W9 i! {" }
{  b( n+ j- |9 w6 N
        volatile long *addr;( g( E; \2 U$ ?, @+ t
        long           save[32];5 [. W+ d+ e  f% d, w
        long           cnt;
& Z: G; B+ `* `5 g& ]. `        long           val;
0 u+ U- P& a, Q5 U        long           size;/ P+ F6 z" L: t7 n2 M- q# O+ M
        int            i = 0;
8 A6 y9 }' p1 {" _; R* e1 u
: l0 z9 Z  ~2 L+ v( C6 G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' ~7 I' g) |2 i: l! J+ M% h
                addr = base + cnt;        /* pointer arith! */, r! F4 y  p% w: W- e' I7 f
                sync ();
8 J2 i4 t2 X: C: z! h- A& R                save[i++] = *addr;
( j. a) ?/ I/ j, z2 B- P$ C9 h! z                sync ();$ ~* q! Q6 _, _
                *addr = ~cnt;% g& ~8 m6 P) F- ^1 _" u  Q
        }
1 _$ x+ h$ A  o$ [& p: _% B/ C4 a3 q
        addr = base;3 }  C3 q8 i& R6 C
        sync ();
1 ^( |4 h( x( ^- \$ H        save = *addr;  W& R9 @3 ?8 n: D, I
        sync ();( _$ A) {. _1 Z) U' J1 h
        *addr = 0;1 i( I9 d2 K& k
; f5 d& f; D, l( p( X7 ~
        sync ();
0 S9 y0 O4 L; p  Y. \6 r0 X* H        if ((val = *addr) != 0) {' g+ \5 A( }1 Z1 J) U# {- B! U
                /* Restore the original data before leaving the function.
* F- R* ^, V- \$ ]( Q* C: j                 */
0 P' H+ P$ m& a: i1 `                sync ();
" J' Y: A1 s' O% U4 P; B5 p                *addr = save;
0 ~3 x+ [% O, G2 u7 ]* ~% T                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; @0 _% W$ J& w' o' m                        addr  = base + cnt;* l8 C: v% p: i" m" b# _) U
                        sync ();
9 q/ A! @& w0 x+ e. x                        *addr = save[--i];
) w3 t6 U# G9 `' x) Z6 ]5 F3 ]                }
& O- y5 V3 U6 X  n: w                return (0);
, o4 @) v. [* Y1 n        }/ S: V# @! \% a0 h: J/ `
$ f9 i) [3 V& A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ S5 g9 Z, N* ], u7 ]) n( R
                addr = base + cnt;        /* pointer arith! */7 y6 d" J9 F2 \: m' N
                val = *addr;$ I9 y7 T0 K; a" x3 i
                *addr = save[--i];
  M  I' D9 ^, x# p                if (val != ~cnt) {; g4 ]# r6 O1 q
                        size = cnt * sizeof (long);
1 F$ B- ?( Q& {2 `2 Q                        /* Restore the original data before leaving the function.
0 G% J1 Y9 f: F) R" i$ N! C                         */+ X! N1 y; K0 o: u5 Y+ b. _
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( b& b1 \, x5 \+ r4 z
                                addr  = base + cnt;
5 _& \1 k! r0 a) K+ ^1 v# p# E& Z                                *addr = save[--i];
, E( j9 L" T0 i3 ]. a: c                        }9 n4 \* u$ L- s, e& R2 ?
                        return (size);
, H( ~1 Y8 ^0 w+ y                }% T% v1 i$ q. b/ }; Q
        }
3 t0 A* V7 F: R) N2 v; y: z
2 Y$ J2 p; O) s; M" f        return (maxsize);
, ]0 P6 O) ]" i. A}! E8 m& s5 C9 o, O  i
int dram_init(void)* R4 h0 _( w' M
{) B+ ^1 l% H! d
        /* dram_init must store complete ramsize in gd->ram_size */
1 e* l% v8 M! ?5 c' Y+ N; C& ]7 f        gd->ram_size = get_ram_size(' O  o! n% U7 h, `1 O4 l
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 L/ _' d5 m2 Q  x; ?                        CONFIG_MAX_RAM_BANK_SIZE);. f* n7 w1 K& {* Z: {% O7 s# S
        return 0;4 @5 W- h5 D. P% _  o
}; R1 E  S7 U0 r
9 Q' S' R' h) R' H7 }( k# s+ N( Y

0 f/ K0 m, ]- A4 l, N. j8 H/ h4 X# a  k
' t' T4 R# ]8 [# P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  a! r6 [6 O( \8 a- I; P

, B6 {6 [- S5 w# ~7 K
! r+ S- T; C( J! ?4 Q% `

# ~( w0 s1 a, f




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