嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 Z! B5 x" k1 c- D
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
6 S0 U# C! O( j6 ~' V) G" T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" f& v" u- \& ?$ L8 [+ v8 a+ A7 O7 m

; |" d- u  |  l3 V7 O' q( G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& \# u# y# c5 v- D6 E2 _
5 m% A# |5 B5 C( C1 v6 U: g2 U/ f! T
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# B- o6 Q! x7 [+ Q% t/*. @; N2 l5 F% {, @3 Z, `2 t' Q
* Check memory range for valid RAM. A simple memory test determines
$ k, p1 S  R/ x# {: k! c5 U' l* the actually available RAM size between addresses `base' and* ~5 L7 B( i/ {2 K: d
* `base + maxsize'.) i6 v7 s9 U2 N
*/
% i9 V/ s, R5 m' q- W& X" Wlong get_ram_size(long *base, long maxsize)/ \! k( c0 q* I+ h' }
{/ C' W# ]. ~% ^; }" }
        volatile long *addr;
/ }/ k( N& H" f        long           save[32];
% g. Q  u: l- R/ k        long           cnt;" c% M- z, T# ~0 Y
        long           val;7 T" C+ C) Q4 A2 N: Y5 p3 O: w
        long           size;/ {$ k2 _1 \- A3 |  \# U
        int            i = 0;0 U) A* m: P" b$ e% B+ X3 _& I/ H
" ?/ h" h3 i7 o, \
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 `1 P. t( Y4 R4 }( @6 K- ^                addr = base + cnt;        /* pointer arith! */9 \% Z0 e: ~- t" K% i
                sync ();
, e1 y# s5 d  d                save[i++] = *addr;/ _- _# ]$ L  y2 Z
                sync ();
6 P- x0 ^* h. n5 J3 d. J& P( p                *addr = ~cnt;
$ ^2 {; o7 s4 R; e& E7 i9 _        }
4 h) O5 o. }) V3 l  e
; v6 ^6 a# W, k' R3 }$ @# ?        addr = base;. _( P8 X) W& v, @$ T
        sync ();
5 |# q4 d8 L* H" ]9 [- w5 `        save = *addr;% _$ D0 {, C, ?
        sync ();9 W4 y$ I! o1 G
        *addr = 0;& C" [# H8 K% R& X5 N7 W  q* `
6 O, A5 V7 i. K8 Z
        sync ();( N5 ?% C5 E+ j# Z0 V) b. E' M
        if ((val = *addr) != 0) {
; {; S) o5 x! \" G9 _0 C                /* Restore the original data before leaving the function.
. D) H& W, c6 G7 W; s) ^* A                 */" K! s6 t  `# ^, R: Y% D# d
                sync ();
7 D& F) F% R* k                *addr = save;
" Y0 s0 w, o, s" _: z  Z' D                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; _: C6 R# z( t
                        addr  = base + cnt;
0 ?  I, }5 u  |6 B7 W                        sync ();. C, M1 W+ f, k7 L4 `6 l
                        *addr = save[--i];
+ \; B4 K+ @- G! ]8 y, \                }
; N3 K- L  r: {( j                return (0);0 {+ n6 c* s; T
        }( C8 E6 D2 C& ]. q0 K9 I3 Z( v

: [: U% z7 p: ~3 m8 m. V/ B9 m        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) n! ~; t7 s6 f/ o( T1 X                addr = base + cnt;        /* pointer arith! */
4 M9 ~0 X3 L# d3 `: x  N; Q0 K                val = *addr;
0 B& T7 g5 ~4 p; [5 p$ Q1 ^) ^0 m                *addr = save[--i];; U3 J8 U% i$ S5 E; a
                if (val != ~cnt) {
& [: j3 r3 x- x* z7 o1 c                        size = cnt * sizeof (long);
+ s. E/ {9 I4 n5 p( k0 G, y9 `                        /* Restore the original data before leaving the function." E+ i. b" o% z& T$ f& g
                         */0 U8 e' z3 C* ~% w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m. H5 Z" W+ h7 k  A                                addr  = base + cnt;0 ]$ `+ X/ ?2 l% z3 _: \
                                *addr = save[--i];
# h- A2 l% K0 S, @( f* {                        }
+ T, B" y7 ~% n" x6 s7 ?7 @3 [                        return (size);
# q! j7 y7 W! D5 h7 @                }
0 u% h) v  c- E        }! ~0 y/ q( U5 x4 R  F1 q

  @5 U/ [6 S, ]8 k5 Q        return (maxsize);, i! X  d! M" Z$ z5 E3 z
}/ x1 I% y9 Q: z4 F- A
int dram_init(void)0 r5 G, y" a  a" }, ^
{
- [7 v% m$ a: V0 z        /* dram_init must store complete ramsize in gd->ram_size */- Z; ^4 ^7 c5 _
        gd->ram_size = get_ram_size(
+ k9 g" G% u' M4 ?2 D/ f; p                        (void *)CONFIG_SYS_SDRAM_BASE,* l" R! j& u5 X* @
                        CONFIG_MAX_RAM_BANK_SIZE);8 u3 A# `# }! @  y
        return 0;
/ X' G! B7 |7 q( z}" W4 Q3 E7 F; K- T. P4 l7 K

) {/ F/ N  J& [  i
6 ]2 j2 `: s/ X7 q$ ^4 Q' G; _1 t( W( B9 q5 p

/ g& W3 E% V& I5 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!9 E, M7 X$ y8 w6 v+ x

& U1 T/ N* f3 {0 M, R4 z! A4 |: L7 H5 ]
' f# |2 t, c+ ~8 v$ j1 Q: [0 v





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