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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  M( v! ~  Y3 z; `2 s+ J核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 R/ ?7 x8 t0 k/ L" D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" k: r- `( D' \3 W! I) p0 V- l! K' [! m" \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?2 V8 B' t' x/ g: n# y( a
7 Y+ l: P: [! u- F! R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
! G. d. f& V: q/ I- ~9 k/*
+ k& S; u( v, G3 T* Check memory range for valid RAM. A simple memory test determines
$ P2 Z, t' B4 Q6 T* the actually available RAM size between addresses `base' and
2 I+ z. f1 h& P7 b: q* `base + maxsize'.
% U7 E9 c) O8 [  H3 e6 a*/
. N1 N  T- `+ H1 k4 N; B2 Flong get_ram_size(long *base, long maxsize)
5 k. ?3 e# y6 S2 i; _) i4 U{" U6 j* ?% O' |" \6 c  E* k
        volatile long *addr;
- W+ k1 V& c) K        long           save[32];
3 ]& M( f# Q4 d7 ^" T        long           cnt;& q0 A& y1 h2 v
        long           val;5 y* G6 ^" L* U1 h7 ]1 J/ }  q
        long           size;
" K5 I4 u/ {. k* P        int            i = 0;0 n+ Y; t+ d% Q: f1 d* A

$ J3 F' P/ i" M" q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ l" n0 X- }$ V1 I6 K7 M* d0 M! u
                addr = base + cnt;        /* pointer arith! */
; ~; c8 q( z" W& f                sync ();, f9 m# l; i8 U2 X1 ~
                save[i++] = *addr;
' l( O! j; Z7 e  w4 \2 ?" @/ v2 H                sync ();
  p" ^% y! y  ]  e" ?                *addr = ~cnt;
9 Z! z6 ^/ {- ]3 u2 B5 z        }
. T9 O* n7 }3 ?- u+ ]1 U
! y+ L5 Z4 _/ T        addr = base;6 F5 o% V$ S  j7 F
        sync ();
. J# N) s2 A% P$ P/ u" t" S. w        save = *addr;
6 H% F- C3 s8 {$ x6 ^5 D5 ]        sync ();
1 ~  Y2 p2 F) Q7 h) H6 s        *addr = 0;: B6 _3 B4 {1 ^
6 a; A) g* p4 Y+ O8 c6 o+ d
        sync ();# v0 A) I' S' x# W
        if ((val = *addr) != 0) {
1 P5 _( `1 ^# b+ G! Z& Y, w                /* Restore the original data before leaving the function.
5 I" U* ], c, c                 */
0 C1 @7 l; [6 w8 ]2 X% t3 T# O, ]                sync ();
) y  z& I6 V- j- Y4 c                *addr = save;$ z6 M6 S! d: M5 b: n: g7 ]7 n4 ]
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
- M2 F' s( I$ Y4 p: L, u" C" G6 J                        addr  = base + cnt;0 S$ ^) D/ I% l0 K2 r  s
                        sync ();+ O3 S$ B# k5 m$ n" u3 ~6 t
                        *addr = save[--i];
5 q  b* ?% c4 G6 K! y" U6 X: S                }
& F- `+ z/ Z  b' ~8 f. U! i+ r                return (0);6 y' S) u4 x+ M. D' @3 Q- S- {
        }
$ r5 C( l+ p$ m+ m! t
" z! Q' U* b$ U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 ^( E( U# K+ }. C' E                addr = base + cnt;        /* pointer arith! */
: a5 _8 n0 i, x( r& R+ P. F                val = *addr;/ ^* U/ x9 a% Q) y' h: k9 ?' w
                *addr = save[--i];
$ K' D: Y( L3 [1 R8 p                if (val != ~cnt) {
/ g6 |1 y: u1 ]( k5 e: V                        size = cnt * sizeof (long);: E* Z* m% X) e( s2 C
                        /* Restore the original data before leaving the function.
8 E1 X! ?" ]2 d, s; h4 ^& }$ K                         */- R: Q" N; J9 e# O+ B
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) T8 L6 L2 C+ O/ r( u                                addr  = base + cnt;
5 c$ V3 t: N& V  S; H2 W4 v                                *addr = save[--i];6 J  I  f! q7 A, B* _& I
                        }- X. z# ]5 H5 w
                        return (size);, @8 u: y* V0 B) J
                }( d) W4 f+ ~' `; j' ?5 H
        }
6 l$ K, L% u2 [
9 j1 H) z. Y4 W& U& I* G3 C        return (maxsize);* g. _! W3 {5 I! S1 x
}% l% I. N6 D+ {/ M
int dram_init(void)
/ A0 J; w$ g- D7 Z. |8 J( j{
) c' M8 j: X) @% @1 p; v        /* dram_init must store complete ramsize in gd->ram_size */9 V, {) V( H5 Y# w! g) C  Q4 ]
        gd->ram_size = get_ram_size(
) T1 `- ~0 r6 `                        (void *)CONFIG_SYS_SDRAM_BASE,
% c/ w9 W8 ?% r1 t' u* k# j                        CONFIG_MAX_RAM_BANK_SIZE);
# t. a) ~. H! E1 [4 b) [        return 0;
! p( y4 _. B. `}
9 h" [* k- i' k" k7 `0 v
7 P. H6 o& n, k7 V, b: W& }/ O5 m: I  G

/ G0 N7 Z) v/ y- }
; C) D) N0 F5 \; LFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ }! |4 F7 i- f; r) u/ B
# [9 }2 V# Z5 T. g& }
2 y$ `2 C8 r- w6 W$ W
2 H5 y, J; v# O+ G* i6 }* _
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 13:49 , Processed in 0.036597 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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