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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
( f' e) K, r: E核心板2:DDR2 256M Byte   NAND FLASH 8G bit9 F/ H) G* H) ~5 x' R8 K; O5 `* ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 ?* I& O: d) W
/ ]) N! l: M4 {( _是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- s$ x) n& }, `* H) E" _+ }

* N. D! Q7 R; J$ }! r2 B- V$ j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) f9 O! k. d& \  K3 _2 u
/*
; J7 O; K) |  F. K6 O- k* Check memory range for valid RAM. A simple memory test determines* [; O+ I/ B) f* @$ i% x( q& n0 M9 ~6 b
* the actually available RAM size between addresses `base' and  }% ]2 ]  ^$ u, }+ ?3 h% {
* `base + maxsize'., J9 i+ y  Y0 ^+ I% w" g+ j$ D
*/" G9 {: D7 ^: d1 t& h- u+ w3 C
long get_ram_size(long *base, long maxsize)
) e! n& H6 n/ p4 v* Z{
) x9 H& s7 w' k/ ~$ M/ S        volatile long *addr;- w6 j- G& O  y' x  f; J) P, G
        long           save[32];
9 W3 X  x4 Q8 E9 j8 ?1 I, C; Q- ?        long           cnt;0 k* r  }; d4 n+ k% ^! c
        long           val;
! `7 ]% c% _% N$ T% t: P        long           size;
0 Q& v& J7 Z' H& t( y8 E; l        int            i = 0;
- t* C  q% ~/ y7 u5 K7 t  y
% z# q9 c! f2 v: P* t( H        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 f7 x6 Y9 b  P+ c/ s                addr = base + cnt;        /* pointer arith! */
9 ]+ a+ b4 {$ z+ w; P$ t, _                sync ();8 C' T- [8 t7 N% ]
                save[i++] = *addr;- F, F9 A+ d- e2 l; u* t  A- M' L
                sync ();
5 K. n4 {; K" D( a7 m                *addr = ~cnt;
" {5 X7 N7 s5 Z        }
% d+ Y0 o$ P5 [
1 t5 _3 z- S2 P/ j* i; w& `# w& c! P        addr = base;" c6 j, b) ^, s7 {2 M
        sync ();
: Q7 {4 p2 \. c* i  D+ j+ z        save = *addr;
% T5 H9 s% l" h7 w" u& e' {* y* h        sync ();- ?1 O- [! _* R# A
        *addr = 0;0 h. ?8 k$ p" `. n. J

+ p: R$ ?) Z6 S5 ^1 j  {- H        sync ();
8 q6 m0 N- ]0 c8 g+ B5 E        if ((val = *addr) != 0) {& {& y/ ]$ y; P- v
                /* Restore the original data before leaving the function.5 Z1 ?7 \# t, ^; Q5 w
                 */
4 H0 I$ X0 @0 u5 x  z: T0 `& o                sync ();3 k$ x% [. v0 W2 w2 I1 r( B% d
                *addr = save;( h; O5 I" O7 k% u+ s$ h7 _, P5 O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" K9 ~# ^- x- f$ o/ p" |                        addr  = base + cnt;' Y1 S" K+ M8 `* H8 ]; o
                        sync ();
- _# s8 [  Q+ O( u* V: N) i                        *addr = save[--i];* x0 T6 ]5 g9 E: X0 Y
                }
! a6 c4 v0 i, c                return (0);5 V! h. E% [1 ^+ H( V
        }; K6 [4 g# Q) @- I6 N# Q
" s, i+ e5 p, W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% B! _9 ^+ G( \1 x
                addr = base + cnt;        /* pointer arith! */
0 P: m0 M: W9 z8 }( ]% B# ~2 c0 n* U+ x                val = *addr;! G6 p' T6 a0 R: g
                *addr = save[--i];
5 a& Q# o/ J! k( w                if (val != ~cnt) {
4 ^3 e' H# ^* U  K& P" r  W0 D6 m. F                        size = cnt * sizeof (long);
, C) C* T/ h4 C                        /* Restore the original data before leaving the function.
1 m8 X* `. ?+ P$ p+ S7 w- J0 ^                         */" J( Q# ~3 n! h# N- G- H
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 l0 X+ O( J! f
                                addr  = base + cnt;
0 ^& K+ f- T' K                                *addr = save[--i];  X  S  [; e: t! g8 {5 |
                        }# M9 g1 B4 L0 c% ?% i% C; c$ f
                        return (size);! t2 W3 b/ e4 ], @
                }
- n/ d/ j% r6 n8 G/ a: n- m- j! {        }
" W! T8 X( k# Z
$ N: H! G- l' r0 t3 W8 P        return (maxsize);8 d" m5 |1 C5 j/ k% l  E- _0 }
}! ]* {) ~! s! a; Z8 @' d( L) w1 x! Z
int dram_init(void)
, V$ G! z, T. e- p{
; a8 V$ E1 g" t7 w( h        /* dram_init must store complete ramsize in gd->ram_size */
8 _& t0 o  w# L        gd->ram_size = get_ram_size(/ g2 U3 X% a  {' X! H$ A, E. t: f
                        (void *)CONFIG_SYS_SDRAM_BASE,! ]" g! c; q$ N/ _9 v
                        CONFIG_MAX_RAM_BANK_SIZE);
' l( q: e6 M) w- m9 T        return 0;1 q' b+ G' [4 L$ [' R
}& Y8 m  Z, M1 O' h: m6 R0 o+ \$ `
" I3 f/ X  k! x8 G' n
" N% S2 I# w! M: q) b' r
4 \/ ?8 C) y6 v
* j3 d& G! g) t' L) ]% g' c( @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; V5 M6 ^  u9 K' e& o& m3 A4 R% t5 Z  M
! [3 z. I* \" _8 ~7 G$ h7 T

6 T1 H3 E0 a# V
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 16:20 , Processed in 0.037633 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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