TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) h" m3 F3 W1 y) \" V- R# x$ n# a2 ~核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  o. Q/ s6 B$ f& {这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 c' W  K0 T4 N' V: n
5 U& `; p. Y4 S9 o; H+ K, e0 h! i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?+ c) W! K$ w. k+ a+ y* B8 ?
7 _! U4 |. a3 f0 `! J% w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( I3 V, l9 w  ~
/*/ E, c& [& j/ P4 K# B, J" ?
* Check memory range for valid RAM. A simple memory test determines1 T# s7 e1 S# ~$ r0 b9 n
* the actually available RAM size between addresses `base' and
  |' }  c( g) R5 S# y6 V! X* `base + maxsize'.; u$ \# a  _( z3 y* h
*/$ @8 [' \, p4 a
long get_ram_size(long *base, long maxsize)2 e4 ^: `6 e  [  m# R5 l
{
* N- Y( u3 r$ ?! h. L1 L# E        volatile long *addr;5 L, P" j0 q7 X
        long           save[32];
0 K$ [/ i* U: @( M+ Y& Y+ @        long           cnt;0 L  d' y! i0 P: v
        long           val;. O+ p, y5 h+ b2 |$ M
        long           size;
% ~5 M# L  j3 S- g# B        int            i = 0;$ H5 U1 \6 s2 `+ f
5 O/ K0 x9 U8 P4 L
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. I: B, w' V$ c5 M1 h* W
                addr = base + cnt;        /* pointer arith! */
+ o, |3 N/ E& {. h3 w0 F                sync ();
3 j! G' ^3 R; s$ R4 _                save[i++] = *addr;  E3 x! {6 C8 x: b9 e0 ?* _
                sync ();
( O' W" H2 U" R* ?8 M. `                *addr = ~cnt;
. }7 R. d; h( W. C. m2 S        }3 l3 X. b* _) g) e

% V, Z+ A" n" h- c- D        addr = base;7 q; h/ o& d# t4 R
        sync ();
5 U! G7 p4 b, {& ?4 g+ L        save = *addr;" {1 K  `9 q+ A/ u5 ]
        sync ();! h5 {0 C" h5 z* d! v
        *addr = 0;* w8 x9 k% @: T) }/ a1 H! [$ r- Q
- L1 R2 {2 U0 L% I3 N# p9 Y+ ?
        sync ();( r/ N: w# q  \3 @
        if ((val = *addr) != 0) {# u0 ]2 J& J% g, g3 D3 D
                /* Restore the original data before leaving the function.( S* X1 k. z4 k9 p' i6 s6 x
                 */
+ v8 g# }; t1 {# a# K& A                sync ();
1 i1 Z. N/ K6 t- v! c: D                *addr = save;
5 D" n% q; @3 m$ _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 z/ s3 S9 a7 {+ O                        addr  = base + cnt;
9 N' L: p  h$ o6 x& d( n4 X% H- [3 t                        sync ();
$ H/ c6 A* Y* u/ f8 U( X# P                        *addr = save[--i];
! x5 s) V5 `- Z% M( I                }) z$ J( U& @: M. Y6 g* u& }2 W
                return (0);
4 d" a% |5 O- M) u# g        }6 |8 `+ R/ b. X6 F! W% Y) A
3 a5 O+ q" F2 k3 A/ E" v3 j
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* a( h; g$ E! E6 F                addr = base + cnt;        /* pointer arith! */* f0 e7 p1 X4 k0 s5 Z. u: T$ s: b
                val = *addr;8 ?! n  \% k5 k' ?) B
                *addr = save[--i];
* a$ L' h! i( V$ E1 C) N                if (val != ~cnt) {& H* P( J: t* u$ x
                        size = cnt * sizeof (long);
( L) J& p, l: M! h( }+ F( n4 Y                        /* Restore the original data before leaving the function.
) ^1 u2 ^; D- i. d- `9 ?4 [                         */
. m3 ~1 p* r/ M7 L                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  v6 j7 T% ~+ J) k- u1 ~6 O
                                addr  = base + cnt;
1 Q1 h7 L4 \; F- G                                *addr = save[--i];7 M* I& u  C% Z, m$ T; i+ W
                        }
( f1 v* W% m/ y2 M                        return (size);) Z4 G! n" ?- u; L
                }
  l1 Y, i% g3 f" t: d7 M        }
# a6 z3 w/ t- `1 V
  O( {  q9 ?0 S" L+ B3 Y        return (maxsize);
3 b" e( \5 f9 A9 V# q5 F8 [}6 d7 C, A9 b+ N6 j' T: F' I
int dram_init(void)& H( ?1 m6 y* Y- A
{
- {4 w2 J: v# G( z/ }        /* dram_init must store complete ramsize in gd->ram_size */' L$ v" `3 `; e. ]% |
        gd->ram_size = get_ram_size(
5 N  e8 e# Y, N$ ~$ P                        (void *)CONFIG_SYS_SDRAM_BASE,
( D7 \& C: k0 H( h8 {* V. j; z. F                        CONFIG_MAX_RAM_BANK_SIZE);* j9 l( _* f' [+ }; }; @( x/ D
        return 0;5 W$ b" f! w6 v/ T8 G
}
$ b# e3 B# H0 ?* C; L- K+ ~2 U
# J! w  b0 B; F) p# t- Z- A8 O3 P4 `2 h& _; x3 V
5 @% ?  c, {! w7 o0 Z9 ~; o' g

! M. C# I- n  t3 k) V  FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' w) `9 w4 _4 E# f0 p

7 i0 }% U8 L$ M) h1 A/ \. _# j1 g" n
, ~+ v8 {5 f0 @3 M7 n" y# m7 M
' I6 I" q* I# _$ U5 `
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-23 23:03 , Processed in 0.051279 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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