嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit6 t+ W6 P5 l  g1 K8 Q7 ~' y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
" T5 E, x! N% g  |7 G这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- M* C+ [" _& E, ?6 B: e2 r2 g% t/ I+ P
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ C- b5 r3 D2 |) N: E3 i. E6 n. l) d) C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 i0 J0 o: X! s/*2 ]7 G/ ^0 T+ D# y
* Check memory range for valid RAM. A simple memory test determines6 h$ w  d4 P$ e+ m- H+ W" i; o: f
* the actually available RAM size between addresses `base' and; T& j/ p" \8 ^; x1 @! l: N
* `base + maxsize'.% x; c7 |/ ]  y, P  M
*/. [# G2 p- q. H( H% I
long get_ram_size(long *base, long maxsize). i; w( {- w4 w* \8 U
{
) V& [# N" A1 ]) q( O9 R        volatile long *addr;, Y9 I* S" A; I1 T$ d
        long           save[32];& L7 [3 u8 [  w$ w2 X% H
        long           cnt;" x6 F* n1 N1 W6 J+ j
        long           val;
0 n! r) c3 S3 T        long           size;- |# B3 a+ |: n9 p; J- b
        int            i = 0;
9 B& }; `+ Y- B) c4 n/ s- n% A! _: E# m7 H' l- M5 u2 E& e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! m1 g6 x& u9 ~5 O* L' R) j' t
                addr = base + cnt;        /* pointer arith! */
! C$ M" H3 p" W% u                sync ();, O! j/ j( C- Q+ L) v7 D
                save[i++] = *addr;2 r. {8 K# `4 ~; _2 g2 P
                sync ();
. B! P% H% j. i) M1 g* r, _6 O                *addr = ~cnt;8 \  K, P, t$ L( @8 ]; F
        }; D, h7 c" x' Q1 h
" {( e. i- R( B5 T$ @7 f( f1 I
        addr = base;+ u( j3 j+ w7 j- R! j
        sync ();
& }/ ^) h/ m+ m: T        save = *addr;
5 R4 E2 G; A' ?& h% r        sync ();
4 k, }, r4 `6 a% K2 j7 |        *addr = 0;) S2 g! g* C# y9 M4 h' e
. [  ~$ C+ c' M7 p, Z4 t  N5 {% n) c
        sync ();
8 Y& }4 c( `+ L2 h! d- u4 `        if ((val = *addr) != 0) {
" j6 x# m$ W* b                /* Restore the original data before leaving the function.
0 |- p% _2 z3 c# m. ?                 */  l; k" U2 Q% R. Y. @! _0 w/ |
                sync ();
$ g0 a5 V- N" ~* ~                *addr = save;
  k6 |- o' E, C1 K1 I2 N+ D; `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 m6 A; S# W1 j2 j$ N2 K1 z                        addr  = base + cnt;
# b. w' ^, X  e' O4 \- P                        sync ();; r4 x9 m% Z1 k: b% R
                        *addr = save[--i];
- ]9 z2 {$ e3 ?& H, f                }
; l; @  g' ]3 b5 A. t2 E' n5 F( i                return (0);- X3 t/ Q8 ^, [
        }
, V8 q+ K) I% S3 u" I1 A7 g. y$ e9 {1 _. l/ K& d+ a8 N* T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) }" w) _( Z* Y$ f) U! _8 N                addr = base + cnt;        /* pointer arith! */
7 A6 N6 H, u3 b6 Z                val = *addr;
9 T9 F. s& ~& Q6 _8 s5 Q0 x6 O; N                *addr = save[--i];: l* [: K$ W+ y- }- x/ e* g
                if (val != ~cnt) {
; M  A: A8 S- Y- K) r5 }                        size = cnt * sizeof (long);8 G- v% y- u  u$ ?6 U6 U
                        /* Restore the original data before leaving the function.
1 Z( T/ p! M/ v8 R                         */
$ D0 @; i- z( \. e3 _% `! d  e8 b6 K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( y) g( G% e3 F6 F& ~1 o                                addr  = base + cnt;* x; S+ a( m" L3 o* t# O& X9 h' g
                                *addr = save[--i];# z5 K1 S+ l' o! |6 ^1 V6 L+ l( u$ t
                        }
6 r% D/ b, `2 Z* ~                        return (size);5 ?- u# Q* e1 z( t# |! n
                }$ ~3 w. t' e/ u0 `; O% f
        }
6 E+ A, w! V( S9 _3 [: p8 O# M8 }# v" R& c
        return (maxsize);
$ @. L2 E% g: c2 z* i}) p- Z  N( r( s( k; \4 T
int dram_init(void)
0 a7 l+ M6 L7 s! y& ^{+ Z& @2 w& F# X3 L- q5 w
        /* dram_init must store complete ramsize in gd->ram_size */
" E. K+ Z) P4 c2 t6 u        gd->ram_size = get_ram_size(; r  r* Q8 [; _# ^4 _
                        (void *)CONFIG_SYS_SDRAM_BASE,8 v* E5 A" p! g9 G
                        CONFIG_MAX_RAM_BANK_SIZE);
- Y1 {5 D7 W0 V2 W; O( u/ ~        return 0;2 Y0 @" q* O4 H3 ]6 J9 k9 ~& C+ T
}
1 J. l% g. X* N4 c) r+ M( ?3 n8 S8 P/ Y9 V
5 C' b. {& S2 X; h) y

/ s0 P+ h- r& G0 x$ I' ]! g1 J$ p( o8 M1 }; u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# ~3 X" ^% J6 F0 l/ v4 i$ n* f& q
5 {# T* I9 \/ I
. Z% F  F+ Y! s4 s8 g' k# K

# k5 i5 _. H& w5 _4 f% ~1 ~




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