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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. l0 R" x, ^$ ?+ J% o0 p4 d7 C核心板2:DDR2 256M Byte   NAND FLASH 8G bit. F) ~2 ~) ~2 V! `5 O! w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! Q$ V; l2 ?- i* ^
# B4 d$ X* p  z2 I  s是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& U9 V) H% n/ f$ x% h" m  q/ Y4 i9 E
. C8 y! a+ ]  b; w4 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ c' N' x! ]' {, R$ K* ?( H/*
1 o9 [" K( S0 y9 N* Check memory range for valid RAM. A simple memory test determines
& ~6 p* w) Q0 V9 ]! ]5 Q* the actually available RAM size between addresses `base' and. D3 u( L1 f& P* s& y/ g( ~
* `base + maxsize'.1 V7 [8 i( o7 D" x8 }8 k
*/$ \) E  u; ^/ Q6 e( ?8 Q' O) f
long get_ram_size(long *base, long maxsize)
9 ?# N( P% `* k1 C{
! j4 D! E( O$ E# p9 B        volatile long *addr;0 y* ~) r7 ^% p2 {* v, u  l
        long           save[32];
* w& }4 e/ }0 R        long           cnt;
2 u4 k) u0 O. `# }% ?% ?& x) U        long           val;) I, o9 h- e9 D' [% Q* ^
        long           size;8 A( D8 Z9 M9 T+ n5 m5 Y: f
        int            i = 0;3 E7 S. h; x$ x, }& R
1 D! I3 i  i( F
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) W% A* |, W8 Y. x9 y% v, o6 X                addr = base + cnt;        /* pointer arith! */7 B% U4 g; j* e0 a
                sync ();
2 i( J" k  o, V2 Q! l                save[i++] = *addr;1 i. T. ~- A1 D
                sync ();& a: E4 g8 b1 R* Q( H2 K
                *addr = ~cnt;
( D& u: t& r; b( X0 k- U- Q2 i% w        }- P' C! S! X- F& y$ p4 d/ J

+ S( O1 P2 S9 V+ `1 V" d" i        addr = base;2 x9 _" H. }4 `- A! V
        sync ();
# q2 C0 V; y9 I        save = *addr;
- {. n1 y: {1 n1 m/ d        sync ();
% ?( ^# r; h" c; t8 c0 ^0 m; X6 X        *addr = 0;
" C% h9 I% E$ p1 M7 t% Q% f9 g0 b8 S
        sync ();
5 ^# L8 D% {- G3 S6 z3 B; R4 L        if ((val = *addr) != 0) {
+ Z1 }8 {4 |8 N& N                /* Restore the original data before leaving the function.
, q5 N/ W6 n2 O/ }6 {                 */* y% d9 Q$ T! C
                sync ();
6 e0 Q2 G+ I3 |2 c; ^" G# ?                *addr = save;4 J7 L$ a# k$ Q
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ a3 k4 s. e( X9 s; j                        addr  = base + cnt;
" k& i9 l4 V& U% }$ _8 C                        sync ();
1 D" z+ T! ~7 S                        *addr = save[--i];
2 h/ n% b1 o: M' W: f" u                }* B; n5 F! K  R, x7 a3 U8 ?4 {
                return (0);
! ?1 Z# M7 q: A- j9 c* e        }
, P$ j7 c  E; v- J3 h% j7 M% w$ K/ k
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. @  `4 C9 G/ Y. _
                addr = base + cnt;        /* pointer arith! */
- Z/ d) B) |2 i! O9 |, ]                val = *addr;6 d3 Z! ]$ R5 I9 y
                *addr = save[--i];1 H: k& b% \/ d6 a4 i- |
                if (val != ~cnt) {
4 y3 G3 ]2 q8 j' ?+ W                        size = cnt * sizeof (long);
4 E5 q( R( {- ^5 |- k; `                        /* Restore the original data before leaving the function.% {  j& K0 o& R  D% v; V  o
                         */
6 I* b& ?9 B: O1 d; H8 \                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; T8 v5 f8 C1 u; Z) o& w
                                addr  = base + cnt;5 C4 C6 j9 N9 v
                                *addr = save[--i];
0 I, n: h! Y5 Q# m$ S) O5 }+ T                        }2 v8 _. s# w9 c6 ]; X4 _
                        return (size);
% a; q/ A. D, P6 Z( R                }
4 q/ M4 u, U3 b/ b& d        }, ?3 a& ^" M. r1 q) s: h

; w0 c# w3 c6 m: {9 C        return (maxsize);. W+ ]' E0 ]" b$ T4 X4 o
}$ m( H. U! D* ~
int dram_init(void)
( M  Y4 M6 P: N# y9 U6 j( d! W{
% m" L. N2 N( k- ]        /* dram_init must store complete ramsize in gd->ram_size */, `0 N. o: i, _2 O
        gd->ram_size = get_ram_size(% l' H3 Z! e" `1 B
                        (void *)CONFIG_SYS_SDRAM_BASE,5 m- i0 P+ c  B% u. C4 o! J
                        CONFIG_MAX_RAM_BANK_SIZE);
: }. n4 y$ i! O. r1 k8 e% G        return 0;' U" S9 g2 t* m9 _0 A! O
}
$ y7 c  C# q6 J$ S) X  q; s8 P4 l+ a; ]6 u2 Z

) i+ Y# Z. G) S; M/ h3 Y9 X% k$ g9 f) d, F- F

. r# m8 v6 D: q+ @" j$ QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% K2 A. F) d( x- Z/ i6 D" i
* p. |4 M- W+ p! `5 F  P8 |, p

/ O- q6 v( X$ F# a+ B
* A& a2 ]  w) s& h$ k1 T9 ?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 10:23 , Processed in 0.039554 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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