嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 P. i7 P, h4 j: N, R6 _# N9 M
核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 W  f( r6 ^( J( E3 N1 k1 N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( |7 O. F5 c( U) w" ?  B

8 z; J! T7 d0 G6 w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: J+ X8 C, B' C/ s6 [- }! z$ Q

1 V( z- H1 P- y1 |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 m- q/ u  z+ G/*" t9 z9 x; q* q+ K
* Check memory range for valid RAM. A simple memory test determines
9 ?6 O  Q0 \) I7 [2 R. \' @7 P* the actually available RAM size between addresses `base' and9 \# `( @- L# W. f% X% ]; }8 }
* `base + maxsize'.
  j3 A1 }* _7 }8 y*/5 u( C; P! E& c1 I) ?/ G2 [, h
long get_ram_size(long *base, long maxsize)9 {' h: |: n; t- Z
{9 l4 d8 r4 y8 D, ^) S
        volatile long *addr;
& D% M6 j; L% @        long           save[32];
) G6 ?5 y  D% G+ w. W) q        long           cnt;$ [4 l" B. v# }1 l! G/ V
        long           val;  Y; H  ~9 X( P
        long           size;
7 k3 |' K8 o  n4 [+ Q9 V, Q/ Y+ T        int            i = 0;
) |4 W; X4 {5 z5 X  o7 W2 m/ \$ Q, u  b: F* p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( Q8 N& b7 w& M# `. p; \) o
                addr = base + cnt;        /* pointer arith! */6 h! v9 H" T# ]6 g9 G8 k. ~$ R% ?
                sync ();
5 w: O+ q3 W3 x" R0 n                save[i++] = *addr;
' y5 d2 h1 u+ U3 W, z                sync ();/ S& _9 L; l5 w  B
                *addr = ~cnt;
8 i5 M8 E3 B. A. {! w/ D, j$ d        }
6 Z$ e' I6 ~! t
+ t! `* M) y4 G6 F- Q        addr = base;
) x) m3 w& z7 f' J, m        sync ();; Q* Y/ M5 D9 D- U
        save = *addr;; u2 J8 z7 Q4 Y8 g
        sync ();/ U1 j, u7 t3 \$ G; z8 ]
        *addr = 0;0 T! u% f  |+ h/ d/ L5 L

/ r( P) ^& K: S* z5 X  Z4 t& z        sync ();
2 l! U8 G" y. Z( w+ K        if ((val = *addr) != 0) {: d( y5 }$ B/ b* F0 \% x$ [
                /* Restore the original data before leaving the function.
) `) Z8 `0 g  s5 q+ i/ Z+ G                 */, U" W4 h# v: j0 e0 p
                sync ();% i+ g% x' w) |) [
                *addr = save;
# ~" m: j; W* h                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" k' O7 |5 O% r4 `& e# O7 r. l
                        addr  = base + cnt;: Z; ?& {5 f7 W8 u5 F2 x
                        sync ();
- y' a. h" [) r                        *addr = save[--i];
) }6 l5 u8 p5 u% C( f                }
2 N9 F' Z5 [4 I* K1 o                return (0);! s+ g( Y' B% y/ k( i
        }3 K  r2 S" Q  ]6 Y9 j3 `; J  D0 o" P4 L
! b# V5 {4 m/ u( k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ A6 j( k! o: o! E8 z) C1 y                addr = base + cnt;        /* pointer arith! */5 M9 p6 g4 _% H4 S2 j. ~! U0 w
                val = *addr;8 W7 G; x5 S1 I* `, V
                *addr = save[--i];' r% f9 D( {4 j! W
                if (val != ~cnt) {
8 @) f* Q6 k2 v0 y                        size = cnt * sizeof (long);: g3 p. U1 K  L  e0 R9 v
                        /* Restore the original data before leaving the function.
/ n% r. H0 A+ R! i  {                         */
' c$ b, t0 A/ r1 u) B1 t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: q7 ^$ z9 @/ W  z) ?. t
                                addr  = base + cnt;
6 ?1 _8 r1 n; r0 X                                *addr = save[--i];
; [4 b1 F4 c" ~, F                        }. S8 ^1 p0 p( J0 |9 I+ E* p/ R' ]
                        return (size);
' P# d! Q& C  g  h! i$ g( ]- J                }
# v* Z/ `# R) u$ P, Q        }
4 f# ^* q" L+ v' j
9 |3 Z2 T+ t. H, m        return (maxsize);
9 }( j, {5 Z% z0 T3 k* _' {}4 X5 P8 l: x1 P# V- H
int dram_init(void), z! c, y; U" U# N
{- r2 M$ ?$ z& W3 j. F) S
        /* dram_init must store complete ramsize in gd->ram_size */
% {! N3 K% O" T% v9 g        gd->ram_size = get_ram_size(
' c( Y+ a, W( J" P                        (void *)CONFIG_SYS_SDRAM_BASE,
( o( ?- [* v1 `# i9 ], Y                        CONFIG_MAX_RAM_BANK_SIZE);9 N* v) ]. L- e0 q' O0 z
        return 0;/ v/ r  [; G  n* S. y. M0 @- T
}
6 v( w+ I0 I. M$ l3 D1 q2 x
+ r5 ?5 V- Z& E  O5 K
- Z- Z# S- c# @" l+ v, o2 _
( Y- C. ^$ D8 y/ h, l- Q- Q* e  f6 L. V4 l. [1 y/ n
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 j4 T" k5 R) R) t
0 l6 x; v# Y2 [' j! [$ v8 p2 Q9 G, _* M6 c) F- U2 w6 a

) G4 l9 a/ K9 G/ g  Z' V/ w6 o8 n




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