嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. b! b' R6 a; c2 ~" x核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 |8 E/ z; G# O2 ~9 R# I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 t) i( R' s7 N2 [- ^' l
6 F$ _/ n$ _$ I, X( G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ C5 E7 F5 [8 h# b" H

  I2 x" w" Y8 t  I, g
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" H( X3 L4 }* l/ o/*
9 w5 @( H( F6 j' V* Check memory range for valid RAM. A simple memory test determines6 f, l: E" t/ Z' C
* the actually available RAM size between addresses `base' and
4 X) c3 J9 l8 J' }: D* u" z+ m* `base + maxsize'.! t! a8 ?  K' R4 P/ M% z0 f/ a
*/
3 h- K4 T! n( P; k6 E5 N0 s/ [) wlong get_ram_size(long *base, long maxsize)" C$ L: v8 O! \2 h$ \: q
{
0 }( O9 I# S, t# b& \        volatile long *addr;
) t; ]4 @7 p; z        long           save[32];7 D3 ]6 Z8 c+ D3 M
        long           cnt;
3 I  S) d, Y3 t2 G0 h' `" g; S        long           val;
& ~/ n8 `7 G7 Y7 k/ J        long           size;9 }% C/ J+ C# r( v& D! A9 C
        int            i = 0;
7 Z4 Z, F4 \# J( c; k+ _9 A! A) l/ B7 A% p  f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' x8 ^% m- @/ c/ J) h4 B                addr = base + cnt;        /* pointer arith! */) K# E! R5 m  _0 T% P2 U
                sync ();
1 t) N7 b7 ~* k7 H+ [5 w: O                save[i++] = *addr;' }$ Z. O9 }, A) `2 i& U1 ?
                sync ();
7 J* g; V! F9 y# O2 @1 u                *addr = ~cnt;$ g: ?3 T: w9 K0 i
        }5 b7 V0 O' u" b! e& G3 w

; a; k3 Y* P5 ^: j+ E2 H4 {  N/ v. C        addr = base;) c2 p( O% _5 v1 _: t" i) M
        sync ();6 }8 @* v) t! H0 P* j5 Y) }; ?9 I
        save = *addr;
- E5 P1 r2 z  x5 e  A        sync ();/ ]7 L( A' w  G- E% A% E
        *addr = 0;1 y/ s' w! m. ]4 R/ J
, Z# {9 Y9 X- t7 }. m/ @, z
        sync ();
5 L" m5 `& |" z1 t6 B2 R- i        if ((val = *addr) != 0) {
) P4 H' m  z1 l: ~                /* Restore the original data before leaving the function.. m( V5 |3 H% A# ?$ H% O
                 */
, w2 z" {8 t8 h7 Q' h9 q                sync ();
1 `* d$ E+ t  ?5 r% d3 r# B                *addr = save;. \3 R/ ^" }6 [+ r: G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {; X# w4 j' B9 P& y
                        addr  = base + cnt;& `. H  P/ ^0 k: B1 \. G2 D! x0 x
                        sync ();
. A: G. q$ S7 X7 c  ?+ h                        *addr = save[--i];
8 \- O8 V) x  I4 b, Q7 C                }, _1 e8 C: K) W
                return (0);- a3 p8 a6 X: Z( E
        }
8 V- C3 W8 n# Q( O$ x" d
1 ~$ n" {1 M! v: y# J, M" V% O        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& m! g$ o3 p* p# M( ^) w( Q
                addr = base + cnt;        /* pointer arith! */
8 z. G$ {+ j/ [0 G* P* y( l                val = *addr;
# X/ }) K9 K+ P4 G- ?" ~7 v+ c                *addr = save[--i];) ?8 U4 G( e* h( \& F
                if (val != ~cnt) {
& n# k0 f$ p8 ]2 i6 f/ Z                        size = cnt * sizeof (long);
: `- S" j8 F7 J                        /* Restore the original data before leaving the function.& \* a0 h4 s2 I% B; }' W; M
                         */
3 W8 V( o: r7 U$ ]9 b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- w" Y# g) @6 }" Q4 s' t                                addr  = base + cnt;
. K. x0 O6 q* f- x% J                                *addr = save[--i];
+ n# K3 h: Q9 F" [                        }
* \0 k8 m% H8 [; N                        return (size);
! X; v7 R: h" t5 v! T2 H7 ?                }& _3 V& w" |  j" Z+ W
        }
: V" l7 e3 a" M9 j/ q+ n
9 J& }9 m4 K5 w0 a        return (maxsize);7 V0 L, {5 F* K. \# A$ W
}
$ V' `0 N, M! G; yint dram_init(void); g1 a) @) V% _# ]: k: Q
{6 o+ \8 V0 K# U# z& K
        /* dram_init must store complete ramsize in gd->ram_size */1 a$ {5 @' C  P! Z. Y( j2 z/ I8 L$ G
        gd->ram_size = get_ram_size(
) `& a' C7 a7 E                        (void *)CONFIG_SYS_SDRAM_BASE,: j* E! O5 t8 ~/ i& X5 \# R4 u# G
                        CONFIG_MAX_RAM_BANK_SIZE);
( M* q5 m0 Q- c# V% @; F5 B        return 0;
7 I; d/ ?' i" p1 m" g- p" B3 ~2 ~}: ~" [/ X, ^/ Z% Q+ r

- |/ W" w6 G1 Y1 D* w8 |1 Q1 s4 L- |1 O9 ?: E! R; J, s2 O
: W- [2 P5 X3 ]$ f: o

1 h' N* P, U& f" X# `FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 ~$ o) x& r! A/ m
& O2 A( e; V  N: `8 G8 M8 g9 Q
  N$ w. Q1 r$ L0 z  g% M

' L7 [* l8 |; w




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