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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# C+ }) E( t. _8 U; z/ Z9 Z9 P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 `) G! S* @& C2 C' @" V这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) b+ K2 W4 u( \9 z
: c& d6 V4 q) X* W% a% x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) T- w; M! Z1 g
: C8 G7 O9 \9 }& u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& q1 A4 e" {, \: Q" V
/*
: i4 A) Q. ^/ I+ H4 l* Check memory range for valid RAM. A simple memory test determines
  E" ]  u/ V% T* the actually available RAM size between addresses `base' and
8 J) A9 A" y' e) L$ [" A* `base + maxsize'.
$ W* G, z; K& k$ R5 n% B! I# H*/
' Y% @& R* ^8 M1 S* {4 x4 along get_ram_size(long *base, long maxsize)
6 `. f" _  Z0 o{
2 F- t% f, o, u: }3 \# g        volatile long *addr;
. D& p( Q; A4 f' F& @3 S        long           save[32];
4 v% I  C5 Z( @: j: N2 a        long           cnt;% a6 W4 H% q2 H; z; F8 c
        long           val;
' x2 {. S& r- [' L        long           size;" m% ?) Y" [. k* R% `4 t
        int            i = 0;/ x$ z- i2 m1 ^+ O5 }) R$ x# |" e
- d, e, a9 f4 H) P0 K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& {4 {  t/ z7 ~7 D# a/ p$ H" w                addr = base + cnt;        /* pointer arith! */4 D1 q& S2 S' Q  Q* J& n
                sync ();
' J& Q0 L$ h# w/ d" i) U2 i                save[i++] = *addr;9 ~; b, {& M% ]# A0 ?
                sync ();
8 E! p  R7 Y; c0 ?  `, |: w                *addr = ~cnt;
- \/ b1 ^1 {! P3 T& X1 A7 L; E' I        }
3 e7 p* m2 i' ?2 g* Q* l  m+ g$ B) M  A/ u
        addr = base;
$ G5 C) P$ s# k  m        sync ();
# M4 E! K3 U$ m5 s        save = *addr;# i+ h& {- K# \, |; H4 W
        sync ();
) t: K8 \- {1 `- Z' R0 Z+ X/ H        *addr = 0;
) S) U8 k; ?; @9 J
1 Q9 }# c3 V" p        sync ();
' y# Q4 \. B8 q% o: V4 \        if ((val = *addr) != 0) {
' }( n& X) \$ C' w7 V6 z( j( b                /* Restore the original data before leaving the function.
; h: d6 T2 Z: E9 f, X* W                 */
% Q) |8 ^: ?! e2 ]- l                sync ();; g' ?- N; i0 G  k5 ~- @  A
                *addr = save;6 i- d# H4 |/ O+ m  _
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {  p+ L; \, x( ?  g* t/ z
                        addr  = base + cnt;! h& W  ]$ A3 \6 U/ P) }. i/ d9 ]
                        sync ();' n8 [/ f3 U2 ]1 I3 f) A2 c
                        *addr = save[--i];
! u8 ~* A/ r0 x, m- h6 Z( f. N0 @5 [                }
, z$ v4 W. A8 r8 h/ g) F. _( \  D                return (0);, R9 h  `% _$ h" m% c! d( ^+ s
        }! c% Q" K, I  Q/ {( ~. B- _
! W, I3 T  w$ Y0 ]7 P! I
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" M  P3 S( v2 r
                addr = base + cnt;        /* pointer arith! *// G# p1 K6 m  t
                val = *addr;: k/ H+ ?% ?7 i6 o# P1 T6 r6 ~3 Q
                *addr = save[--i];
9 I( E7 O; w  D4 J$ O                if (val != ~cnt) {5 S. g2 o  h- v6 J2 X! d
                        size = cnt * sizeof (long);
4 d$ C8 R- h7 z+ V% W                        /* Restore the original data before leaving the function.
/ M- F: z" h3 z, }! @' X0 Q                         */
' j2 Y' c$ s8 L( a4 l! Z6 U                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* t/ z/ b. G, g$ z  g  b" [' M3 Q                                addr  = base + cnt;
3 y# g% n) h/ E, f, A& F" u& A                                *addr = save[--i];
5 p& w0 ], P3 ]* }9 P                        }' ?  T  e, p3 R# Y! J4 M0 |  A
                        return (size);% O/ p/ E; ^% P' S" ]9 D/ \9 P
                }* P' U8 H5 S6 {% }
        }
  X. c# O: N6 w0 Y& I/ x8 I2 o6 v- k; M. w! \& t9 m
        return (maxsize);
" {5 C* v: l5 |$ W; ^& a7 b}
- f: k1 T9 D1 g! z2 Z1 Aint dram_init(void)
3 S; r4 z1 `* M6 |0 z% ~- R8 V4 Z* _{7 h3 [) p) P3 ^: ^8 }
        /* dram_init must store complete ramsize in gd->ram_size */
4 [+ b; ?6 r& l& a        gd->ram_size = get_ram_size(% v  J7 r% C4 _/ Y* C3 G) k4 N
                        (void *)CONFIG_SYS_SDRAM_BASE,  q' Y3 n" x( d3 m; ], J
                        CONFIG_MAX_RAM_BANK_SIZE);
6 x* W$ y% n3 t) o# X, v        return 0;2 [8 J9 ^" i8 \3 @' _
}1 C8 P8 @1 C1 @. x6 y
7 m# R$ v) t* D# O* G

8 D. c+ _- C/ m) B0 Q+ t- l3 D- F4 \6 G& I/ n: Q/ P/ ]$ R
$ f5 q1 ]& j. K' a; S. `. H4 X6 g
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* ]  q- ]3 n) Q+ d' ]" Q) r5 a, H( y% b6 ~1 o7 s
& }; P+ r6 q$ N# @4 J; i# W# _0 E8 m
; P: S* I* T4 c% M) E0 k" t
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 15:26 , Processed in 0.038854 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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