嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 \/ g1 s; f0 L3 r# d核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 J0 W" ]0 l1 Z- ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 E: o/ a) T/ e/ `3 h5 D! d8 \) \- V6 ]! t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# P9 t4 m/ X9 ?: O2 P1 L, v) f4 i3 t. O, d+ B/ h: i

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ G) G/ u$ X% G4 b5 X/*5 j6 k! s2 t' u8 |8 T1 O3 ]
* Check memory range for valid RAM. A simple memory test determines  P+ ?% N" i) K* |, L2 H5 }
* the actually available RAM size between addresses `base' and: p! i5 _* j- ~7 ^6 }6 y
* `base + maxsize'.
# K1 S$ m" B6 o*/0 b4 u0 o+ K7 x1 I' S& A5 ^! I
long get_ram_size(long *base, long maxsize)
7 q* D9 V) t3 F* ~& E6 G3 P# a{) t0 K& }& N8 [( f3 I$ y2 I
        volatile long *addr;
$ K/ m' }3 u) K  b7 s# D% Q. e/ |- {        long           save[32];
  Q3 ?( ^; @  q* a; P* F        long           cnt;( C# k2 {5 U* W% y- y  h# }
        long           val;2 N: k! R; u: ^/ K' m# f7 v2 v
        long           size;
+ n0 P0 Z" Z# ]9 Y# a) E# E$ o" ]        int            i = 0;* u0 ?9 Y; n5 S$ f/ M. ~" f! {

; v( ^$ L6 V- t6 F2 W        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ R' {8 z3 A' t2 H  C0 f* z                addr = base + cnt;        /* pointer arith! */
) N" Q* s  g2 C( P2 z2 p' E7 M                sync ();
. \  e7 o( N; ?: I( y0 O                save[i++] = *addr;
! h# [' {7 p1 Y: B                sync ();+ [- J+ ^7 y2 |( t+ [0 |
                *addr = ~cnt;' C: C2 C# H9 r2 V8 p
        }4 O6 {0 l  p4 j. e

0 W  d6 E1 a. l$ z5 B0 I$ J; D        addr = base;
7 i% Q$ }" P. i/ q* n1 w) M        sync ();
8 a) i  e. p5 g# [3 `* q& R        save = *addr;
) s: {+ m, X* z% `% c        sync ();0 p) J4 F# _" C& y0 m
        *addr = 0;0 p% X+ o& Z$ [  \. I8 B# r0 d
) i) O2 s2 [) Y; S7 F
        sync ();  J9 q6 E3 N! ~2 e+ Z! [
        if ((val = *addr) != 0) {# N4 b1 `4 V/ C9 c# U( @
                /* Restore the original data before leaving the function.8 \# Z, ?" E; I$ v2 O
                 */
9 {+ b1 Z- m2 k2 E6 v1 n# ]                sync ();8 X/ M; w2 u9 `& g6 i
                *addr = save;% i$ R/ g5 Y% C. s: M
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# o/ f3 b' V. _% h( t) }2 q5 ~                        addr  = base + cnt;
5 l! e8 O  F  L0 b  S$ D" g                        sync ();
5 S; z6 j* z$ O' Z  f9 P2 r                        *addr = save[--i];  o! ~  x3 A5 j/ M. ?2 u0 \
                }+ m$ G9 m! K* ?; t% D+ s
                return (0);
8 C  i6 ]$ g" J4 T" Y2 T9 g        }& E/ A, w' ?2 r  H3 \
) l) c& e0 D& z8 d# J, e
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 X9 D2 T; R1 ^4 e% z0 f- U5 |! e                addr = base + cnt;        /* pointer arith! */
# z2 Z5 d8 A2 g- a                val = *addr;! r4 q2 \0 J" l1 g" P
                *addr = save[--i];" v! R2 w! i! X: X6 A
                if (val != ~cnt) {  D$ ~+ E3 q1 H* J" `
                        size = cnt * sizeof (long);
0 ]2 O! g" _% ]) Z! g7 C& x3 @% c                        /* Restore the original data before leaving the function.+ G& |' K. q  f+ ~0 v. B: W% [) G
                         */# [5 Y% y% L. B/ [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ e. e* A( k% |3 f1 {+ n5 N9 w, ?                                addr  = base + cnt;
" D& [3 u2 y; s  {0 U                                *addr = save[--i];
) R0 F1 ]+ A: _" E2 ~) d: X* t                        }9 R; \( P( h3 u* W9 O0 F
                        return (size);+ {1 g0 H! }" `' P) C
                }
# ~7 k1 W2 z8 ~) U5 N' l2 I        }
% H* \, U0 o# d- D+ }9 s4 Q$ z/ C) _: [+ H8 a: ~( I7 |
        return (maxsize);
- @+ i% H; t5 G' F& a% i}
- Y! z$ Y* Y; P2 j0 c2 ]0 |7 Dint dram_init(void)
- m" l: Q* P: |! z% j9 l  e2 L{. m* T! W% v+ \" E& i
        /* dram_init must store complete ramsize in gd->ram_size */
5 a! j7 n) e/ D+ J& R5 {* e        gd->ram_size = get_ram_size(
* ~7 X1 \, f& x                        (void *)CONFIG_SYS_SDRAM_BASE,
& F8 B  r# N, P                        CONFIG_MAX_RAM_BANK_SIZE);
* }; E/ v/ {; h5 x. ?; F        return 0;
2 @  F4 B! J; D}! l  _! g" P8 h4 J

4 B% |& M2 r5 O
$ ?3 \1 s+ v. b2 j! X; F- S
% {4 S8 L2 G3 T" B0 _* a
% Z) b6 t7 }7 D9 z* a2 q* UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 e* {0 j; m, W0 R* ~
1 A/ _( J" g- g7 _' f
- ^! \5 C, B6 X9 @

2 @' o9 Z/ I, X9 V8 @. Y




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