嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 g9 E. i5 Z+ o+ c核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ p  Z6 T) o) V7 O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; a' I; q. w% o8 b* \- n: G  V7 n8 P* ?3 n
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" `  \3 Q0 |) Y6 p+ K, A
) D1 O9 p' s1 H8 R7 \: }
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ T! g$ l; C3 Y: [; u8 F/*
! z, C- }% I# ^7 e* Check memory range for valid RAM. A simple memory test determines- {/ l2 |! D. N& D
* the actually available RAM size between addresses `base' and
' Y) z! n% s/ E) _) I* `base + maxsize'.
1 E7 s- v; b* Q9 K# f) p  _*/6 ~! f  k+ l* Z4 o& |3 l0 E- H
long get_ram_size(long *base, long maxsize)1 n9 F7 m' H) h3 R# m7 N, x
{
( }2 R- ~. }. x; n. g        volatile long *addr;
2 C9 y7 u  ?( t        long           save[32];
, O# j5 O3 l% ^* o' Y. C7 E. R        long           cnt;
( p$ X0 Z" v) [6 k        long           val;
5 x5 Z! c! j4 l# ~, x7 [$ V        long           size;
* z' k& r! L# [        int            i = 0;
0 G; W1 A: m' a% P: d' ]" o- _  r6 K6 R% ~  X, [( z6 j7 X8 w
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 ?8 L% h( z5 y- {$ |7 M                addr = base + cnt;        /* pointer arith! */& y4 b1 H7 f8 u% r+ o+ b& f- [" U
                sync ();* T5 T, a& [2 T
                save[i++] = *addr;
2 G6 |9 z( O+ t. U                sync ();
6 X( @/ M: B9 ^+ e                *addr = ~cnt;" C! P) ]* d5 f# P) M& H
        }
1 f1 I% B! m% ?$ g2 Y- ~$ i1 i1 s/ |$ I: F9 d
        addr = base;
2 d- I" @) J9 R6 z        sync ();% C) d5 d3 n" r2 p7 S) ?2 C& a
        save = *addr;
5 ?5 |  u5 @4 b& u: ^5 g% B6 {        sync ();
8 ]2 r+ Z) T: e        *addr = 0;
. P# U! q. i4 F2 k  H+ i
0 G& w8 Z9 G2 Y" Y4 W; f" M        sync ();* S1 @% A1 O( ]; I: e' y" P# @$ q
        if ((val = *addr) != 0) {+ V! d0 U; a0 K3 ]* m
                /* Restore the original data before leaving the function.
8 h9 [2 _) b/ v# z! {( H, b/ D" L                 */4 Q3 U5 y  _8 J1 s! J. K* S
                sync ();
' a$ Y* o) b; J- V                *addr = save;) H* P: Y2 Y( l1 i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( V1 U& u- u4 A; Y                        addr  = base + cnt;  H) G0 [& u5 B5 j# k2 a! z
                        sync ();
& ?1 k, j! R, p2 [                        *addr = save[--i];
- o# _2 d" I4 R1 |- {, ^                }6 x9 _+ @4 a& Y# c
                return (0);
1 U/ Q3 Z: {$ g( m8 ^  L9 o  k5 }  u        }
, Y) T' K- u3 G3 X8 ^6 D9 |( U1 c# Y: \0 [  ]. I4 z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 @, a0 {3 @3 M& V! K                addr = base + cnt;        /* pointer arith! */
9 k$ p. v# {2 Q. H7 F6 Q- Y                val = *addr;) H3 P$ X! a  \
                *addr = save[--i];
( ?9 a' V( q8 e$ Z                if (val != ~cnt) {/ W9 G+ B% X  g$ v5 V, ^
                        size = cnt * sizeof (long);
/ k2 V* r) |, W) R& l                        /* Restore the original data before leaving the function.
7 [$ G& n# Q% n2 w: h# J  O                         */8 H) F) f7 ~  X4 j! l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 e* P5 i! V. R% l( w) R
                                addr  = base + cnt;8 V+ r1 J2 U9 N2 M
                                *addr = save[--i];  d+ K* `, s8 f# ?9 }3 t" I; y
                        }
& G$ y$ s  R6 m9 O: V- R% w                        return (size);
, S" D2 a2 q. B* K  [6 x: X  G0 m                }0 m2 U- H, C0 z9 Z5 I& u: ]" z
        }: F. y) w6 \" K: Q+ K
3 V; h% }' |8 h! v% [; h
        return (maxsize);! H3 a+ O  [; c
}, E4 B9 V- F: Y( s1 l
int dram_init(void)) `/ y- e$ \5 |1 O9 N- D2 U" v
{
1 ^' l2 ?! x7 ]6 g% C        /* dram_init must store complete ramsize in gd->ram_size */7 T2 M8 v9 n4 H' N- m0 S2 n2 W
        gd->ram_size = get_ram_size(
5 D1 y( G5 s. W* \$ ^- W7 m                        (void *)CONFIG_SYS_SDRAM_BASE,2 o0 i7 ]- B+ a% s4 H
                        CONFIG_MAX_RAM_BANK_SIZE);, B, P$ [3 p- w4 h
        return 0;0 r; H7 X, ^' d# y. P% j
}& e3 o7 u6 r" W/ |
9 o+ m% j1 U7 @  n
: s" W1 P# u" S* e( b3 Q
8 B# w* z3 ~7 b1 r. O0 D

- o) L: S+ v' Q$ P4 ]: V8 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! o* K0 p/ m* Z- i
) v0 M$ }) t! ?' u
/ v- I( ]8 v9 k2 R
2 h$ p* H8 T# E/ [





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