嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: q; R8 u8 V1 r  O% x# {4 H9 a
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# S* j) x: D/ H1 z4 g; L8 a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  _) A+ [9 [  t% L$ x: ~2 b5 y5 p4 w/ D5 ?. E) i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 @6 a+ B( K$ w- u4 F0 ?' h3 c# \2 P* V' E6 `, k

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' `% [7 {) f4 l) I6 Q1 l" y& M+ _/*/ B3 H0 [% r5 t  K. x
* Check memory range for valid RAM. A simple memory test determines  I! w2 h; R# h9 O  e
* the actually available RAM size between addresses `base' and2 |9 d% g% e+ z/ i$ D' ]
* `base + maxsize'.& |# G1 f8 [9 M4 Y- O( t  O' U: x
*/; y7 m' Q& u  G5 M
long get_ram_size(long *base, long maxsize)
& _/ Q* R& w- M6 w) B$ g5 V{3 g* l! u, N% ^+ t
        volatile long *addr;
- r/ a) d: q0 p  B, Z( b. t3 C  N        long           save[32];7 H" `0 ?2 c! r* h! L0 T
        long           cnt;5 r* j! Z0 F4 H( l  y
        long           val;
- V. v# x9 R; t% d9 V6 T' Z4 q        long           size;
& z2 B) t) W* p6 |, l4 S$ R        int            i = 0;/ k& j6 L5 g; J
) c! k/ C2 y+ e- l+ \$ i, }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  e8 o. u! T; X1 p+ @, H8 t$ M5 e                addr = base + cnt;        /* pointer arith! */
1 Q) j# r! E9 {* L; d  I" K* x                sync ();
* A$ k6 A/ M9 [. ^8 A5 G, p                save[i++] = *addr;; e: U# X2 `  `0 Q- r% P
                sync ();- H5 e1 @8 r# P5 S( b
                *addr = ~cnt;& t% Y! q# ~; X. L3 `
        }+ T. {8 |! ?! U; O$ i6 l
1 u* ^! O) H' h% ]# k- d- J' O
        addr = base;0 V& b; D/ l" p# [
        sync ();
$ u( c& h# k6 C; }- m) ~1 ~        save = *addr;
- g) N. x9 y* x9 K( Q1 b, _# z  s        sync ();
( h, O  ]1 y  p) V+ q5 d        *addr = 0;: x" k7 ~) k+ \7 Q: l  z

" B4 x2 V. G9 |* S3 V3 H, Y        sync ();% }/ a& d0 `3 x" T' M
        if ((val = *addr) != 0) {; v( P8 A2 _9 Z  [  b
                /* Restore the original data before leaving the function.
: J7 s$ D" p! q& @& B" B                 */
3 V4 d; G, v/ \4 r- ^* B& G  E                sync ();
  `* n8 P& d+ g. L4 r. z                *addr = save;7 d7 B. C. g; N5 [/ P% u4 y( b/ s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 \, P+ i. v) k                        addr  = base + cnt;$ ^; T; ]5 ^( D7 }$ J" V5 m
                        sync ();
- m  E4 C% T5 ?: H( V2 w                        *addr = save[--i];4 B! N: j. P; B
                }* e( @6 |! {- `$ s
                return (0);
  g( M' Y. X8 c        }
* E( o3 U- e0 f: L# I- d7 p. v# u, g( j, U
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! ~6 i$ g: c3 |" J                addr = base + cnt;        /* pointer arith! */& _3 g; X5 m( `. {( k! Z: j( a
                val = *addr;
' K4 J3 L8 W3 A: A# `5 [7 a$ {6 I                *addr = save[--i];
7 h: j) A1 [" ]( }2 h7 K( L                if (val != ~cnt) {: A* [& @3 s/ y( n
                        size = cnt * sizeof (long);$ h& x; ]/ Z" Z* B6 d1 Q; |
                        /* Restore the original data before leaving the function.! F. P' i2 O5 f' Z/ I
                         */
. Q- ?3 [" |) c6 U4 j9 M% \1 b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- g4 f- \# Z! W! N% W3 K; U" T                                addr  = base + cnt;
/ s4 W  }  f3 ~                                *addr = save[--i];
, v; ^/ v# N8 H: {, a9 I3 s( n3 o3 [                        }4 F% b1 r# E9 J0 K/ D
                        return (size);- ]- Q6 l. \/ \$ e2 `: u
                }  J) h4 \" l3 B- _
        }& ^- \$ C* F0 b

. i& J7 m8 m9 h  Q        return (maxsize);
9 l4 F8 V6 L# p: B8 u+ L}
: s8 c1 ^  v/ W2 M" D$ t% ?' m* h* Vint dram_init(void)
% U) p2 J$ Q9 l3 e6 f: ^  o: e1 e{
% d  a3 k" D# u# m7 S" V        /* dram_init must store complete ramsize in gd->ram_size */7 j: ~: R0 y0 S6 k
        gd->ram_size = get_ram_size(
- W, X; f' y! }7 Q8 G$ }2 E                        (void *)CONFIG_SYS_SDRAM_BASE,; M% D, H7 ~+ I) x
                        CONFIG_MAX_RAM_BANK_SIZE);- h7 Z; f/ k' I  J/ ~/ Q
        return 0;$ O/ y( I# w) q% |
}" V+ f) W. @" B3 U; _8 J) {

& \5 D" B0 j: A# ~/ y, T' c8 I
% e4 M9 a7 J1 h$ V# P/ M1 Z" s, m; t" i8 j

7 A% f3 W' o, w, t) V' L3 wFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& Y+ B2 K/ b. a# ]* t$ I$ [, b: ~$ I
: y& n' y: V7 R2 o

1 F: ]2 ?: @: ~; X/ F* w" L

" M5 g- p( g/ j+ o& I+ v3 t




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