嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( A2 F9 M  n% Q# c. V核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ I' S* J) e# o& ~/ F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 ~, }. x0 k2 y7 H% o! F5 q* q: V' U) Q* {8 G; p; e# \8 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?4 k4 z' s% _* I2 D- D

1 l' _, ]% h& N1 @3 |
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 c- `5 D/ n+ T/*
5 H6 y2 o6 Y* C3 e* Check memory range for valid RAM. A simple memory test determines
2 [+ X7 s  }3 x7 P  T5 Z1 R  L2 R* the actually available RAM size between addresses `base' and
8 N9 o# h7 N2 O$ d6 }* `base + maxsize'.! {+ {/ e. N9 n. p' F  k% v
*/
, V) \( C$ T; X$ h1 ?long get_ram_size(long *base, long maxsize)2 L; R3 a7 z% ~/ a% X8 i
{& _$ ^# w2 c& f$ ?  Z! n5 f
        volatile long *addr;
1 S7 h3 y# R4 ~        long           save[32];  ?  Q% r; n3 R
        long           cnt;' [3 s1 a8 K& ]1 U9 g3 p, g' Z
        long           val;/ M1 @" `2 D9 X# Y: Y1 Z
        long           size;2 R8 L8 j9 N9 \8 `+ K
        int            i = 0;0 y) x# @" H! O% d6 L' k
( w1 r& V9 Z1 t
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 u; I0 ]9 b4 i4 N* H  f. X+ s- V; Z
                addr = base + cnt;        /* pointer arith! */
! Z3 G( L; ?0 @% t( |                sync ();
- ]! T: i% L1 L1 w                save[i++] = *addr;4 ]! W2 _# P+ g$ u7 Z4 p9 |5 [
                sync ();- ^; Y/ W/ B5 x; q& s0 j* ]
                *addr = ~cnt;$ o9 H: ?! f) u. b! S
        }; d" X; [' R7 i( P9 N0 s

# z' V5 p$ `+ T2 L. ?. t2 L0 N        addr = base;
, d8 g# V) }7 Y" ^/ k        sync ();5 p8 v2 I6 D0 m5 L+ u
        save = *addr;
7 k6 ^9 r/ C+ ]8 S& ^  B" B        sync ();& A: e/ S( F" I( Q# h* T
        *addr = 0;
9 t% P! m. H# X3 n5 d" v+ q/ d" Y: B) R* x7 b  o0 i/ m
        sync ();' k9 Y1 {" e, X6 }
        if ((val = *addr) != 0) {9 m3 O% k- t; [6 ~3 P4 \- u; ]
                /* Restore the original data before leaving the function.
2 a% g) U$ X! f6 O, o                 */
! Z+ {0 ~$ W8 [7 s4 Q                sync ();
0 m8 |4 N% N! J' q5 @                *addr = save;
- h3 U" s0 l' S& B3 W4 G                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ~6 A# Q# A8 h1 m; @0 i' Y                        addr  = base + cnt;
! V  h% ~5 a$ \                        sync ();% ]6 j: f* O" ^- o
                        *addr = save[--i];
1 ?4 {: I* Y* F, D; {, H                }" F0 R" _) i' V. ]) Z) g' j
                return (0);
) G: v1 K" T1 J8 o" I4 ~        }
+ B- x5 g& |8 i, @) Q; C6 E2 u1 b1 M4 P$ M3 P3 Z9 m
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 R7 l, O) U( n6 [                addr = base + cnt;        /* pointer arith! */
& h" y, J' ]0 ^9 O8 G4 b5 Y# n                val = *addr;
2 y1 R6 ?; e: d! ]  c                *addr = save[--i];
+ M) Q) U# {5 K5 g$ z" ]  V                if (val != ~cnt) {9 q" [/ T  r9 s2 M$ j+ ~  N) ^
                        size = cnt * sizeof (long);
+ y9 ?% ^& m* Q3 M6 y                        /* Restore the original data before leaving the function.4 H+ o* D4 M( [# Q. m2 I
                         */6 h0 Q4 V  }' b" q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' g2 e" H, x3 z. d1 V# X1 R# L                                addr  = base + cnt;
) v! m; B! B$ E5 j                                *addr = save[--i];
, I7 [/ v/ g# o" ?8 I+ i5 g# h                        }  i4 q% B) M5 B" F+ B
                        return (size);- T  h* Y- w, a  _( y
                }5 P% }7 n7 ?$ S! \  o
        }
: e3 @  m/ H2 m1 ~1 ~* a0 I, H
4 W- C0 w, F; X9 O2 r        return (maxsize);
! M' i; d$ F( f0 Z}9 Q+ J" w' G& j$ k
int dram_init(void)4 X+ v& f5 b$ B  e9 E0 u
{- b; h7 H) y2 {+ V9 s
        /* dram_init must store complete ramsize in gd->ram_size */
3 D  z2 N8 R5 V( m, g; ]; X        gd->ram_size = get_ram_size(5 T: Y  g1 ~# b/ ^
                        (void *)CONFIG_SYS_SDRAM_BASE,
  p0 R6 m/ K/ d" G: r& e                        CONFIG_MAX_RAM_BANK_SIZE);
- f2 ]( t$ H+ k" y1 ]! L        return 0;( t8 u9 i% E7 y. m; f
}
* a5 B" f8 v& c$ E9 S( X, K! v, L: O9 [, r! f# |( _. q

0 x3 q& X  [& ]" C0 J9 M0 l5 m% n1 i: F

0 b2 I# U: X$ jFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!7 z* C! P# Q0 X2 v! a7 E
( F  D, ~; f; H3 }% e
& ^/ e! m: i3 t' b) G  }! C

  D4 h9 s# H2 C% F8 y  F# i




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