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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 m. E$ f4 T4 I核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 g0 `- B0 B8 k1 ^$ j这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: S" O9 @8 n1 f: u6 v$ Y

# r$ o5 t, W- _% X& k  Z! i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( L& R  C1 f- x* ^3 L* n/ G! z. F' |  W$ c' e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; v8 a, @3 Y3 Z: S4 J0 Z4 d
/*7 g: x/ e. \+ b( m. t
* Check memory range for valid RAM. A simple memory test determines
- M" d, T; W9 G, l2 l+ ^* T) Q* the actually available RAM size between addresses `base' and1 b/ V- w! l  y0 i
* `base + maxsize'.! ^, c- y6 ?2 i
*/
0 H  q$ r8 u) B8 J. c: blong get_ram_size(long *base, long maxsize). [6 [; ~  d9 n  G- J/ j- R' Z7 ^
{# B/ Y, n& F( T5 X3 ]$ N* \+ j2 D
        volatile long *addr;
: _" b, H0 C- V# m# H        long           save[32];
: e6 i  \0 A! T( Y  R' z        long           cnt;; W9 _$ f" W9 s' z% ]4 K
        long           val;
  G0 B1 z* N. R+ P( y        long           size;) s% Y7 z- n6 z# {( J6 c
        int            i = 0;
. z+ L: u- e: w2 D
8 T- @& ^2 G3 G  V        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 }/ j( c8 {- o. ^6 y% _0 @
                addr = base + cnt;        /* pointer arith! */" h, O3 J; D- ^7 x2 h" S! ]7 C
                sync ();
0 o! S7 C& [, a$ d3 _. ^+ J                save[i++] = *addr;4 o5 ?1 i. C% y$ t' j/ J
                sync ();7 E7 G& _" e" {' |: j, |
                *addr = ~cnt;2 |" m7 e* R) w5 R
        }6 R5 {! h" n4 L
+ N5 U4 B$ N7 V0 M  R* Z; J) W
        addr = base;
: J: I: n( U( N9 R6 E. ^        sync ();
2 e+ I; x3 V, E8 H+ b0 ^. H        save = *addr;
$ |  O) S% [# @4 `9 O4 p        sync ();
  h7 G8 t9 Z/ A# b! y        *addr = 0;2 L6 d+ d  x  I) p/ v" Y- f

: u3 F; z1 T0 |+ n        sync ();
$ n- |+ F% k: _        if ((val = *addr) != 0) {3 W4 X7 |" v9 {! v+ @+ ?
                /* Restore the original data before leaving the function.
+ T* v/ n6 t5 G+ b  ~( k2 r( r% e                 */
: t4 w  s4 O1 r4 [( @# h2 T                sync ();
, \+ R6 s$ E; _, g( ^                *addr = save;, [' Q  e, @* D- i' O
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  l* C+ \" r! g, z! G) p9 i                        addr  = base + cnt;
& o6 m& m( @! h                        sync ();7 E# E2 F' A. y9 B
                        *addr = save[--i];
8 N! ~( i/ q4 {& ^                }6 ?! ^8 G5 I9 {$ Q6 U& ~4 w
                return (0);# }' w+ [! @( z' F! }/ x0 x
        }- q) T, z* R; p* {( K

# q5 y: K) V. k  W        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ?! k8 t6 O0 l* s                addr = base + cnt;        /* pointer arith! */, e. b9 A' o( Y5 e- E# W3 v
                val = *addr;9 F  h  m  c/ Z- g$ w" v1 m
                *addr = save[--i];* g7 A$ d( r' p5 W! ]
                if (val != ~cnt) {. g3 G5 \- B# q& F1 Z% V/ @6 R
                        size = cnt * sizeof (long);  p/ s2 Z8 g% f. T# `1 C, U
                        /* Restore the original data before leaving the function.! z. ~1 S) S5 J
                         */
3 Y& t! d1 Y. X" O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 z' }: E" b" {9 `1 T2 Y                                addr  = base + cnt;0 Z: `4 h5 ]8 `! I
                                *addr = save[--i];
" ?& f3 j8 w, Z5 n) X5 l5 m. Q                        }
+ x8 r- b1 C6 x: I                        return (size);4 w" M1 ?) `1 D" m7 Q/ h1 F0 ?
                }5 Y: G- r5 o5 {& W8 P' v1 y
        }8 C9 R/ I* f! B$ ~
& t  o: m3 c+ E( j6 P; J! Z1 j; s
        return (maxsize);9 |2 F. b3 j5 Y; p0 h1 V6 w7 a' p
}' d5 j8 A5 c. V1 T/ U1 m
int dram_init(void)
4 S9 [5 W4 N" s( ?; T, g{0 G3 F0 Q0 g' u( k! B1 |
        /* dram_init must store complete ramsize in gd->ram_size */
) w! @" Q& w' h/ d4 ^        gd->ram_size = get_ram_size(
4 ~( y6 [. Q) S9 a$ y! s) d3 O7 t                        (void *)CONFIG_SYS_SDRAM_BASE,
- l- |- p5 X& J                        CONFIG_MAX_RAM_BANK_SIZE);
' C1 _" d6 I9 `        return 0;
7 f, A% Y8 N5 [4 h$ {4 k& _* Q}7 y$ `& p9 N8 a

; x8 ?/ h, z; A9 U  m/ @: M) r  T% X! ]! Y/ U- I
/ a2 M: r2 W7 ?/ R; Z

( g- M) w" o0 }) n4 nFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! x' C+ |0 m; ~5 D

3 {, O$ x* n/ ?/ c, J3 J2 W- k
4 b0 @* r# E5 d" U- k: q# E
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-21 15:09 , Processed in 0.061303 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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