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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( i) ?- P1 n5 j* N& n& ~$ L& i
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' {( k. I* P7 h5 D6 W6 ~' m8 S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 S4 u& r, M, W& ^  b5 R1 F
& c, V3 |2 Q+ b! V% _4 I% ^. L7 t% {3 r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, N( A  W6 z- V4 F$ Q% y

% ~3 \9 k& q( K# N9 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  P. V& z' k% i" `/ A, p+ N2 c
/*' h3 X- K. W6 f; D9 O- U
* Check memory range for valid RAM. A simple memory test determines
5 }6 Z0 p' K5 H) e4 _  X# @# [6 G3 q( F* the actually available RAM size between addresses `base' and  G7 X! D& r; b, X& F5 `
* `base + maxsize'.
1 m% r% T$ U( C2 V" G*/. B  B  O% t+ i$ F* q6 \- g$ y/ u
long get_ram_size(long *base, long maxsize)1 T+ E3 }; N5 s5 Q& e
{
5 }4 I& v! \: {        volatile long *addr;
0 U6 l4 A4 ^3 q" v        long           save[32];- A+ V- a0 x! }9 W8 o. s- Y
        long           cnt;  c; I7 t; K5 @* S" j
        long           val;5 Q& L4 O% m! A
        long           size;
% o5 t- H+ y9 t& M$ ]" {; V* o        int            i = 0;8 _2 e& g+ i9 D) I/ j/ ~8 [2 D

" ^5 V3 g+ k1 g# l        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" g& W/ e& p. j6 N! b                addr = base + cnt;        /* pointer arith! */
. r5 {1 r$ b1 e                sync ();
) U* J" j5 k( K0 }! V9 t                save[i++] = *addr;6 G& L, z: e. c6 f8 p% T8 l
                sync ();
% Y- ]) r4 \; X1 m  J1 Q$ q                *addr = ~cnt;
" U# }* D3 _9 a6 t9 l2 i7 @5 {9 [        }1 ~7 U9 j/ b8 n7 a# }

: H" u; a" d+ E( y( k) B; \# j8 a        addr = base;) U' `; F, f+ C4 B* y
        sync ();
% d2 C, `, X2 O+ m        save = *addr;
$ x: Y; U8 [# ^4 \2 G7 V        sync ();- U: h0 b# i7 B* w6 Q: p1 X8 a3 N
        *addr = 0;% }% I  Z5 f5 ~8 j/ B
4 b/ L$ Q% o8 ~& y
        sync ();
: `; Y* A; K& G- O, D        if ((val = *addr) != 0) {7 j$ @5 O; X; N& W3 \) y
                /* Restore the original data before leaving the function.. |4 X; U: `( @8 c/ a. h# S6 V
                 */
- i2 z" F# f/ L' z! P                sync ();0 B+ M5 L2 c% E- [/ p$ s3 o
                *addr = save;! r: m4 A* r+ k( @6 F. Z3 U
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ s6 H% v' d6 J- J                        addr  = base + cnt;' b6 \4 O; _9 t4 T! j8 q7 v
                        sync ();
0 D% t* u  K6 T: Z  n                        *addr = save[--i];
) n( }. t  o! S1 Q2 _3 _% f                }
  e, |% q1 {+ m9 ^0 M3 b& z$ Z- }                return (0);
1 ]( A2 t1 ~$ ~% {        }, I  J. W) }% {9 V8 C
$ ]3 R, v* x, K  N9 P
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ F" J- U, v; N  i2 `  F
                addr = base + cnt;        /* pointer arith! */
# n) o2 f# h, u: ~+ n" y                val = *addr;
) i; T0 d$ B4 r7 ?1 F$ t, p% L, Z" L                *addr = save[--i];9 l( r) Z* _9 y9 H8 ?
                if (val != ~cnt) {# d- d, Y- L- {* `' S
                        size = cnt * sizeof (long);% F' W8 }) H. F  V  l; k
                        /* Restore the original data before leaving the function.3 G" \: F; D$ k" x' X+ H2 N
                         */3 ]: L" Y+ Q  y) s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: C& G$ I# W+ O+ M                                addr  = base + cnt;
, F. b! z; P8 [, t$ ]                                *addr = save[--i];" r( X- R$ x% m
                        }, ?, ~! U. G+ l1 l# }  l0 k. P
                        return (size);
0 F5 x! ?2 ^2 [9 R) Y; P& V; F                }
5 b  A+ K5 \6 F: X        }2 N# a4 [# H  J( C% r

7 C" P( t, _4 ^0 ]5 N/ W" `        return (maxsize);& y0 \4 Z6 Q! C0 u# O! Q
}* B* P& ^' ^  C' `1 X, A+ I
int dram_init(void)4 e/ P! b( C1 B7 |" o5 X
{
$ v! ?% W# m+ Y5 b7 p5 q        /* dram_init must store complete ramsize in gd->ram_size */6 [! l# j2 O+ B/ y' |0 B, o- ]
        gd->ram_size = get_ram_size(
0 _) [5 K5 I$ T' I                        (void *)CONFIG_SYS_SDRAM_BASE,+ J; c8 f: l" E' S
                        CONFIG_MAX_RAM_BANK_SIZE);0 j& V- u" J7 s4 B
        return 0;6 a: j, n2 F2 O4 g
}" R5 l4 {/ ~: l/ n  s

4 e9 |' i- S# a- C* X! \
! U6 q0 w) Y' k5 h
. C: o4 u* @, u7 g& T. D  j) I" I6 D" e8 X: ?! q: x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ f) f* V3 x% p8 z" l$ s
3 o/ b% b) D9 O$ Q8 n
2 o. f% N' j9 G& N% n: h9 D+ ^

8 i) @* u8 c3 v' G
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-23 06:12 , Processed in 0.038613 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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