嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* k) |3 J; R: c& L  m7 T
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# Z5 R- ?3 Z) Z( ?2 f6 n这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# \) x. p; ]* J) a" |. S5 C1 b* P% V# T6 D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 f9 B# O* h% w& R" E# t1 ?
  F7 w/ ?; }# ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 q0 i7 G7 s7 [! Y
/*
/ E) B* [  V! i- J4 L! D$ M8 k( q* Check memory range for valid RAM. A simple memory test determines
7 V, ~8 @1 J5 s4 d8 ]* the actually available RAM size between addresses `base' and
$ L8 v+ H8 b4 J9 J! T8 G% ~( ~4 q* `base + maxsize'.
: G  r9 W2 Z  q& I0 V9 j( Y( v$ U5 ^*/* P9 o+ I7 P; h" u  p+ Q) \
long get_ram_size(long *base, long maxsize)) }# w2 u6 x9 P8 b: q$ H
{# y# I7 m8 e6 [. t- d# j
        volatile long *addr;) j  c8 t3 I3 s6 j! a  A, _3 J
        long           save[32];9 @- W: e! |4 L1 S: ]( L
        long           cnt;7 f6 ?% L2 `) R# U9 d
        long           val;
! N# C( w9 q+ R! Q8 ^: C" t& P) L        long           size;, K( t2 i/ G  F: l$ m
        int            i = 0;$ W6 G; _6 m7 O9 ?- ]+ v& |3 q- V
1 Y+ k  y8 ~, Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 ?; R3 T, X, S! g                addr = base + cnt;        /* pointer arith! */
' H+ R# P6 R  D% _  J) B( s" c9 k  Y/ {                sync ();
4 @* t* H9 C. q- c                save[i++] = *addr;
# ]9 N0 C: c, B4 I                sync ();' v) }# {! _  G% s( _
                *addr = ~cnt;) t/ {) ^( K( n, g* ?
        }( ^" [# [6 ]6 \( z+ K" H7 A

: r1 h- ?. L% F% `' y        addr = base;
: L1 w' R0 _. O" e, R        sync ();
. D1 G) |! \0 S/ L- Z4 K7 d: E        save = *addr;
+ ?3 k. U4 h  Y  c        sync ();
8 ^6 ^* {. V3 m7 b        *addr = 0;, Q+ U  {  t9 S  h

4 s) @$ ?) J9 Q$ F3 q        sync ();4 t$ {# w0 q0 H& S
        if ((val = *addr) != 0) {: f" f2 ^5 @6 z
                /* Restore the original data before leaving the function.
+ A5 @' E6 e" e; M3 L! g1 B$ c                 */
* Q% h* s& Y* V  R                sync ();
( ~: M  Q5 `( F$ x" ]1 ^: n$ k+ S                *addr = save;
9 ?$ V7 f$ e% ]* r                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 \- S4 E* j& F0 X3 s6 E                        addr  = base + cnt;, t  s! ^; r. t# P8 N# W
                        sync ();
5 [+ W1 X9 u) X  N" K# Y8 B/ o                        *addr = save[--i];/ [; Y5 G' q: a6 ~& t5 E4 S
                }+ r2 r6 [5 I; g. _: E
                return (0);, h! I  l$ \, x6 @
        }( D7 Y- u, X5 v+ m

$ H! `8 N- P+ @! x7 ?        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 ?, j( \$ Q6 u  Q  h1 ^- t                addr = base + cnt;        /* pointer arith! */$ @+ P' N4 d0 s8 A6 g1 k
                val = *addr;1 P( g- E" B6 @
                *addr = save[--i];
# m7 Z/ H2 j9 n; D+ P                if (val != ~cnt) {3 g$ [4 `; f: T) [1 R) |! y" T6 r
                        size = cnt * sizeof (long);0 P# c6 w3 c* [
                        /* Restore the original data before leaving the function./ Y1 \. S  q( {$ K# `& \1 S
                         */1 }/ ^  K" S* O. L! K* e' I
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, z7 x" T& k5 Q$ v1 I# s                                addr  = base + cnt;
8 b& x" X6 n: j0 y/ ?7 c2 A& h                                *addr = save[--i];& I& [. U" e2 ]6 Y* s1 D- C
                        }
0 f9 s0 y/ H, k( L5 t6 p  Y' o+ X                        return (size);
, h+ y: u  i! n, K: `+ @. S                }
8 u9 H& R1 z8 H: L: m' m0 ]4 ]. J        }
) N: K8 r. d, F+ l, W8 C2 _$ D: ~( k  q0 V+ ~
        return (maxsize);, H3 U) h* f- o
}
6 e9 Z+ `2 |! v7 f5 Xint dram_init(void)
& d$ b8 m+ T* q6 N( j{
! p) s4 Z8 B9 f' |, {6 ~" e        /* dram_init must store complete ramsize in gd->ram_size */
/ M; b+ L2 P# e; M        gd->ram_size = get_ram_size(
# K" I/ d2 R$ E                        (void *)CONFIG_SYS_SDRAM_BASE,( {; ^; m8 N" ]. R2 k1 J  x
                        CONFIG_MAX_RAM_BANK_SIZE);3 b: p1 J! s0 f+ B/ \
        return 0;
' s( R: }7 j7 w; t/ e$ M}5 a' p& S* d& `
# [8 ~8 n6 R  b( o9 Y6 c

% z5 Z; Z2 y5 Q6 ]- E$ {' ^; i! c, y) S
) E7 Z, [  o) I' U6 L9 W( l/ V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 c9 B# \  ?1 J6 N  @
  }9 ]% B5 D4 j8 o. X/ \+ l) n# Q
2 i3 ^  P8 {8 i7 t8 b
1 v3 q5 B) K& |





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