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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 E7 {3 G' W' ]" t- z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. \% @3 l7 U2 U& S9 y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; Q8 T& x3 }8 d3 o4 _& T/ M, J+ E& Y) |. [( V, c7 E) e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( f0 Z, p) @1 T* A

$ u& D- O' i+ s2 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ {& {+ d3 f- o1 X/*
, t' S7 f" V* n. |* Check memory range for valid RAM. A simple memory test determines4 |  C8 I! H" n; @
* the actually available RAM size between addresses `base' and
4 M7 Y/ V/ |: c' N* `base + maxsize'.
* [' L9 I2 K2 ]6 d' Q( L*/) B3 W1 S% o6 F$ Y6 z7 o5 Y
long get_ram_size(long *base, long maxsize)2 x% j: O, ]+ S& r+ m# m$ k
{1 h" k  k6 b0 R& b
        volatile long *addr;
) m8 ]$ Z# r' ?        long           save[32];) N( d; O7 G6 o- s5 z. r# u; i
        long           cnt;
( d6 {) L  S5 Y7 \1 t        long           val;: O- S" q- |5 L$ q" v
        long           size;
  a: d' e$ R# r, Q0 l        int            i = 0;& ]$ |- h$ S$ L9 x
0 i4 @1 j3 J2 ?/ c% A
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! `% \& f  V" s4 F
                addr = base + cnt;        /* pointer arith! */3 o9 K& W, b) ^1 n6 ]' k$ ^
                sync ();; j# \& G: t) a
                save[i++] = *addr;% X6 G! {% y& A
                sync ();
# w, r$ @$ f, \% A+ z                *addr = ~cnt;
7 @& J5 N( T) V" i/ N2 y        }
( c) f( b+ t) k: H7 U8 q( H' R8 {* P. z4 m/ `
        addr = base;
7 C) e+ W/ A1 A5 H- p! D" q  w- y        sync ();0 Y# ^$ r7 b: e3 Y' [+ s: E; B) y
        save = *addr;
5 m2 G$ i! l, y        sync ();
; R! T" m3 G) M  o) p6 J+ d        *addr = 0;2 [( ~) g' [3 i
4 A' e- c8 K5 g+ U
        sync ();
8 R" \9 L; V3 q        if ((val = *addr) != 0) {' X+ L/ X: W' f8 R
                /* Restore the original data before leaving the function.6 Y0 I# l3 Z7 F5 |. u- T3 \
                 */; j( {' q) Y0 @# L& l' x& }8 P3 C
                sync ();
) ^, f+ w# F( x7 s+ W) C' P                *addr = save;
3 d6 O; N. H3 s" T) w                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# C# f9 {- d1 \
                        addr  = base + cnt;+ Z( B; r9 \6 F. v' _. d
                        sync ();2 o5 ]$ T+ ?6 y- a0 \
                        *addr = save[--i];
) G" F" ~0 P! e, T! s8 ~* x                }6 G& ?4 q; }( F- B) ?
                return (0);# q, Y9 I! S& n& ^8 T
        }: k! O- O4 E4 q; C
( H/ B; o: T+ S2 ]4 a
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- k5 {, s8 e+ x6 }# ?" k( i9 S0 c# _/ |                addr = base + cnt;        /* pointer arith! */- u, m5 |* ?$ b1 P
                val = *addr;
( b" g' F' C5 b5 c$ V( Q                *addr = save[--i];4 F/ u  K- c0 z8 i: x8 n( {
                if (val != ~cnt) {
9 q; k- k. s9 L* o0 y3 v# K" M                        size = cnt * sizeof (long);0 a: R) Y6 {* K( `4 k
                        /* Restore the original data before leaving the function.; f3 Y0 Y, @* \! }: K3 e' @
                         */) ]& A$ L# z: P5 t
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% a. O2 [3 v, W% y- w
                                addr  = base + cnt;( N* Q. p' V/ t& z( }( m% m
                                *addr = save[--i];6 e% N) `+ Q7 x, R
                        }
; N, A/ V4 r1 g, i! y                        return (size);0 v2 |8 g# l2 u; s! E
                }
8 {% |) m9 `2 Y  h% x        }# S! m, k: h# ~: {4 ]* R  d; O
* i; }# O" y; e  A; r
        return (maxsize);2 G7 V& j  \: u( l5 S4 I7 k
}' |! c, O4 f* U2 p$ d/ {
int dram_init(void)' P: ?; I/ R; N: a4 L
{
& P6 I3 D1 N/ U9 c        /* dram_init must store complete ramsize in gd->ram_size */
' A- |- c1 Z5 W, _+ j1 C        gd->ram_size = get_ram_size(0 F0 g2 a4 z7 C
                        (void *)CONFIG_SYS_SDRAM_BASE,
  p: D% X1 H' k0 u# S8 b9 z9 K2 T                        CONFIG_MAX_RAM_BANK_SIZE);
. S8 `' L! T3 S, ~6 r; l        return 0;
3 z: p4 _5 x$ g}
( ^# O  `1 h- F* n6 h6 b2 w7 M  p* s! g7 W, `2 n, v& \

! w$ W- Q4 Y! {6 X8 {8 t& `4 Z1 D$ {9 K$ W8 j
) p9 [/ v/ }- D2 R) F7 O* R3 u/ Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 U0 G# w* X% O/ i

9 Z7 u" Y5 p- y  d7 {% [4 \( C& C

# i/ M4 x8 D4 Q/ x. P
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 03:49 , Processed in 0.037973 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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