TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5097|回复: 1
打印 上一主题 下一主题

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 E9 C% Y$ o5 i) [
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 o0 I+ V0 i2 q  N4 G, E这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- b. }; @( f( o. }3 a& ]' c' G
2 ^' k$ P" J2 Q& s$ W$ b9 p7 E
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* K3 S0 Q/ p( D

8 a9 a- X8 w8 H( Y* ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ c7 W& `' j+ t  k# ?
/*( X0 m! _9 X( Y% D" J8 ]
* Check memory range for valid RAM. A simple memory test determines
" T' D" M- m5 W* ^4 _0 i* the actually available RAM size between addresses `base' and% t6 n: O6 i; M, @
* `base + maxsize'.
) J4 Z1 g2 }6 \5 h3 V*/
; ]8 R3 s( D4 Slong get_ram_size(long *base, long maxsize)
4 g- K, x) m+ c1 b  I{; N, p- Q4 J6 U( [6 M) v2 H
        volatile long *addr;: d$ B: \, E5 g, O9 a
        long           save[32];0 J8 U% a. ]9 Y5 r2 Z
        long           cnt;
7 n! x6 v7 c: s& e7 s2 G& a        long           val;! P$ K; U. _2 z% O" ]7 l. e
        long           size;
  x8 t) }' \: U3 V' W        int            i = 0;8 h: M2 ^( I+ d! F3 p, N; A
6 C& w) U4 @5 T* m2 S
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 g" V7 I- m7 I$ @, G/ S                addr = base + cnt;        /* pointer arith! */1 d# b" o) c& y9 Z
                sync ();
4 b' v" s1 d% j2 V0 }' U                save[i++] = *addr;' w6 P" P; y. P% t+ z
                sync ();
/ l1 u' H3 I5 [                *addr = ~cnt;$ v! |) [$ x* g( K$ U6 y- E# I+ P  A' ?
        }
; L5 ]3 o2 A4 Y8 g8 s0 H' P, ^1 ?3 n$ W4 u1 O
        addr = base;
6 k/ W! M) D+ `* E( J$ V        sync ();0 a. p6 A" G3 f) ~
        save = *addr;
% x# @6 a) I0 _6 ]        sync ();
9 ^  a$ y5 Z! `! D7 m5 a! C        *addr = 0;
0 b; A* E/ t$ x; S8 N0 n# e5 r- |5 X. B! E, ~( A
        sync ();8 A- B3 B1 Y; ?# Q, `
        if ((val = *addr) != 0) {
) G" x/ @# B$ r1 k$ @$ P                /* Restore the original data before leaving the function.) `" {1 o' I2 j" d
                 */
& ]& [1 M" ^& u0 Z/ V  t                sync ();7 o' u, c$ G! r% X* E% d3 G$ {1 x
                *addr = save;
1 g& e4 _7 l0 ^1 e                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 c0 w! w- P& Z" c5 P
                        addr  = base + cnt;1 u9 ]$ F/ S( x% @7 z6 }
                        sync ();
  u. d: V- `# r& I5 D, \, }. }                        *addr = save[--i];$ }+ i- p+ D# w: l8 X  o$ ]1 ]
                }; I; a- x. h& H% w2 O
                return (0);; M1 `5 C! j/ e' [- @
        }6 {3 ?4 t7 u; P( R% L$ H

2 c  x0 k, z% g# o  o        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* ~! K3 N- u3 z% j4 Q* k( {& t# }
                addr = base + cnt;        /* pointer arith! */
8 D3 {& d. X2 i2 \* E$ i                val = *addr;6 J1 `8 X# f, i6 m& ^/ d
                *addr = save[--i];
- U- `+ U' q( u7 g                if (val != ~cnt) {; ^& J1 s$ \& y0 a" p
                        size = cnt * sizeof (long);6 y9 R/ |; G2 k, T1 B- h. o/ a+ w
                        /* Restore the original data before leaving the function.+ O# a& _7 g2 W! k3 D7 {3 T( Y5 C
                         */$ m$ L: G. Z. ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, d( L0 n/ A$ `- O9 o& j
                                addr  = base + cnt;3 }  r0 N+ Z- k+ ~+ c
                                *addr = save[--i];0 a: ?+ c+ e2 a5 R# v* f% Z
                        }2 c$ o1 D3 K; l) e2 Z0 p
                        return (size);3 j& w* _( \9 Y' e
                }
  Z" e* u( J, ^: K% Z7 b# |        }5 m" W7 i- ?0 W$ T& m
) t3 y6 [+ }) m  S9 L% ^: O2 ?
        return (maxsize);
5 c3 p7 `, i  `: t. l! O}
8 \' o0 @0 P0 e" m8 H& Bint dram_init(void)
9 U" U0 m$ s+ I{
  T4 M7 @+ b3 g! k+ Y        /* dram_init must store complete ramsize in gd->ram_size */
# n) }7 z% w5 B! }/ W: s. m$ Y4 j        gd->ram_size = get_ram_size(
% K, m7 F8 A1 \  K7 {' k0 x$ x8 j                        (void *)CONFIG_SYS_SDRAM_BASE,
; A" p- C3 j* D: U, E1 L                        CONFIG_MAX_RAM_BANK_SIZE);" V0 N* W$ w1 ~( r1 {; x% g8 _- |
        return 0;1 ]# o! q* _" J% |0 Z
}
7 X' [1 s4 l3 T3 C. ]; S
8 x' O9 o) u* |5 T3 K, _, S) F
1 j" X  S0 B/ Z- Q7 M  `+ }/ B
& i: g; x- e  x- u
) p' m3 v9 e8 a6 F9 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 \8 ]5 {( R9 v% K( f3 ]

5 d7 \% n- V% K' }- w/ I7 C' U  W# I! U- x
! N0 Q! a; c7 a) y
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-10-14 15:23 , Processed in 0.039001 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表