嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ J/ B4 t2 }! C, k  E9 K+ B* i. T核心板2:DDR2 256M Byte   NAND FLASH 8G bit
$ _0 X5 p0 v! x' e7 {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: X4 Z# R4 S4 u5 C: b

- m( A" c+ z) D/ X$ a5 y, h是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?8 X0 p! X+ D' ]% q+ e3 `
- s% X4 c( o) h( `0 V9 |# X

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  d6 J7 r$ p) Z& t/** g: w1 T4 t: x# `) Z: U$ ^! Z  K7 R
* Check memory range for valid RAM. A simple memory test determines
4 I: a  ~( \8 k6 A- C* the actually available RAM size between addresses `base' and- _2 ~2 g$ _. {* W
* `base + maxsize'." M) g( _( ]' i
*/8 l4 M- _7 x, X, `: j) B; [1 A6 w
long get_ram_size(long *base, long maxsize)9 {" {3 h' s7 g. t0 K$ d7 H# D
{/ F2 I- A' s! A6 T  v3 A2 ?
        volatile long *addr;
2 j( i! S( g; F        long           save[32];
0 \( z+ @. Z# i% s: K3 e        long           cnt;. |* ]6 N% @' Q
        long           val;; `, t$ e; ~- p+ K! c
        long           size;
: f; A, _5 H& D+ c. s2 M2 ~        int            i = 0;
' z8 M; j( \) b+ S; a6 O- Q
) k" g) B, B) k/ R7 ?) \        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) O/ C  A1 i$ n8 D8 {2 [* r: O
                addr = base + cnt;        /* pointer arith! */
; D! r) C  H& p3 a. ?+ q5 s  r                sync ();9 A' I: i. L- I2 S% y: [
                save[i++] = *addr;5 f9 m9 x$ M7 m$ m9 L7 d
                sync ();" d( U2 I8 X+ N* t8 I" _4 G3 I( c
                *addr = ~cnt;# \% q# h, c6 g: ?/ }
        }
6 Q/ e4 k3 ~$ @4 {7 n: h9 x  x0 g- w4 {
        addr = base;
9 w# g$ w8 m- h7 h* b! Z/ ^% v% W$ _        sync ();5 D; I6 n1 [) F; Z
        save = *addr;6 K$ ^& o" L% q- \( d
        sync ();
& L2 s8 `9 m) w1 w1 F; F( S        *addr = 0;/ }/ ~- H5 w8 @/ p

% }% ?, n5 u& N2 W6 `2 I        sync ();  v: }7 Y4 \2 S; a
        if ((val = *addr) != 0) {( M+ n2 L9 p6 _" W! d4 \
                /* Restore the original data before leaving the function.
1 `7 f' z% J, b5 L' I4 U2 A: h                 */. G# W0 X, r0 @( E3 U4 c* h& D
                sync ();
" i1 ]( l, c0 o6 z6 b                *addr = save;1 c) U/ B. _  s# c0 c1 L3 t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {2 T7 e1 t& N5 U9 f$ r  `
                        addr  = base + cnt;
& b0 \$ b* Y4 `, f                        sync ();6 ]8 G+ j( Z  Q7 o7 [6 U: F4 M: E1 ^
                        *addr = save[--i];/ F4 ^5 D+ Q1 l- k8 F' t
                }
! u* v& [: K! n( Q9 e' {                return (0);
- R# T8 L- \" E# ]( t/ {. w' ~        }
0 Y* Y" Z( m- j7 }
1 I3 g8 X* k( G1 |5 d1 \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- J+ F/ l( `4 n' ]7 |% _                addr = base + cnt;        /* pointer arith! */
3 {; A8 d( G! ^1 q/ k7 V% H( {7 J( A" _4 k                val = *addr;) w" A1 ~2 y" u5 A8 C! y, o
                *addr = save[--i];
& D% e; i7 @2 e2 @1 Q                if (val != ~cnt) {
$ F" W3 V. Y" ~4 ^+ g% P1 x                        size = cnt * sizeof (long);& _) c# f. k# E( {, G! C: T8 C/ ~
                        /* Restore the original data before leaving the function.
' n7 [+ V0 w: r$ U                         */! S8 i( ~/ B) [" k9 R$ J. L1 p. O
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ x4 n. z0 A0 e: _
                                addr  = base + cnt;
. \/ e4 D* s9 p- H                                *addr = save[--i];
1 Q0 ]) }! m9 \0 E4 j/ b$ |                        }+ @; J6 H5 p- P$ H9 t/ e
                        return (size);7 G( l: e' t7 Z0 Q( W/ `* {) v+ m
                }
  f+ I# L9 Q0 p( Q; i        }5 q3 e, K, x1 Z8 V: h2 B# R
3 n" F! Y# x) p  l
        return (maxsize);
$ h" k2 F0 Q& `}
" e# G" [' X2 V. {1 `" lint dram_init(void)
% ]8 ~6 c, ]  _0 ], h/ N  x{; l7 x. ~1 Q, S- n) i2 X
        /* dram_init must store complete ramsize in gd->ram_size */
. t! G) B& U4 {0 r5 m$ W        gd->ram_size = get_ram_size(
3 f& ]+ Q& L; A, e! j                        (void *)CONFIG_SYS_SDRAM_BASE,- z4 W- C( H4 ]8 Q$ w; c
                        CONFIG_MAX_RAM_BANK_SIZE);
  v: w( ~! ?' ~) t        return 0;; u5 L9 q* f, t# N
}
: E$ B, j% g- l& I4 {- v2 v5 ^- ^% c: c4 _8 ]* c
. n. M3 G2 y/ \- r1 _

( @+ ?: l# P1 }
$ [1 h9 V) b3 WFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 ^$ K' c% k3 M6 y
( J; d7 I# l( ~* e
4 y% z7 ]" J$ e. _9 y; Z0 h1 K& o
1 G/ e! w. |  s$ O' R8 c# G





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