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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 ?+ q3 q7 r* R* V& c6 V0 m
核心板2:DDR2 256M Byte   NAND FLASH 8G bit: h( _% C" B, S1 T" \. r, ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 X8 f3 i7 y( P) f( O1 N& w
8 \  ~9 w( C, w2 O* `) d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 N) f/ u& e. m; w+ m" ?& V9 m3 w
+ y5 K" h/ Q, c9 O# x# }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& l; i2 j2 i- f' Y- Y1 W9 W
/*$ P% g% w2 x# L+ H" J! A
* Check memory range for valid RAM. A simple memory test determines
& J2 O: R5 h2 D. H* the actually available RAM size between addresses `base' and* V7 x- c( M; V
* `base + maxsize'.- Z" u; S# E; c; c0 x
*/1 v3 f! l: M* a
long get_ram_size(long *base, long maxsize)( [  H4 D% R* F9 E
{' Y9 W$ i: \7 k* U- b& @! d$ f
        volatile long *addr;! j7 H/ Q8 ?) o5 ?
        long           save[32];
& g/ T$ U2 t+ a& H# Y2 W4 _/ g: _        long           cnt;
6 z$ a9 q! H1 n5 N9 V        long           val;$ ~5 m9 E( b  b7 H1 h- s% \
        long           size;% L0 x9 ^+ \' l* n! |3 j0 z6 }* i
        int            i = 0;
$ k' D! s0 P) q7 i7 o* }& R1 o) k
/ V  s$ _8 h  b0 y7 h9 ]$ j        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( [9 e) R3 o. [1 X- n! ^
                addr = base + cnt;        /* pointer arith! */
$ ?  Y+ v/ N9 e0 F1 R                sync ();
' R# v5 e- r/ S) Q                save[i++] = *addr;
* D: Y( Q6 n5 T3 R) L                sync ();
3 |& K! g7 Z0 h                *addr = ~cnt;# M- z% u/ k; r& |
        }
7 }& I  y; W6 X6 P& I1 M! W) o3 \1 T  H. W
        addr = base;
+ a3 m5 F8 @4 V- U1 `8 l# G        sync ();
  u- u+ V- \: P$ F        save = *addr;
& {" w2 j( W4 V! v) h        sync ();
$ ]$ @, s0 M5 p9 f8 j        *addr = 0;
: ?0 T; f+ A6 U' }( `' ]3 `1 W* Q9 X
        sync ();
% f. M  m% [2 q, x        if ((val = *addr) != 0) {- S! h+ C- p" t  ?* \% N% m4 ?/ @. ]4 \4 h
                /* Restore the original data before leaving the function.$ G& d# ~0 L/ r6 ^2 }2 V0 |2 [2 F4 J
                 */7 p) z" G" S+ q& @0 e- [
                sync ();4 |$ D' O1 V' t, j7 Z# B
                *addr = save;
1 U- |- y& X  i" w9 P6 U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- H& C$ a# l* t0 }" r. b# e: Y
                        addr  = base + cnt;0 P/ k/ g( ^# ^
                        sync ();
& J$ ]- U; N  T3 [; t& q6 H                        *addr = save[--i];* D- R" I7 O' Q( y4 \
                }7 i* m3 p/ a# f' R3 j
                return (0);2 g- x# T4 p9 B5 J
        }" m& m& g& m( p; L9 Z# G( a/ `, k

2 M5 O. S8 W+ W; x2 t$ ?+ I; ?        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. z$ e2 b$ y5 p9 Z( K- H                addr = base + cnt;        /* pointer arith! */
3 S6 v  }" h$ z! D, U0 V                val = *addr;
- O; ^/ J( x; o                *addr = save[--i];* R$ ?) w6 M6 B( k6 j  M
                if (val != ~cnt) {
; k! _4 T0 ~4 H1 N3 I( v                        size = cnt * sizeof (long);
0 {+ Q" o3 J6 C: s) s& h$ H1 h4 a8 z                        /* Restore the original data before leaving the function.
( e' v4 p/ @0 j. s' F' N+ ?3 J                         */; n6 r+ ]& I5 b+ ^3 d: {* i7 X
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( c) i! ?; Q! G& t
                                addr  = base + cnt;8 V: A* ?( _' O% c# g! `, G& `" V
                                *addr = save[--i];
9 y% Y, d2 @' P                        }& i3 s, J! v5 [6 g; q, Q: t
                        return (size);" b3 V. }( _( W6 K; U; C
                }
5 O/ }$ a$ P- I) @; R( {        }
% k; {4 D9 M0 d
! u6 f: e4 L3 T, I0 Q        return (maxsize);8 z. @. t0 f4 y+ \$ i. a
}
6 T* g3 E, D2 q" o/ Fint dram_init(void)
5 J$ f" {& r! C; ^# M) u6 f{
, r0 n2 Y3 [2 J, O        /* dram_init must store complete ramsize in gd->ram_size */
3 [- G% t6 C* @8 n/ \" K6 \        gd->ram_size = get_ram_size(4 I* y& v; o; z. {/ u$ N& v
                        (void *)CONFIG_SYS_SDRAM_BASE,
7 h# I: c/ X. q* L( O0 U                        CONFIG_MAX_RAM_BANK_SIZE);3 K7 w, t; M" [, K, t4 u+ h
        return 0;9 G% {0 x7 _1 }" d
}
: |3 H8 z7 A: Q" b( \& J  L
- I4 B1 P) y3 T" E' ?  j
4 K0 @3 N: U# `8 n: K- t6 T* C
2 D# y0 b7 K& O9 F! F
. s, v: I4 C6 A. O& a) EFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& Q  @, Q3 \' t# |1 X- `' Q) l' B
/ U& z: e( h- u' L; L  |% P

2 J, L8 D9 X! I1 @* y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 00:07 , Processed in 0.038373 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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