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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit4 L# P, ~/ j& c4 o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
+ i5 D9 ]& g/ q4 ~5 V! y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 c5 b% B/ T6 l, w& N
. O' X3 p8 M$ Z& c是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% b9 X" ^% Y) b2 C! a9 X
) k9 Y3 n2 F- w" {5 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 b3 o6 u( E) x& |/*6 u- O/ L0 J! O
* Check memory range for valid RAM. A simple memory test determines2 j- P) F& Q" H+ r* a3 w/ f+ {
* the actually available RAM size between addresses `base' and
: a  r, ?) Y7 K) j+ K; ?* `base + maxsize'.
- y* J  O% t+ _1 L" v% r: T*/5 {4 H9 j* z7 z7 E) N
long get_ram_size(long *base, long maxsize)
' E$ b8 k' h) N/ i0 C' C{6 G4 ^3 \. ~3 j
        volatile long *addr;
0 Z1 Y. N9 c* f; ]        long           save[32];# J: B2 I: J& N( F( T! X  p) l7 D% f
        long           cnt;
; y$ c8 d7 S) H( B) G        long           val;$ t% \5 U0 l+ w5 n
        long           size;' o" i. p& F" Q) ~) v
        int            i = 0;* F; r" H' v0 V) I' m  l3 L
; X+ J2 \/ _. Q4 C5 f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {& _( w( {  G8 M) [" m( j4 K
                addr = base + cnt;        /* pointer arith! */
3 K, x  ?/ l; H0 |                sync ();
+ Q5 ]7 a2 T7 X% [. \( y5 Q4 ]1 \( k                save[i++] = *addr;% |( i* j3 \# H& v( o$ F
                sync ();$ P& h0 m% q; K/ Y+ g
                *addr = ~cnt;9 W" W! z9 Z( A+ _) [, g- J
        }
) t+ W9 p4 t5 a7 |
' v: I' p" p% R9 H% T) x        addr = base;" T4 E! ], G. t* F0 q- A6 k, W
        sync ();# H' x0 U& j7 b5 b
        save = *addr;
" Q9 O8 }- t8 o9 U0 f, K- _5 e        sync ();; c" e2 }' r6 C( _
        *addr = 0;
5 M" h0 k5 S' T) \" @
; w% O$ {. d) }" |# ]6 g        sync ();& K/ m1 [# K* s" t6 P0 h1 t
        if ((val = *addr) != 0) {
! q# J% u% U$ Q, }* v7 V* q                /* Restore the original data before leaving the function.6 D  n" e( M/ r, {# c
                 */. s! k. N% {; i6 n* A
                sync ();) E/ I; l. M3 i) V, c* R1 O
                *addr = save;: k+ @& ^) t& d! A( Q6 q: l7 Q$ |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# Q' _/ w0 r/ }% K# S4 V                        addr  = base + cnt;
- V" t& U4 }3 o5 U                        sync ();) [$ u" Y+ p+ l( E
                        *addr = save[--i];
8 d4 `% @) {) r* ]+ }7 h$ {& i9 K                }
+ c0 e% u0 O* l# Z) ?! |' g                return (0);
8 _* G$ J- r! S        }: j7 r0 L2 e3 d3 O6 r

9 F3 A8 I( ]  X; ]        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. }7 ~5 p- o( [4 c, F' {! n1 ^
                addr = base + cnt;        /* pointer arith! */; N: _3 F) |( u4 b
                val = *addr;
& O  a" Y; `& j                *addr = save[--i];2 J2 b$ v2 h( l* q/ g$ Z* d  Q. W8 E6 T
                if (val != ~cnt) {
* ^4 i& B/ w1 y5 O                        size = cnt * sizeof (long);3 \; E8 q9 q; y8 t+ N
                        /* Restore the original data before leaving the function.
6 K0 K( h, C3 O. {                         */* s) y% w9 m2 y; L+ V6 l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* I% A$ D) s' b+ y# q6 S
                                addr  = base + cnt;; J5 [  i8 F! k
                                *addr = save[--i];
! n2 I  _3 a8 f' P8 y                        }6 g7 W* |9 \7 _6 `) \
                        return (size);
: I% M# m- m$ |3 |- A                }
6 ^* g4 w* E& Q" E" \' B        }+ ~3 P. c- {' ]* }
5 I/ ^7 h2 j/ L  l
        return (maxsize);& v( z3 a4 r% o
}; R6 X5 V1 X. W9 Z& a9 |' e3 J
int dram_init(void)$ l3 n/ D  T  K
{4 B6 l. i/ Z* c! _8 ~) @
        /* dram_init must store complete ramsize in gd->ram_size */
- r$ q1 [4 l7 U        gd->ram_size = get_ram_size(4 W+ e5 k* u8 P! u8 S4 U3 D
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ g/ R  J+ j1 h5 C/ q0 ^6 f' \                        CONFIG_MAX_RAM_BANK_SIZE);
2 y1 C! }! M- X' l        return 0;
% @% S! O+ y# g5 W0 G}
% [  O  j# [" k+ z
2 F  Z. B* U( E: J! L6 L6 p& v
! R) t# y' A$ u4 b5 f8 K
& o) ~2 V9 o/ S, {. h# @
7 a1 J$ i5 B' mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 ], Q. Q" y$ O4 C- A2 F
6 i. E& d' y( q, ~# p: i+ b9 y) c+ _5 U4 m' U+ ^

! T* m3 ^" }: U9 [; W2 b" C
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-19 00:19 , Processed in 0.039643 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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