嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 \  E4 Q: N$ M! Q6 R4 G8 Q核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 K+ }+ i4 F. x' y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& u' V" P. h& K

1 Z9 Y. q2 \$ U3 y/ L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" w  V6 ?  r8 |: A
7 p* u; B9 \) J6 O$ P

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 r- s3 ^) `% \6 U/*' ~  I- i, M. L9 Q0 p0 w6 H
* Check memory range for valid RAM. A simple memory test determines
  @* v5 Y9 J) D8 o( V& {* the actually available RAM size between addresses `base' and
+ F5 ?: w6 {( y0 A4 _# p* n0 u* `base + maxsize'.6 b! u; w1 D9 v9 X
*/
+ q; O4 `: ]. Z  ]0 Tlong get_ram_size(long *base, long maxsize)& ?( P- z/ j; @5 _
{6 f- [7 Z( N3 t( g0 S* p; K. r
        volatile long *addr;/ X6 h9 Y  ]. L6 c* d1 J) }  c
        long           save[32];8 U, }- Y$ n- ^8 L
        long           cnt;$ F6 R% V/ Y2 U! ~
        long           val;; W8 o/ v( r) f" r
        long           size;0 g# b  E# I/ w: O: r6 B# p. M
        int            i = 0;
) C& G- l" W7 `0 s0 ~' e6 G. H* h6 x) s
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) A% q, l0 x( K4 t; y
                addr = base + cnt;        /* pointer arith! */; ]. P& P0 _# D  m
                sync ();3 @2 p( g) E# P  n# ?
                save[i++] = *addr;3 [' A  v& E' o0 ~  Z, K; n
                sync ();, s' g  Q1 e" V
                *addr = ~cnt;/ v) E3 \: E3 D8 M* ^4 w/ D
        }
+ `! p  T+ S! `, ^! z" r3 ]
6 y7 ?  j; U% s# q        addr = base;1 n1 d, N; a3 X# P# r+ }
        sync ();
4 H- Z- [1 ?5 O        save = *addr;
, t0 s& c6 n7 Z. n; E3 z        sync ();
4 i3 m% M3 W0 }4 [5 l        *addr = 0;' m4 R: k2 z( [) j2 U2 P

* A6 s" o5 ~3 `$ d' m; G# t& I        sync ();
  k. v" X) E4 p        if ((val = *addr) != 0) {4 |# q- K2 H3 K3 x, o* b% G8 s
                /* Restore the original data before leaving the function.3 Y, _7 l3 W, W
                 */2 S3 _2 C- F" T" |
                sync ();
; }8 s. O! a: k                *addr = save;
! w, m5 O. j. E" y# Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 ~7 X9 R' u; m( S9 W, |0 G6 a& {1 Y                        addr  = base + cnt;
/ x* i' T# b$ ]6 X1 B                        sync ();* Z" Y2 M# i' E& u2 I
                        *addr = save[--i];
' E! A7 p6 i4 t$ x6 M: x- a4 z                }  Q1 U( u8 m3 W8 z0 X
                return (0);# W4 r' G# T$ O# Q: G" q- \
        }( L) e9 J2 o1 v- O
, k. H8 M3 z8 m) k' b
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ }1 U! a) ~/ x: S/ }) @  C9 C9 e
                addr = base + cnt;        /* pointer arith! */9 n5 ]6 a% t2 c( J! V0 \/ }. B
                val = *addr;
) x1 B( x/ C( j# {" ]# t% v                *addr = save[--i];1 O2 m, H. `8 ^& v7 ^
                if (val != ~cnt) {
: r6 }2 L6 S" @# j$ Q                        size = cnt * sizeof (long);
1 N  K% O7 u" j                        /* Restore the original data before leaving the function.
- x9 {7 B( P2 ^0 ?. ~                         */
# P5 H' x+ d# ]' O0 W                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 q! N; O) A2 l. Y2 h0 i
                                addr  = base + cnt;% H5 I* @) B/ |7 D. d) ^' s) V
                                *addr = save[--i];+ y+ S3 @9 q% L7 {9 S
                        }
% S1 [" _# [& r1 F8 e  y                        return (size);
9 E# n4 c8 |! }: f; N% q5 ?* g                }  a/ X7 J; u! n$ D; L; D
        }
& G1 l2 X5 d# G6 y6 {
1 p1 F( H. b3 h; v" b        return (maxsize);
2 i6 G7 ^; f( ]" ~9 n( m; ~}
1 }8 w' [0 X, b7 O% m( N3 Cint dram_init(void)
+ v- _9 w! z. `& N" W7 D{& ?  y$ p1 ]/ `, k! A7 G8 E- y
        /* dram_init must store complete ramsize in gd->ram_size */
' i% C7 B" [4 V1 s; r3 \# p  Q        gd->ram_size = get_ram_size(
, f! Y  S6 g+ G3 d! B& e" X                        (void *)CONFIG_SYS_SDRAM_BASE,, ]1 [" M, U' v# Q
                        CONFIG_MAX_RAM_BANK_SIZE);
+ W7 T. V' N3 y7 b8 h) R+ J* g, Y. F        return 0;
3 {$ e1 Z# g0 t; M% X}! M4 ]/ G' U0 y
7 ^0 j: R5 N# E) t- K" Z; [

- U3 F) y7 j  a8 r' H
0 {* _. l" P8 t4 S6 Q) W! c' B- v2 g# Y: V) p
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 U. H* Q( ]8 r& c( J4 Z) T/ v/ R
  |$ j% m. g) Z; a5 _: X$ H) P- \$ `2 ~; `1 m
' J6 L. ~/ d/ i, ]3 {





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