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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit9 c# F, p5 [% i, v6 V
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 R. C8 l1 c1 n( m5 ^9 F4 |) e这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 m6 @; O, E* `9 H, f2 ?* h2 z5 A/ L
$ r' S5 {# h; ~: b; m4 q9 W9 Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) l3 f2 |( Z! `4 ?

  h: g2 C( e. A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* F( I' N+ d" e. w$ R2 m; g& e* v
/*
2 z# N' M' Y- |* Check memory range for valid RAM. A simple memory test determines
8 W. e5 `, m8 t2 {, s+ |; K* the actually available RAM size between addresses `base' and/ r$ V' R! W; z" P0 d
* `base + maxsize'.8 _3 P6 W& ^, e, {5 n6 ?+ Y) a
*/& s3 z, S+ J9 F$ ?
long get_ram_size(long *base, long maxsize)
3 b( W- I9 s) x% }9 P0 `% y: l{8 J- _" h2 s5 V6 r
        volatile long *addr;
3 Z$ ?7 i* G2 Z$ f2 ^7 l4 e        long           save[32];- ^/ c: T4 [7 q: Z0 H, f
        long           cnt;
( s/ u, b/ K7 Z, |! Q. Q        long           val;
& v' e: _2 o, F        long           size;2 F, a, z( e4 Z$ J2 y
        int            i = 0;
1 \! G6 Y& l2 ?4 l8 a8 U
* L2 ?/ o3 i1 }+ l, G        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, S. I3 S# u2 q: u8 c; N# m2 b                addr = base + cnt;        /* pointer arith! */. X  n( `; V+ M( x
                sync ();
# L8 R0 S$ @  [8 T  `                save[i++] = *addr;
2 [4 ^3 N+ I3 I6 k                sync ();# w9 B7 a! z6 F- W+ h
                *addr = ~cnt;
0 R) t9 H3 l$ `$ N: W        }
! ?' M" y9 {* ^4 P' Y
! y; o  D: Q  F5 c" z        addr = base;
; k% d9 b8 d) n+ o' S% I7 i& K        sync ();9 |4 s: a8 Y  o( ^" D; t5 B
        save = *addr;7 L; f2 g9 M) h
        sync ();1 s8 Y8 [( R' S+ j
        *addr = 0;9 H# F7 Y% l6 o! E# a

& @$ J0 Q; e" _' }( \  A# \        sync ();1 o/ U" A" g2 [9 P& F
        if ((val = *addr) != 0) {, s* c; M6 f% f# p
                /* Restore the original data before leaving the function.
! R( J% Y! Q) w5 {7 t3 P3 P4 g                 */
" X# H! A; a3 u, N0 i& D* w. y                sync ();
& v% Q, R! V. d" {! q/ b                *addr = save;
6 G% q) s9 N2 |# P# t                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 J& j% ]( v7 z1 t; U                        addr  = base + cnt;
/ C  a" {+ f% v- c/ y. p# x                        sync ();* g, Y' G+ W0 y8 Z- o# {; m+ p
                        *addr = save[--i];
/ ~4 V% r9 x$ p2 Y# }                }
- E; N0 E, s- [9 `                return (0);
8 a) Y: a/ I$ r( S  I        }
1 ?: F3 V1 }4 @. K1 T1 R# T9 [/ t, ]7 y* Q+ _3 v
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {) w: d) {4 Q1 t/ y4 X! ^; {) G, _
                addr = base + cnt;        /* pointer arith! */0 e* {. s- R) f, d( V0 K) J/ E
                val = *addr;
* j/ j, O# c4 i- ~' R2 q. j                *addr = save[--i];2 J$ t& v- V2 x5 J
                if (val != ~cnt) {
" M  O" S5 r. \+ P                        size = cnt * sizeof (long);
5 Z6 Q7 j& L. T/ G) I5 V                        /* Restore the original data before leaving the function.& a# A- t% }6 e6 h2 x% i
                         */
. I2 p" N; A; w- u                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: ~- O. U, W0 _" d! n- L$ n                                addr  = base + cnt;
3 x9 ]5 A% H/ ]' E) _                                *addr = save[--i];! S; v& U6 s* f" h1 C: g" b* ]
                        }
9 L# @3 O3 z7 l+ Y. i, w6 ^' S- ]                        return (size);4 J9 s- [$ s' N* G( v  H2 a8 p
                }
9 |9 G; L$ z, n! J8 j0 |        }, p: M, g% k- Q  v

/ b5 M! z2 F: U. h: I8 p  d        return (maxsize);6 F8 `7 Q, V! T, {$ B# Q
}" a+ n# J7 c  w- @- ]9 j: Y
int dram_init(void)
7 v% C0 A) a' L9 Y* s{$ t3 v8 x5 A( K4 h: `9 Y( F
        /* dram_init must store complete ramsize in gd->ram_size */0 |9 N: q4 B/ I
        gd->ram_size = get_ram_size(
" g, V9 c$ ?) p1 B" m                        (void *)CONFIG_SYS_SDRAM_BASE,
4 @8 x& s' N/ U; N6 I7 _* C                        CONFIG_MAX_RAM_BANK_SIZE);
# ?! g/ j0 Z/ x: ]        return 0;9 Q( D% a6 z# a' t$ i
}
3 a4 Q8 p2 M5 N* Q. Z
+ n; N& p. j* {% |# T( D2 O) W. v# j. |$ a2 n2 r9 Z, ~5 Z
* N+ f( q- h- `+ o" P0 K8 I7 a
1 x, ]" j! O9 E& R8 q& x+ E2 [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) Q! K, S: s# O& q
5 q# }; Q; [% [. V1 t: v% \. T- v4 b9 ?8 K2 A1 j: o3 l
) F1 U, E: m! f! k2 Q) u: u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 21:29 , Processed in 0.037941 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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