嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 Q! _. `$ x. {7 T& r
核心板2:DDR2 256M Byte   NAND FLASH 8G bit+ J4 J- [2 ?2 ~& `$ u: ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 I  w2 o  I" D2 R3 U" G( q
, i. f9 R' }9 m2 [! F; k$ j
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ m+ D; o6 n% S8 L% f, Y7 A" Z" [* {' F

3 y+ T3 }$ v- j  v1 `
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 ^# D1 y3 C$ E* {9 p/*" l( b9 P6 q9 }& v, |& N  D
* Check memory range for valid RAM. A simple memory test determines5 p( y, }$ v% Y7 {/ z# ]0 J0 [
* the actually available RAM size between addresses `base' and2 `7 N3 g, E; k
* `base + maxsize'.2 u+ R2 ]$ }. g) S$ m9 y5 }& }
*/6 V* `9 D) `) ~9 e
long get_ram_size(long *base, long maxsize)* H+ W% x; _8 i* Z! h
{- y* v8 U- V( h: l1 Y0 T) c
        volatile long *addr;
) E8 l# \( \! V/ x. X        long           save[32];
/ M) [) M, r2 ]/ G& C$ w6 ?        long           cnt;
5 _4 e4 L9 b7 M" e2 o* ?3 b5 S        long           val;! A( x- x- K4 u* w4 F( @& b
        long           size;
0 ^+ f: p2 r5 [; K$ `5 \; G: L+ l        int            i = 0;
+ o3 R9 c* k, X  ]2 I/ `  T5 E- T9 H. ~1 d9 h
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 H% g2 h/ E7 C& Q  ]                addr = base + cnt;        /* pointer arith! */: Q" q6 T0 X0 Q3 W3 L6 ^# D
                sync ();* I7 o. @# G: N
                save[i++] = *addr;+ a: \0 ^0 ^' I5 {7 K, V
                sync ();7 X0 {% H2 v  o# r4 r4 {9 D5 k
                *addr = ~cnt;
, f* ?5 v6 B! i8 M- f" Y3 r        }5 g4 ^& }" g1 t

& A9 N6 W8 }2 g" A        addr = base;+ y5 b/ x3 V# u& ]; p1 a$ m
        sync ();7 M1 Q8 g, ~' {9 o! Z6 r
        save = *addr;; S6 t3 Y% a  _0 |) y$ u7 ~
        sync ();
2 L% ?& f1 r9 V$ q        *addr = 0;+ S; f4 n! A: s

! Q. M7 N' {, c9 i; J* Q        sync ();1 {. g8 _% d8 D  H
        if ((val = *addr) != 0) {
0 ]7 a. B# F! W" y; d                /* Restore the original data before leaving the function.7 f- z* c+ e% N( e) I0 o5 D( N+ ?& ]
                 */
# C4 L# G) n. m( B, \                sync ();- y8 |0 S) Q- Z" N
                *addr = save;
8 @; _. b$ W) H& W2 o3 u                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( a# H% {' U# f( r1 m! j                        addr  = base + cnt;
; l* `. [1 M; @* u; u% G/ [8 T                        sync ();
8 O3 F! k& L1 n' Z4 q5 L1 g                        *addr = save[--i];
0 `, U' D  x! K' c, _                }
+ ~( H3 G% X$ ~) W9 J5 e5 M                return (0);+ P, _; m  }- ?4 L7 n, ?7 b
        }
2 K+ ~, G0 w) o+ [7 ]% l# a/ b$ t( e# K5 J: e
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) i$ y/ A5 m& P
                addr = base + cnt;        /* pointer arith! */' f) U3 q, s. W+ |. ^5 O! d
                val = *addr;# O9 H' k9 Q0 w
                *addr = save[--i];
6 [* n6 V& c5 H2 S! ^# ^                if (val != ~cnt) {
7 g* r. i( Y2 ~0 X, d                        size = cnt * sizeof (long);
- S4 d$ U* C2 q$ U' {: O                        /* Restore the original data before leaving the function., `& R( X) `; p4 K/ x* n0 s# z* ~
                         */
& b+ s7 D" s" D, K& O! R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 k" X* R: D1 _4 N
                                addr  = base + cnt;# \! q" p) y/ ~# a# _
                                *addr = save[--i];
8 P& A) _+ j/ Z7 c& u! N1 {                        }3 o) H& u+ D: I3 N1 G/ p
                        return (size);1 G' q, v" E& w; P5 J! ]
                }1 p+ A- e( l4 K0 j
        }
5 {  E- ]9 p! Z$ F0 Z; t* w5 T; A+ b7 i& G' e0 }
        return (maxsize);
7 q) E% L/ f6 r' t- x4 A/ V}# X/ k0 \& m: Q. s( Z, ^
int dram_init(void)
/ ]. h& d  I& x7 T% e7 k{" m8 Y& S& u% U1 I# B
        /* dram_init must store complete ramsize in gd->ram_size */2 c1 j5 E+ E! ]; |
        gd->ram_size = get_ram_size(
6 b8 W4 X  D$ @+ r$ M, n; }                        (void *)CONFIG_SYS_SDRAM_BASE,
7 ~1 ^$ d+ l5 G- N- R6 q. A                        CONFIG_MAX_RAM_BANK_SIZE);
6 m: E0 O0 |  U        return 0;' Y# U( y/ X9 T- T3 W" U
}
) Z+ t& v) v- o
3 |4 w  ]# N1 `* p
$ Q4 _2 \! G5 W  [4 N1 ^! ?* m
1 s& ^$ Z/ \( }( h& A9 O
3 X& Y* W: N4 p: |3 p9 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! r7 Q: r6 A7 a9 i5 W5 ]

# f$ x3 K& b9 d& U, z" d- w4 g: E( n* t$ K) C
& _0 k& |4 X, R





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