嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 w, Y; d- F) i# h6 v' p, [
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) I1 P% M1 K% i7 c这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% p+ f/ B6 W/ z& q+ r
% n7 x9 U8 C; H  t: _, e/ @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, E% }/ e, d# L# S' n- P- [( D2 L3 V* `. E% M2 R8 R

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" H: C4 I6 ]/ ~# R  \7 \
/*
* R( n8 `, Q! J- A! {3 P* Check memory range for valid RAM. A simple memory test determines
" F; l5 m/ o' q' d: i# [* the actually available RAM size between addresses `base' and! Z. K! u- c$ P3 S9 V! G! E
* `base + maxsize'.  W& H! u/ a' q
*/2 f% \) g( D# o2 v; h
long get_ram_size(long *base, long maxsize)8 T0 b3 u1 l2 U' x: Y! I$ }6 D
{. u) _9 \7 h" ^: `  E
        volatile long *addr;
& N7 r/ q6 I# Y) p& o2 M7 h( ?        long           save[32];
+ g* Z9 r  N( m& F, Z        long           cnt;5 x. C! o" p: D8 Q8 ^1 E
        long           val;
6 j: q8 M; w: i0 @6 }        long           size;! t+ p' M1 O4 a
        int            i = 0;. D2 H/ D# F+ A5 q) U' [
) t' Q( H5 G# m
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 q. t1 e. A4 n+ S& r                addr = base + cnt;        /* pointer arith! */( }; y8 w) O& D) `% v
                sync ();2 f7 k% a- ?4 U) y
                save[i++] = *addr;9 `1 r# R  ^0 E: z1 o) P
                sync ();
2 u& g% N& L* ]! Q                *addr = ~cnt;; a7 X. Q9 C/ c0 Y4 M3 p. V
        }
. n4 g; R+ x  K0 U- _
5 {4 S9 x$ n. r2 }! Z* o5 T        addr = base;0 Q" L9 L4 A2 z- x9 k
        sync ();
$ R! Q+ P! W, W        save = *addr;# B+ f6 m7 h* d, y9 E1 y0 |
        sync ();
3 o. U$ b' K3 D; ^" ~8 O6 j3 D        *addr = 0;  m6 W7 P) d$ q
2 O6 \6 C7 h. b% E
        sync ();4 d9 B3 O, |% F1 s
        if ((val = *addr) != 0) {9 Q+ D- K7 ^! e+ t
                /* Restore the original data before leaving the function.
& G5 Z. T# J/ f0 u$ C0 x3 w                 */
7 m4 O1 u9 C* r                sync ();
" }5 T8 n9 L) U( a* s                *addr = save;
2 m5 g5 h/ ?- ^& \) E# ^0 g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 ]5 c( L% Q7 V2 s) k; i                        addr  = base + cnt;
6 r, u* j1 ]1 t5 J                        sync ();4 i. P% D7 g, K. P. Z! k7 K
                        *addr = save[--i];
) v# c) Z! _, U: z/ Q+ C' H* o                }: }' Y, @% e, c% N
                return (0);
7 y# y5 K% R1 C6 @# z& x3 t6 ^  }        }! \+ l) m# M  G# Z) o

( i7 z! V' y: T; K! r7 d        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& i! I5 ?6 E2 d8 i, U                addr = base + cnt;        /* pointer arith! */
3 W0 v& L8 V: L                val = *addr;  ?) Q; m/ L1 c( s
                *addr = save[--i];
/ n1 B/ }) h3 \                if (val != ~cnt) {
& |+ ~" O, Z; U9 Q# o                        size = cnt * sizeof (long);
2 {$ a, Z1 S  i: Y                        /* Restore the original data before leaving the function.
) ?1 p  u6 v' Z                         */3 U, ~# O- ]' s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  ]2 }# F: |; _! S6 j
                                addr  = base + cnt;3 K7 N0 S# z+ k2 w) o- ]! K0 J9 f
                                *addr = save[--i];
$ b$ j$ P& e% k# i; p1 o                        }
& f: i; b3 S% P+ q2 G                        return (size);
" C" ?8 T2 o/ I                }
- D# h+ j8 ~2 T% j8 U8 Z4 \. u        }, K" [' J# h) r

+ s8 j  A. x# d+ a        return (maxsize);
" Z+ W8 R9 d9 |  z( k" Q}3 g% v) Z$ ]# `" ~& X: g
int dram_init(void)
& Y+ J0 g/ ]$ L: l6 `/ k{- i5 s5 [0 E: r. `/ }' K) L
        /* dram_init must store complete ramsize in gd->ram_size */
  A# o5 x: T  }- W+ o0 a        gd->ram_size = get_ram_size(# u4 a7 u2 u) o& `
                        (void *)CONFIG_SYS_SDRAM_BASE,  m3 r% U  W9 ^8 F( _2 P
                        CONFIG_MAX_RAM_BANK_SIZE);4 ]( n7 X. G) q& Y* X/ U! `
        return 0;1 q! V* l/ d& t6 O3 _, o1 [4 i
}2 _3 u$ {0 Y& Q$ S6 H( j

- V7 s8 O, ^3 c; j4 t' s+ B
3 {3 V, q5 s* Z% C4 [) O- s0 w5 l: s; K0 ?) d

  `/ F  I# v, N. ~) e" a. uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ N# Q* j0 I8 q7 B$ N2 }9 k; O1 l1 @' k# `7 y8 ^

$ w$ e7 H- j2 i: w' A) _0 v, r/ g
) G! j, V' z/ l3 O! }





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