嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  e" I) Q) F" A1 w/ U核心板2:DDR2 256M Byte   NAND FLASH 8G bit3 ]/ ?& b% d/ E& Q$ Z- m# [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) @6 o  K. p7 S' {# A" R
- j$ V( S( J3 n% u+ ^* H$ m
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- l% l: T3 ^4 ~* L1 x5 e

, q& K/ [7 g5 |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" X: X5 [& D& I1 P, e/*
9 U# L+ _/ C8 b8 H* Check memory range for valid RAM. A simple memory test determines
  Y+ @, k! }0 r4 l+ Y9 R* the actually available RAM size between addresses `base' and
0 Y4 w+ k4 f! X4 ^* `base + maxsize'.# |  {+ @. O- L7 J2 Q
*/
1 X% b3 M( u4 T1 c& mlong get_ram_size(long *base, long maxsize)
* @" p& K: f3 k  N{2 Q5 A% t' x2 L$ w! U
        volatile long *addr;+ B0 f; K$ `/ T- a1 \0 y  ~# M
        long           save[32];/ f8 q. I7 W1 c9 m# z* B
        long           cnt;6 g. @  j" H" w% l# A. n
        long           val;4 B- A0 s! C! s
        long           size;1 r6 j$ H# n- q( X/ l1 ^
        int            i = 0;' B2 h# @0 h' Y" _4 Y! J% P
  |, G8 t: J6 M1 r
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: I+ ~5 j! V# I: X( I6 N                addr = base + cnt;        /* pointer arith! */
7 s4 _* [; L) L9 T* d                sync ();. O  z+ @0 R& ^* K9 S! n
                save[i++] = *addr;
$ f1 v0 O, `" s. ^  @  F( ]                sync ();
. A# H: [6 r( z3 Q. @  z3 \                *addr = ~cnt;
( ~0 z+ B+ H! D2 J# p- R7 c        }
4 a9 g8 R) ~# @- w. t; n+ ~5 C6 P% @. r: Y5 i# N
        addr = base;
* [& t& M" F4 r  m5 ?        sync ();& E$ s1 c& c! Z8 v# N9 O
        save = *addr;
. A3 I! w+ A: q% f        sync ();
/ A; j. L& R! [" Y        *addr = 0;
  c6 Y( U* R! p2 n3 m  {9 {* E8 L4 U* J  l- U: o1 W/ X! v2 S
        sync ();7 @* [% w4 G# |& z: `' M7 `
        if ((val = *addr) != 0) {) b/ I  s' M) x+ O; |9 Q3 [. A
                /* Restore the original data before leaving the function.. r. y- ~$ \2 T) A7 Y8 b) f
                 */
4 s( y6 |% Y' _9 f: q! H                sync ();, S# D" |! G, E2 L9 n4 _1 Z  D
                *addr = save;
) ?: f% L. G5 j2 j$ f+ ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {& r4 {. L( V7 `
                        addr  = base + cnt;$ U) l& A; c) F; @, k
                        sync ();6 [8 O8 R0 @4 h; ~; b$ l% i
                        *addr = save[--i];: b% M& h/ Z$ P5 q& G
                }8 y- k, x) O* k4 l+ q
                return (0);
! p9 f. M! E# A, Y8 a        }
8 H8 r/ B4 m/ E/ a8 w. E( h5 e
1 W7 t- B3 }& _& W+ c& ?, w        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% S- D9 [/ r0 e9 j# p; y, ?9 M
                addr = base + cnt;        /* pointer arith! */
5 \# m/ x. a& b8 F1 z5 X( P                val = *addr;
/ H2 Z2 _9 e, N7 f4 ^2 S- \                *addr = save[--i];6 t1 w/ [& l* ~1 |( h
                if (val != ~cnt) {" Q0 v! ?+ v0 J6 L
                        size = cnt * sizeof (long);  W% N- d7 G, b
                        /* Restore the original data before leaving the function.: c" ?) p& M* ]+ h1 Y8 c* C
                         */9 H% @* A6 ]+ k# F; z4 j2 M+ m" h2 K
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 Y* r0 g9 B0 K- B7 O7 \
                                addr  = base + cnt;6 m7 C+ s; R1 ]* }* H# S
                                *addr = save[--i];5 \! ^" g7 V$ i$ h
                        }% r# R4 b& M" S: T
                        return (size);
; d" L; F- J8 O, }) U- N                }9 k' o7 [0 T1 V& F: ]5 V# _7 t
        }
1 O* V8 [# K3 ^6 y7 w5 ]
2 A8 X1 Q; w5 n2 {) a( @$ @1 ]4 }        return (maxsize);; [3 B# g% S! i! u" v$ j
}
4 @* m; \9 H% |% Oint dram_init(void)
+ i8 D3 ~! i: _$ P( d{
7 d4 o4 P6 g: o: o1 Y( v        /* dram_init must store complete ramsize in gd->ram_size */
) R3 J+ O0 ~3 _# N0 O0 X        gd->ram_size = get_ram_size(/ u! i: Z3 v9 w$ Z  D% c
                        (void *)CONFIG_SYS_SDRAM_BASE,' ?4 o+ ?9 N/ F- H- G
                        CONFIG_MAX_RAM_BANK_SIZE);
7 L* `( c4 `+ Q! ]& ?; _        return 0;
  K; l9 I" ^7 h7 D# m& d1 p( _3 C}
5 |7 a( U1 M5 Y0 k: R' J* G0 Y$ P% n

0 x3 \3 b* `& {% o
9 v% v8 G' c* G! u# T
4 b( n6 X( u8 ^- L/ [FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: C* D8 w4 c: O" V
; V3 j7 D' f  }' Q, u5 B* j. \) p; S
+ ^) [* q. y: y6 T  L





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