嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! {! x8 K- |9 O7 O+ W  p6 w& ~
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 z* w) U, X8 q; G  |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) l- Z0 A5 D) H" d% ~
0 t, i$ A% N' L) e, [! `& c" ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 f3 V' x  C( Y/ Z' `
( v& Z9 u; b* U, _4 V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 @$ K+ Y# ~9 L# }: L2 s0 Z/*/ z' l' K1 H& h$ |
* Check memory range for valid RAM. A simple memory test determines7 t& z- y9 B: d) m6 O4 V5 ~/ Q/ g
* the actually available RAM size between addresses `base' and1 v# v6 Q2 f7 i  i' a% ^  f5 j5 o
* `base + maxsize'.+ {7 K7 u0 ^3 i+ g
*/( n( ?4 B4 v" g/ k( h! D2 Q
long get_ram_size(long *base, long maxsize)
+ F" q! p. a$ E1 L{: O' Y/ m: \. E
        volatile long *addr;
1 ^5 H% ]. P5 \        long           save[32];
8 c+ p2 S  t. }8 \6 @+ O8 t        long           cnt;& a8 j) L+ m& [% p3 l/ I
        long           val;
) z8 G: N- l$ d6 [# P2 P+ _        long           size;! m+ f1 {5 K/ S
        int            i = 0;) E6 d) {: n. n8 w, F
# G6 c( q+ X) ^  |
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 o9 X) n  l; \
                addr = base + cnt;        /* pointer arith! */) Y5 ^/ L2 M$ S! r  u  l
                sync ();
) f5 x1 @, f/ k                save[i++] = *addr;8 c$ b  b/ r3 J9 M5 p+ L5 m7 d, w
                sync ();
$ {. f% a" u' _1 j3 y; ?                *addr = ~cnt;
! q6 l% _. z% \+ p; N        }
' ]& b0 r& [) r9 `& ?: ^: _. S/ s: \+ }% P/ ?& C5 u# e( I2 Y) \
        addr = base;
" |8 t6 r$ C2 u) D/ M9 J) `        sync ();
8 g! U  s- |$ {5 I. z( u3 E/ N: b        save = *addr;+ L* G4 t3 C5 s( x/ x; R
        sync ();
! u5 P, S- X  F( q" k& H, x( ^        *addr = 0;
( [+ {- z0 `  N% m! L3 o  `8 q  I/ j0 T5 I5 I0 m" s  d
        sync ();
3 c8 O9 o' W. C! W6 M        if ((val = *addr) != 0) {
; D; |+ |4 y3 E# ?3 s" W( z                /* Restore the original data before leaving the function.
, v7 i" H0 K3 ^3 B# L                 */
7 ~, p5 y7 v6 G- B3 E                sync ();5 m7 A$ H6 ^% T" Q
                *addr = save;
* b1 g  f" B9 R; Q                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' l1 M+ Y6 ~# o) f& L
                        addr  = base + cnt;
3 E5 D* C' Q9 m* P                        sync ();
8 g% {2 g: i" V: E: ?                        *addr = save[--i];, Z7 S7 h8 r9 u1 y) B1 h; l; |
                }
" v2 q* _7 M) H5 Q! O$ \, r                return (0);5 o& }9 U4 m! c, L  n1 J9 j2 t
        }
) z! m2 d& P4 \+ Y* c* c0 }' q0 A8 f, i2 ]$ m5 e
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ _# F  p$ {7 C3 ~# o9 o
                addr = base + cnt;        /* pointer arith! */3 Y8 L6 z+ L" j  E, W
                val = *addr;9 K5 F6 t9 [1 p5 m0 v
                *addr = save[--i];
) j- Y+ {; z4 g  {                if (val != ~cnt) {
! d0 E: l, X' F6 d" B2 \$ }                        size = cnt * sizeof (long);  t7 D5 p8 L9 D) |/ L+ B. D0 e
                        /* Restore the original data before leaving the function.
4 l: T9 Z% W4 x2 H6 G                         */
9 b- M( @; p2 A! v, F/ m. p: N) ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ n" X8 ^! `" h1 |                                addr  = base + cnt;. G7 h. g- y! d( c) c
                                *addr = save[--i];
( x1 k' M" W$ {) e4 ~- ]                        }8 l+ H; B/ `; X& L* ~
                        return (size);" f  f5 E0 N* _, ]. S# c! X
                }( P# w; C, n$ n/ _
        }
4 v' `: z# x4 U7 _+ m' C
7 c: f5 k) o6 D* Q2 U/ T        return (maxsize);) o, o$ N  Z: Q3 B5 Q, l
}
% X9 ^# J, ~3 y2 zint dram_init(void)
/ r# s0 B' Z0 q0 L7 D7 c  p{! Z* V+ Y* s4 d
        /* dram_init must store complete ramsize in gd->ram_size */
0 k" m* v$ U6 s        gd->ram_size = get_ram_size(- T" N$ `" e6 x7 |" L' d6 Z
                        (void *)CONFIG_SYS_SDRAM_BASE,+ e5 F0 ^5 u6 `) T' C
                        CONFIG_MAX_RAM_BANK_SIZE);  k/ Z0 M! J! s/ S0 `
        return 0;+ l  ^+ [$ ?, B+ D4 ]
}* |( P$ \- @1 h0 Y7 L/ b
! Y# ?0 y& X/ Z$ o& H
% k  E4 U3 \: x9 @' r5 A  }
6 Y4 f4 v' ~/ e: t

+ U" e& V8 Z, S8 p# z9 \FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: X/ {: S$ B" x
8 Q3 w; g4 J9 s( g0 ~, u
- R2 |/ S7 o- b: S/ z. e% L9 C
* f# t# X" o' o! C- w9 ?( {( W





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