嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 |/ ^5 I/ |( `% ]1 ^- s3 p6 ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. ^- `! g0 {5 c- h. v4 A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 @* l: q7 `1 g2 o' L6 i* @" p
% l5 j" Q. {. _: F7 T6 [2 t3 S是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 r0 b6 s  Z: G# c% x4 T5 y& g) ?- g5 a& _4 y' G" n" m

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 z! k+ y. E' K  J! j; g0 E
/** f. S' O4 r! E- c3 ]
* Check memory range for valid RAM. A simple memory test determines
* \, Z9 k: O' A! h0 K% e# `* the actually available RAM size between addresses `base' and/ }* t, x1 X* C/ l5 f) m/ x
* `base + maxsize'.
8 y& s2 K" \% A*/" @" g$ g+ U0 d! v
long get_ram_size(long *base, long maxsize), J. D! u# z% d+ O! s5 m
{
) K3 h7 P, ~3 A        volatile long *addr;$ M% p# ~* f) c* ~
        long           save[32];
6 D( v% p. G/ b: ~& A        long           cnt;
/ i* }3 ?3 t$ r+ F! u9 V* ?4 E        long           val;
  B/ }( \4 A/ m# W0 J- M4 d        long           size;: i" J# c( f$ e" u* |! g
        int            i = 0;
& U! {1 a3 ?* q" C5 @# A
7 V4 z$ Y$ k( T2 X; F6 @' f& b9 J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: d2 b- H. {% j; R
                addr = base + cnt;        /* pointer arith! */! h" @) t+ u3 v
                sync ();
9 k3 e' ~$ ]& `% @1 ?                save[i++] = *addr;* y/ a: _/ e1 [: j
                sync ();$ N% ?" l! U0 E- {
                *addr = ~cnt;
7 i' D1 e# T2 _5 ?* L5 B7 Q; L" j        }
& A0 k' o- b3 y- W2 w- j1 @9 ], R8 M9 |7 L- r" c5 u, \
        addr = base;$ z) Z% ^. @5 z1 z
        sync ();
8 \9 F5 P9 W5 r# u        save = *addr;
: r, T( i6 G- G; G. i        sync ();# H: D' z. q' F6 Y2 d, O7 T, W8 ~
        *addr = 0;  ^5 `5 \) f. M4 o- d( n

- i( s2 F7 `0 H: g* v/ o        sync ();
/ H  F+ }; D5 c+ U4 b/ v7 R        if ((val = *addr) != 0) {5 V/ a/ e! I7 _0 V* G0 E" y2 q# z
                /* Restore the original data before leaving the function.
, r7 e! v  G8 B" n+ C                 */) ?( O) Z* `& G) \4 c) H; S1 h
                sync ();% X0 a0 u5 M0 W& R9 b8 j8 E  Z' R
                *addr = save;0 f3 |. F, `0 o  g& o
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: A. K6 S) E& R/ v" _8 z0 U
                        addr  = base + cnt;3 @$ T( r: x* z0 ]9 h
                        sync ();+ m1 b6 A. n( p2 K- T/ s9 E0 j
                        *addr = save[--i];
* p; D1 M4 a* T( C                }" [- g3 K" {& P0 h/ f0 d
                return (0);
+ y4 B( X: A5 k; q6 _' e0 G        }% n" l: a- K7 z, b0 L; l3 Y
8 h! Q) l2 h* X3 ?
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) _6 U: w" u. I* E                addr = base + cnt;        /* pointer arith! */( K4 Q+ c/ D/ ?5 P6 w1 t8 ]2 d
                val = *addr;
- l  ^+ X$ g# F) l                *addr = save[--i];
. ^& E7 h& m6 G8 H                if (val != ~cnt) {
2 w9 v- l" e+ K) v3 B2 O                        size = cnt * sizeof (long);0 B( X0 a) R; W3 D8 O
                        /* Restore the original data before leaving the function.
6 q, ]& o* M- e" b0 }                         */1 ^, R( Y+ F  A. _$ H2 C* x+ o
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& Q; }1 h, N3 ^# v- ^                                addr  = base + cnt;; Q8 m' }9 g( y+ v  Z) M
                                *addr = save[--i];' ~8 T) M) {# G. e) X3 V+ p/ j
                        }$ f2 R2 T, m1 H" D0 h
                        return (size);3 X8 C4 z$ r& G) I, h8 l( R6 t
                }
0 |$ j! ^- g/ Z: ~        }
2 l& g: ]9 m2 H# l: r/ z$ F3 k; h3 j  ^& g1 l2 T  w' _
        return (maxsize);
" w( V. \  b: d* e, k}* i6 |9 X/ f; g  f! K, g
int dram_init(void)$ I0 ]) F% v, h  N% A' I9 i- g
{& X/ [1 F5 @4 ^
        /* dram_init must store complete ramsize in gd->ram_size */
6 s8 K" m9 B" Z. d+ b" t4 V! B        gd->ram_size = get_ram_size(  X- M4 G2 r( Q: `( y- }& x+ e
                        (void *)CONFIG_SYS_SDRAM_BASE,4 F% Y* C+ ~1 W- u6 t" A
                        CONFIG_MAX_RAM_BANK_SIZE);
  y* ~4 s, d! d1 J6 q# D        return 0;
7 ]: M; k9 \7 Y# \: I8 X}+ S& w' f, n  D3 q1 u: G
2 b5 }* b0 O. F& `0 Q

8 ^/ u( v+ h" Y+ Z+ Z& u4 h% [, m
+ Y2 r( L# V' d; b: i8 M+ Y8 }; p1 G- }& E# E, K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 l5 _  m3 N5 O7 q; u# r
# o4 X- @! i- B2 u' ~
9 K: J7 |& P" Y  F

1 J, ?9 y5 h4 z4 {, n. Y& r9 x




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