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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
6 w2 Y% \% ~& g. h, w核心板2:DDR2 256M Byte   NAND FLASH 8G bit  p2 Q2 W4 g/ W# G3 h$ Z! T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, \- I6 d! u  B; p- X" r9 K4 L! h6 H* N- \& C+ K8 B9 N1 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; K9 I5 F- Q: v2 O8 S4 d
* D6 b, t, S& N6 s: _, [" n, l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% w/ Q& @; ?8 J7 D/*2 _- K. m2 d! ~( l
* Check memory range for valid RAM. A simple memory test determines/ i* \3 b, F) q* Q' t
* the actually available RAM size between addresses `base' and
$ t( K) J9 P! m) v* `base + maxsize'.
( [- ?5 S* \+ ^( s*/
3 [5 i" B+ ~( `  |7 |long get_ram_size(long *base, long maxsize)
4 G3 A' C+ t9 _& a) O/ O2 J{  g4 Z) u4 a, R
        volatile long *addr;
; u  d* E; I4 X! z9 P4 m0 s        long           save[32];
' S- s1 I$ ~; M' w        long           cnt;
: C1 n; }8 X1 F* x        long           val;4 h3 G& Y1 O+ P$ U
        long           size;: |* t  i5 C! d* k8 e  g1 B
        int            i = 0;, {4 B) q. U+ X5 s6 |
+ G" ^- _2 y3 F3 f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 D6 ]0 m; T1 G4 @. r                addr = base + cnt;        /* pointer arith! */2 ?3 Z1 y1 K' I; W/ [$ e
                sync ();
% ^* L9 X. [" {9 X                save[i++] = *addr;
! g2 D. a/ I2 V; c                sync ();
  m' U8 R& M8 C                *addr = ~cnt;* y/ J, v' W5 z( V
        }3 u  [% ^: ]5 w0 Z& k. g
. {' q4 c8 S, c0 F
        addr = base;0 l0 ^8 {: `8 J2 t/ Y" S
        sync ();3 o2 |6 |) {5 S' f7 f# ?6 m
        save = *addr;
% Q% s- D2 j3 j6 {2 K& F0 [        sync ();
& q- P. z, T8 p& y        *addr = 0;3 w" _, d  i  F5 @! Z

1 m. E6 ~7 i7 [5 [( J) U; K        sync ();
% {7 t1 `1 n' C2 E- o. e: l/ Q        if ((val = *addr) != 0) {
8 @; X1 P7 I# F; g( a  L% U                /* Restore the original data before leaving the function.
; f5 v) T8 u! b( M& K6 x                 */( T% u$ q' Q; F  F
                sync ();
- B' L& A/ q/ d- V                *addr = save;) V8 @2 |! O. |( {+ y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 n' C  I" ^# v# t* w6 L                        addr  = base + cnt;4 U& E" p, k4 N: j& O  W
                        sync ();
3 V  C4 d  z5 x, ]  X3 N& Y5 X                        *addr = save[--i];
1 l9 h1 J5 Y' _6 t                }) s" @/ i8 }+ m5 n2 F
                return (0);6 e8 W, p& P4 Q5 z
        }; l! D8 q$ E( p  q& S

6 P; ?6 a. i4 W3 e! q+ B        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, T" I2 n0 F0 B0 T
                addr = base + cnt;        /* pointer arith! */& v) ^. [( B; w2 u
                val = *addr;
/ E+ ]6 }  y) R! z. h                *addr = save[--i];
& c$ B" U+ h9 ?' j1 `; Z8 _# g8 V                if (val != ~cnt) {
7 \- e. [2 ^9 d9 @. v1 g# Z                        size = cnt * sizeof (long);
6 t* b+ F/ a+ D% U                        /* Restore the original data before leaving the function.0 K6 [) \+ U3 W0 ?3 M0 \
                         */$ z6 I, o5 u6 O: a4 l( d7 T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 A* a2 h4 K, s* M, F
                                addr  = base + cnt;* T3 F& P. l# r2 J0 i1 n
                                *addr = save[--i];! P  Z1 V  F, P+ w; ?* ~+ b' \( G4 f
                        }
0 K- x: t5 }% s5 c# d9 S, w                        return (size);- [$ }% p5 F$ l8 o. w1 t
                }1 w* n1 S2 p  n4 a
        }5 |9 ^4 i5 }( @0 ~4 `- @
- o9 a) h" N& m$ ~) ]) D! u
        return (maxsize);+ X5 v2 u! ]- g% s; _2 {4 W0 t
}. g; K! D) O. r' _% C1 t2 G+ [
int dram_init(void)3 j- o. b; p3 V
{
" S* A% N" k) U2 r  r! D        /* dram_init must store complete ramsize in gd->ram_size */) T% _5 _1 K* H. t, K
        gd->ram_size = get_ram_size(
% k" S, X# L: H4 V4 P+ M9 K                        (void *)CONFIG_SYS_SDRAM_BASE,
3 s" j' M6 [" O( s% b) o1 I                        CONFIG_MAX_RAM_BANK_SIZE);
2 t; b7 r, |5 _8 e        return 0;& h! n$ F+ ~5 H6 m; V
}
- i/ i( q! i4 q+ ]* n- t6 \0 w
0 K  Q. f& W/ e# A0 r
6 c9 w5 C9 d$ v9 F% h! x
2 f3 n* `; N( C4 R( ?
4 z8 A& H2 e  CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  K* d- S8 M$ j! J
3 K" q' m/ Z2 W. ?6 s( E& E4 \
5 t; s: ?/ [; b' Z' X

) K+ Q/ K9 W  S8 N7 n
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 10:50 , Processed in 0.036398 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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