嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ i# `" v2 S0 Q5 i核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 D7 j) e8 m: ]这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 a& X" l# q9 ?1 F# P, [- Z+ X9 G7 `, ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; B) t0 `4 Q% ?% }& N: u' }1 k
& x  i  C5 ?) Y4 P2 P2 O- ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 a2 `7 @8 C4 N3 G/*, \5 \& R+ G5 g- T) _; |
* Check memory range for valid RAM. A simple memory test determines- f& p: a/ O$ R/ D
* the actually available RAM size between addresses `base' and
/ L0 f9 K; ^% k0 z; X5 p: j" y* `base + maxsize'.( G4 C0 H. P2 \' U' p
*/, {7 [) j6 ]. N( T
long get_ram_size(long *base, long maxsize)
# q* A& ^" b0 L- v9 j1 \& D' P{' w9 J* O6 _, U5 u! Z
        volatile long *addr;
# T0 j$ @8 ?. g( u, Y" N1 J        long           save[32];
4 N+ ?; ]# q0 Y, f. F. V2 o' O        long           cnt;
% l; K# @1 A- M$ C7 p5 `! y        long           val;. b# H2 ~7 D9 j* @7 o
        long           size;
7 z* h' V$ O% k0 U) ^* f! v  H0 \        int            i = 0;# A) r% h3 Z# [% q# {
8 o+ J! `7 I- W) H) @8 j. M1 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 s" J$ k( d" p7 i; Q                addr = base + cnt;        /* pointer arith! */+ J3 j( c- k. E/ F, j' I0 Z
                sync ();( M5 m' M# f0 K4 e, ]6 k
                save[i++] = *addr;
/ y" w" ^" a& ?                sync ();
8 z% y% Y0 J6 z8 p8 _9 X                *addr = ~cnt;  |2 D# I  Y+ X% m) j0 w. Y
        }
! X2 m% _8 S8 V
! ^: L* F1 q' M5 y+ A6 Y        addr = base;
& D" ]+ \+ O1 x2 m7 g3 \* Z+ U; D        sync ();
3 P1 a! H+ n9 T" F        save = *addr;
; E. }8 A8 {4 k/ q3 x$ {        sync ();8 N3 L$ c  l; P9 H# d1 w6 R
        *addr = 0;( r1 u* Y0 y4 P  B1 h
% C% I1 y6 @( K* Z& `3 j0 b' l4 M
        sync ();$ X7 I2 V% @1 J: Q- }# a0 `
        if ((val = *addr) != 0) {
2 B- X" Q- y0 x) V* Z                /* Restore the original data before leaving the function.3 }( O8 l/ q0 t  q9 @
                 */
1 p4 {3 Y  a. @                sync ();% O* q. M7 G3 {& u* r
                *addr = save;' v& y. [' v: k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 H* A# W: m4 q3 b8 y4 g& q4 S% L2 ], T                        addr  = base + cnt;
2 w& V! m5 ^+ ^' i% K* J7 @                        sync ();1 C( S: x# L8 c% P. _
                        *addr = save[--i];$ J4 l% X- p' f$ Z+ h- u% C' [
                }0 L7 |% q3 Y, k% \
                return (0);, w% S. x$ J! o* ~2 E* i+ i% f
        }
  f# V4 |% \. F! o* M- q' i/ H0 N8 W& a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& W" v! R1 o0 M
                addr = base + cnt;        /* pointer arith! */. W% [6 F# I& V( L0 z# H) D
                val = *addr;/ {5 H$ h4 o& R! N- D. P$ c
                *addr = save[--i];$ X: `2 j. s4 q% j! ], H, z
                if (val != ~cnt) {  J* j% V$ ~" _  A8 H- ?% O
                        size = cnt * sizeof (long);, o0 G8 T, \# R" Y1 q5 c5 Z- W
                        /* Restore the original data before leaving the function.
' \0 c4 a. ~- D* `2 }7 O! c                         */
0 h5 _4 O& P5 X( ?$ E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 s/ S% {; Z2 d5 B. M- i                                addr  = base + cnt;/ m; X6 A) z6 e7 @
                                *addr = save[--i];
  r3 H6 c% }4 {5 Y5 ?                        }
* e7 C( U( d) q- Q. H, f' f                        return (size);* E' c% D: p) [: \
                }
; U4 V8 f9 ^  v( r3 A1 i        }: \0 t7 ^- S5 s1 o. O# n( j

/ g1 S& C  B: q" \3 e6 d        return (maxsize);
) |3 x- s4 X- M/ w}
4 K4 X3 C9 V6 x9 A8 S4 y# ^6 Vint dram_init(void)
6 Y! i4 P% ~7 ]7 A% g2 w  g  B{* ^/ u  H/ r2 h3 A% Q. v" j
        /* dram_init must store complete ramsize in gd->ram_size */- T7 p5 J  i6 l5 B" d
        gd->ram_size = get_ram_size(
3 [2 J, n/ `5 W                        (void *)CONFIG_SYS_SDRAM_BASE,/ h# B% B3 ]! o/ Y
                        CONFIG_MAX_RAM_BANK_SIZE);" @- |# _1 C+ N& {( u" u; T
        return 0;
. f9 }* i0 i5 H! Y" _7 X3 n: u}7 h# o. i' k. U, d# A& d) C

. g  ]7 R5 q3 N0 l
5 b2 b* i; c7 k1 H4 L, t/ }' [' B; u( v8 r' x

" l, g; H1 J) ]9 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& h! R; Q3 {$ x8 t% M6 {3 R0 \+ _2 g+ ~
, u5 a+ N6 F2 h/ f2 D

, J$ O6 X! C; v8 ?6 Z

  c& O0 L) {5 [) d, [& `




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