嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 ~( s% j8 ~2 [0 N" y: s
核心板2:DDR2 256M Byte   NAND FLASH 8G bit  ]+ v7 k$ _6 \; k" R9 s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* b1 J- _6 Q: z( m0 n6 {# |$ ^+ ^
# a& F' r/ g1 E) n  Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" F8 K% e) q) t& G. E/ U4 T5 e' k" ]- E% w8 R: ?  K3 B: @1 d* W1 Z

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 c/ V+ V+ y6 M& r. L( B" e1 r
/*
4 ]8 d$ V) S# k3 A# i; D# x  R( G* Check memory range for valid RAM. A simple memory test determines
6 R6 H$ A# D0 }6 n4 r* the actually available RAM size between addresses `base' and. A7 @) a. i: y7 G1 ^
* `base + maxsize'.& `# z  k/ p" r  y4 U
*/
1 C$ X4 \" S4 E% D7 Dlong get_ram_size(long *base, long maxsize)+ H% R: K7 P8 ]8 K, t( C9 ?
{2 R) Z2 F& }& K/ M6 q" ]4 |
        volatile long *addr;
7 T& s& U1 G  M        long           save[32];1 ?" b; G. R; i+ g6 {9 \
        long           cnt;
3 h! o; U$ {; M, c        long           val;5 C+ ?2 _  {4 \% E& {
        long           size;
/ N% f; d0 p( T: ?2 B        int            i = 0;
- Z9 o& g* c% v1 E8 ~2 Y& s. W/ ]0 D* Q4 N
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 E# _. i9 j* Q% e& p
                addr = base + cnt;        /* pointer arith! */+ a( d6 W  J' E  ~# w
                sync ();
; k& Z! `. E. A" O7 `  [& m                save[i++] = *addr;
- u2 m, E- u" b1 s                sync ();
0 X1 u8 T$ n2 \. R5 u0 r                *addr = ~cnt;3 U+ u9 |  r+ \- M' K
        }$ S$ x- `( v0 m

  [' n+ [- Y. z3 A1 \        addr = base;
* t  k" z+ V2 o: _        sync ();
* B% u, h: Q9 T4 }        save = *addr;
- P7 O9 U0 h+ R6 V7 C5 D6 C        sync ();; z: _5 K$ ^" w# w" j; p4 F, j
        *addr = 0;
+ j# z$ F) E# \: S- ?# y1 @3 y+ c: V  ?- J
        sync ();5 V+ z9 t  v0 C
        if ((val = *addr) != 0) {
9 f  i; F, F  U! P2 x, |                /* Restore the original data before leaving the function.- Q9 M, p7 k& j6 [3 r) m( W5 G
                 */7 y9 l" A: a( O! V
                sync ();+ s! E7 _7 P7 z& x/ z$ W
                *addr = save;
4 e) p% E+ Y$ O& L6 W$ Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- w9 m4 K" F" o% @4 x2 ?                        addr  = base + cnt;
- b% r" @' V* F1 v, m- E5 T                        sync ();
8 m0 a+ R% h9 k                        *addr = save[--i];
" l/ x5 \" n4 \! d: Z5 d3 a- G) l                }
* |4 M, y+ l' V; v4 r                return (0);
" _6 j( D8 b4 V8 \4 |        }: v% b" W8 r9 X! f+ |
+ K: I1 M/ @  w+ B6 L0 g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 F8 b4 j* X$ D+ y3 z# h6 ~                addr = base + cnt;        /* pointer arith! */
9 i# I0 {- T% R+ n1 i                val = *addr;
9 F% s) o' s" z5 A% p9 i3 R/ x                *addr = save[--i];4 O" L/ Z0 \6 `
                if (val != ~cnt) {
1 m. [6 s7 A  C( O) v/ q8 d                        size = cnt * sizeof (long);+ ~2 j+ F9 T7 L5 B( i
                        /* Restore the original data before leaving the function.* L# n; Y# ?* W
                         */
8 S6 O2 E8 X* q* c8 T8 \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# w! {% J4 z% y% _% V                                addr  = base + cnt;
6 Q! h% }2 Z. l( c# {/ k; a                                *addr = save[--i];+ j8 B2 X; R7 J; T$ `) Y3 g  [
                        }, D) u0 T  |9 F' j! _. @
                        return (size);
# _# R9 Z( y& V# `# X/ j                }
& A; _: K' f9 c. r1 x( L        }
' I7 m- o5 C+ D/ O  V3 _6 J4 E5 B/ n) f2 o
        return (maxsize);
: U! E  K- K( F3 ?4 {$ |  w2 W6 C}4 }, V) H0 S: }3 `9 V% P
int dram_init(void)0 _6 q! O% Z/ \5 X6 y' b! |' p
{
, s. \. V$ M8 R  C# |# S& z. i% P        /* dram_init must store complete ramsize in gd->ram_size */
% ^/ F7 }% F% [. i6 v        gd->ram_size = get_ram_size(3 V+ W  R- {7 E/ g# S0 P4 ]+ D
                        (void *)CONFIG_SYS_SDRAM_BASE,6 ~! e3 Q- \7 b# h* z( `
                        CONFIG_MAX_RAM_BANK_SIZE);" x7 l5 f3 w4 P4 Q8 @% U& Q: m, q, T
        return 0;8 g/ A  p+ u5 X: U: Z1 R' V
}
% U4 G$ n; K8 e, ^" ?5 L2 A% [9 l+ E) u: D- Q. p/ K* |
1 t/ v5 `2 W% K4 v0 d5 t
- b$ d2 l3 R6 b3 L/ Z
( v( h* o. X5 X' o) d9 P' x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% u6 F8 _; u" g3 a4 \* w

$ B9 H, l- _* t+ X  t+ f2 g2 m2 d1 d+ ]
) }8 v% v: B8 q, D$ ^





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