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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# n2 K. c) a; ?  y0 M, a' z( s
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ o5 r5 T/ y, T$ }9 @+ T" A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ B4 n9 J/ Y. r4 Z" W  f! S
7 I; }* }- o, |; H& y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% T& n, Z- Q* N9 b% F% _; b5 U$ j' I5 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:" o. \6 }, V- v5 i6 i
/*
  Y. c9 T6 D0 ^: x7 d* Check memory range for valid RAM. A simple memory test determines) C* V: z$ o, p9 }$ Q/ g$ A
* the actually available RAM size between addresses `base' and) S* e# R" N! w
* `base + maxsize'.
' Z5 R  ]2 _# l$ P% u* l- {/ Z*/1 s' c! Q* P* M
long get_ram_size(long *base, long maxsize)
9 N+ y' b) ^2 ~+ [- f{
* z3 ~0 E$ f, i) G2 i6 M# \        volatile long *addr;
7 v3 E8 `7 a1 q8 @: n$ \        long           save[32];
& q- L4 C" \8 l        long           cnt;
8 p3 X$ C  ?$ X        long           val;
0 v$ s+ P: z! q( \        long           size;
8 m+ v6 i5 y# R, E' W: A: I7 G        int            i = 0;) D+ T7 Y% w) q' O2 B
7 o$ ~9 v. a% P) ~7 a
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
  F7 S* R  _" k3 y# ?0 L8 a                addr = base + cnt;        /* pointer arith! */
2 H' P  S1 h7 a: _5 t                sync ();
# g. [/ l) v9 ?$ S) H; ^% f3 W                save[i++] = *addr;
+ \% Q9 {! {' ^: u, Q9 v                sync ();
) j0 U' W2 i3 T2 H, P. ~" m                *addr = ~cnt;
# S4 W; }2 V! T  L7 ]4 t        }
( d( A% _2 R- L+ ~1 K% \6 `) w: O/ O4 E+ ?9 J8 q5 ?* \
        addr = base;
9 y/ o' \6 A: K) \        sync ();
" e$ f2 n8 `- j5 E5 H3 A+ @0 p        save = *addr;! j0 }" o5 |$ t( w* J* v( j6 u! X/ p
        sync ();
; N$ H* ?% ^; z( q. A3 |/ a        *addr = 0;
; S0 G+ h/ Y! Y
8 f- w* k! O) O$ a; v8 z! W- B        sync ();
6 @0 |- P+ V  K+ d8 V3 Q        if ((val = *addr) != 0) {
6 ]/ u; ?( }8 l                /* Restore the original data before leaving the function.
0 \4 s( I  W0 ~: _2 Z( H: r                 */
7 U$ D: q" Y/ Y& ]  M+ a                sync ();6 V% \  `& r: {! v' S1 A
                *addr = save;
. g* a; Z- F9 i5 }2 T  F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 j* B! a8 o$ q- `3 }: `; R
                        addr  = base + cnt;
/ N" O! `/ W3 w" D5 k5 P2 X                        sync ();' H# @7 S# R& A/ |1 T, {* T5 \
                        *addr = save[--i];
3 h. R' @3 H2 P9 ^  W                }9 Z& T  u2 d9 r. O) R0 d- k* k) A
                return (0);
, ^- }5 Z; ]: G& o        }
# k7 ?! z+ c4 B8 G: ]! h
+ h5 `# s( `3 f% {+ ], b- p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 Y( q7 V0 k  P                addr = base + cnt;        /* pointer arith! */
" C6 {! i4 L/ X0 D  t6 \9 X                val = *addr;4 K" c! ?) Q6 J/ J, G
                *addr = save[--i];  `' k  l# p% Y
                if (val != ~cnt) {
1 b  H! v: J) h, c2 j1 u: U                        size = cnt * sizeof (long);5 ]  F: ?: z4 k) e  `) y! d" @1 R
                        /* Restore the original data before leaving the function.9 T7 P* V1 T' L; p. j9 X
                         */
. |7 Z3 V4 [6 `. g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. g  x$ p6 |( m9 j
                                addr  = base + cnt;
! ?, ?+ w- M* ]) V7 Z. s                                *addr = save[--i];
. V& H! s5 K4 Q8 p7 B                        }
4 o- t5 T5 A+ i7 d# u$ `                        return (size);: W4 S. A$ t4 a
                }9 N! x6 j; g0 Z" d) l
        }0 O# S6 q) _7 Z7 q3 l" e

; t, B/ e% Z, I( U+ l        return (maxsize);
0 s' T8 R4 Y' M) a. ]}$ k- T, v4 B; m/ a
int dram_init(void)
& c, f- e7 X$ p" i( ~{
" M6 W$ _$ |1 ^4 o        /* dram_init must store complete ramsize in gd->ram_size */: R8 ?! M( U. v' q* ]4 g( U" X" S
        gd->ram_size = get_ram_size(
9 h7 q) {" |% r8 Q- v& ~" B) |/ A                        (void *)CONFIG_SYS_SDRAM_BASE,
% V$ s  ?$ K! {" e                        CONFIG_MAX_RAM_BANK_SIZE);# _9 U3 C* Z8 R, j' e9 z
        return 0;; X% {* L' t$ t9 W+ Q
}
/ e- s7 b, D3 `4 W7 K  j3 B
1 h8 T4 [$ v: B
) h# x  X) o+ `& F, C6 \
' U& s' K) S  }; D# Q( X4 Q; z& g  t- d! G8 O' x5 [0 x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! G8 B7 Q3 s/ o+ I& q2 j0 q" F) X
0 F  z* U$ Q8 N* D  m6 j! j8 B6 `
; i2 o. G7 o0 G0 T0 T) k5 ^
2 g' H0 t. E8 C1 y8 P, l- _/ o
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 06:52 , Processed in 0.039258 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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