嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 a0 k# c: P1 P1 }9 d, l核心板2:DDR2 256M Byte   NAND FLASH 8G bit) C  i. O% J# C  M) s( C7 c+ G8 \/ z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 ?8 H( I' `: Q
& U0 Y+ }  ^; K
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ V4 x) s6 d1 T9 F
0 ~9 z) s% e7 ^& y* R

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& P9 I+ B6 s2 Q' p1 [/*
, Q7 k3 Z; \3 L) X8 r6 E- S* Check memory range for valid RAM. A simple memory test determines
0 c" F% \7 N6 K7 H& n- \* the actually available RAM size between addresses `base' and7 U2 {; F- h. {* t9 Q# f
* `base + maxsize'.
" f4 m' S: K9 c0 J, @5 i*/
% h% s* ~  {$ l, |  E, ?long get_ram_size(long *base, long maxsize)
* c$ `; j' w/ K7 M! e* `/ [) S, o{
( S6 K& o0 ^0 L- K4 ?" p4 {0 s0 r$ R, C        volatile long *addr;3 C$ n* E# ]7 X9 F" v* K3 b
        long           save[32];! E5 P/ L+ \. b
        long           cnt;' @2 {! ~- V: g, f9 E
        long           val;+ K# U7 `: J4 M4 Y! e, Q: X
        long           size;: g9 y9 ?' J' u! ?/ h7 k: l) |# Z
        int            i = 0;7 V; s6 I. U" k# r; Y
( Z8 D( X0 N- _1 n/ ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ }' {9 \* F5 t2 c                addr = base + cnt;        /* pointer arith! */
/ c+ {# f. y2 ~$ Z8 r. a# ^                sync ();
. \7 z. _  Z* }0 L( R                save[i++] = *addr;5 \! x: L' Z& k, w1 N6 p8 Z
                sync ();
! o; [$ _& H. R                *addr = ~cnt;
# L2 ?3 h) f* J        }
5 ]* g9 L& z: a1 Z& U) W
" h1 p9 j  `6 j7 T: W, u/ n        addr = base;
5 q6 a% v/ C: E( l2 j. O        sync ();
, D$ ?( V; n. N% ^; V4 ]        save = *addr;
  O- t+ S$ D5 C7 ]5 n        sync ();: k4 P, \/ J1 T
        *addr = 0;; \% S3 {, F7 ?' r. g. G1 \
. p" l( ]! L1 l5 i
        sync ();
# S+ ~' |: I. p' _        if ((val = *addr) != 0) {' R7 L" T* j7 L
                /* Restore the original data before leaving the function.  ~2 u) ^9 q! _' L6 p0 W
                 */
8 M5 o  Y  P7 O/ a5 ~; D                sync ();: f3 S" A, N4 N3 A
                *addr = save;, a. V* I8 p7 Q2 k
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {) ]5 p5 H( |# ~' G: H
                        addr  = base + cnt;
4 U3 u( O  n/ t3 _7 w/ c                        sync ();
; i+ K! l: z+ _" `. w2 c1 e% _                        *addr = save[--i];
  S  h" D$ D8 o8 w& H$ a6 |! O: a                }
0 [  _7 H# k  a  ?  \; c, Z                return (0);
+ W% f5 G; u" Y2 Z7 k        }
. @6 s* x& f7 [& m
; B. i" I4 s! N) K1 s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ p, t# \/ n1 b9 i% C2 k* J0 A' ]
                addr = base + cnt;        /* pointer arith! */. _  k5 f. `' e+ f8 r( ?/ \: {
                val = *addr;
; e5 i3 X" K) R. n$ E( W                *addr = save[--i];
7 m; S" E7 m6 o3 Y! D# t1 L$ O5 Q                if (val != ~cnt) {/ I) z! r% N, J9 t% T( V
                        size = cnt * sizeof (long);. n2 m7 m: Y3 f
                        /* Restore the original data before leaving the function.
8 d& M* z  s# b! c1 J2 z  Q                         */( W; Z2 G4 x8 {0 g! Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 i8 K" Q; e. t  r( @/ s
                                addr  = base + cnt;  j. s0 M+ E- `' L$ v9 F" L
                                *addr = save[--i];
; \) X* |1 G5 D" ^1 h$ b                        }" o" ^$ M4 a2 f
                        return (size);3 z& ?8 r+ M  C/ c$ b# O2 d
                }) }# s6 U& ~- F+ f2 ?. t9 }  E5 u1 @) Z
        }
% c: a  x+ e' E; n/ ]# I6 Z4 X7 Z) e) h
  w. Y5 D9 T4 J0 `        return (maxsize);
" S1 e6 L9 B/ D6 U! y}
1 x% y- P) g- t0 `( _# V0 d0 u0 Lint dram_init(void)# v6 Z% z, p" q: x/ S4 z+ k
{5 e& T' P( i# J, B
        /* dram_init must store complete ramsize in gd->ram_size */
) i, v4 j4 j) B2 G9 p5 {        gd->ram_size = get_ram_size(+ }2 r& ~/ ?! r; L& u
                        (void *)CONFIG_SYS_SDRAM_BASE,& u  @- `# ]3 d8 m4 ^+ ?9 z
                        CONFIG_MAX_RAM_BANK_SIZE);
9 D' g+ o8 g  |* t. Y        return 0;3 ~; B1 F! R; X4 C
}: y+ ?/ I$ a+ |7 |6 }

( }/ }- D3 g; A5 T  Z2 W/ _- I: u: J$ e7 }- V, ^! k9 v( J
3 z( t0 t, b3 J4 ~
5 {% ^( X9 t4 Q% i+ H; d
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! p* i( K% c) u! b2 H$ n

3 C6 T! S5 ^' u5 J; q7 d# k  N
" z6 U" F3 U6 ~/ m/ Z" Z% Q+ a' b. r

5 t" o: @1 `; V' \




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