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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 o7 W$ F  V2 k
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, G. W% c3 R* s& [2 o) W( j" B这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% [! @- A6 u( N, D, r; ^2 _8 v$ W% G  Y# b: a, h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; L% d6 n, i0 d% d# Z' O

) h! I& v. z4 x; m0 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ p2 S# C4 A7 U6 a9 U/*  z( m% J% g; m3 i
* Check memory range for valid RAM. A simple memory test determines$ `5 @9 [' j2 h6 o
* the actually available RAM size between addresses `base' and
8 ~2 o; h2 b+ |1 N+ F* `base + maxsize'.; @9 S( ^" ?7 r! f, y, ~, p
*/
4 }" f9 w! n1 ^0 s& ]long get_ram_size(long *base, long maxsize)! ]9 R7 f' v$ V$ |( C# U% u" M
{# K  _/ u; ?8 y$ k1 q% t1 q8 c
        volatile long *addr;9 Q  ]1 X1 ]3 K9 d& `+ q
        long           save[32];) ^+ G# I4 h( r2 k
        long           cnt;' Y& C$ _; \' @+ E9 X7 [6 z. r5 z
        long           val;& O' L8 @% @) U, c; ^
        long           size;
* {6 k! {5 W( c& m( ?        int            i = 0;  e8 V7 H8 f; Y1 {+ U. v) Q+ n

$ l8 [: E+ _( q$ h( b        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 v$ x% V; w% s
                addr = base + cnt;        /* pointer arith! */' _  @& M' F( G3 v( h
                sync ();
$ K9 f, J1 R! n+ m                save[i++] = *addr;9 S- y- k" r# h
                sync ();! A1 V# [: D4 {; R4 N7 V0 A- H3 R
                *addr = ~cnt;
9 A# T7 I3 V6 ~; w; X# W        }  f" K, j) u7 @. U3 d+ X2 T
- V) J' c; j6 J# j: K0 h
        addr = base;
& Y* s4 Q+ c0 p, B& W  {, U5 T        sync ();5 z) \5 I3 a2 D3 N; z% v
        save = *addr;4 S% Y. }+ n& x6 s* {, i, c
        sync ();
  d0 q' o, _. y$ i2 A1 R        *addr = 0;
* U8 Z7 Y9 K/ G, T! ~; s  b2 L# c. w% }' Y2 Z7 r
        sync ();- Z  V7 E) F- f# M- o+ t7 m
        if ((val = *addr) != 0) {
3 E& i: c1 x: @& B                /* Restore the original data before leaving the function.. j- V( m2 Y0 x; t! w  i
                 */
6 u" P8 Y8 q, L0 \1 d9 z                sync ();
; _7 f9 n# a. x                *addr = save;) q6 i# n/ T  u- y2 a
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 r/ Y5 W# ~! f/ W; ]# i  q9 h4 E                        addr  = base + cnt;
* P4 x5 I) ]( {! D                        sync ();
1 B4 J& M' H# a( ?* _                        *addr = save[--i];
8 ~" f6 g) G% j: O5 g* _                }6 m3 ^3 o2 M2 @+ k" D! K3 v
                return (0);* a% p8 K) q+ n3 r- z# r2 I
        }6 g6 _  l* r. Z/ j; s! }

4 ?. H5 M, k# Q! Q4 @2 h! S        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: }+ _  U) }0 [                addr = base + cnt;        /* pointer arith! */
) j" C+ n3 Y0 ^0 F6 p& ]+ G& b                val = *addr;2 Z0 Q3 ^9 Q. `
                *addr = save[--i];
+ Z7 a5 N8 S, d5 {9 b                if (val != ~cnt) {
/ o. b# L$ ?- V, ]) w                        size = cnt * sizeof (long);
) f0 S$ i- f; m+ J7 d  k3 v' A: e                        /* Restore the original data before leaving the function.4 w0 a# q) J" G2 i) s
                         */5 V! Z5 u# |- R) a
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! ^& ^7 K: i! N  A% v. F
                                addr  = base + cnt;% A7 i' r$ y0 X/ o. g+ \& U
                                *addr = save[--i];: ^6 K6 m5 ?( r3 V& \% g
                        }
, g/ H0 }6 L3 s+ G6 E7 W- `                        return (size);
$ x4 s, Z# H; ^, ?: J                }- C5 ?7 X, c9 \2 Y, n
        }
# X" Z5 Y! ~7 T5 W- _( ^; C: r+ g% Q: {) `
        return (maxsize);
8 C( O# ]; W* S' D3 S0 O}4 y# `/ i4 k) `! z; j& }8 w
int dram_init(void)
3 m6 E, l! a( ]& \0 x; w  D! M+ }{
1 A/ O! S9 V! I( Z' e: C. g  t        /* dram_init must store complete ramsize in gd->ram_size */
: s7 f3 T( i' l  `" w( m& X; R" ]  t        gd->ram_size = get_ram_size(: h9 g9 W; U, W( R( r; @3 D6 }
                        (void *)CONFIG_SYS_SDRAM_BASE,
$ v6 N7 H$ D* B; _4 n7 v3 N                        CONFIG_MAX_RAM_BANK_SIZE);! R8 N( o# L) C' d" Y* P1 W
        return 0;6 w% {9 {2 s. N: E
}
' F6 n% g8 @+ n! w9 ?, _5 p2 c
7 L. R8 ~  w# h- P, Z$ q6 _4 q& u0 s- q2 C2 a
7 t3 E3 P% l. a
' r5 x7 _( |: d5 y: K  ^/ ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 b: |, z- z$ f+ u1 M

- J. g2 c1 ~9 i# I
( q! `* D" m1 G
, F: F& Y& A+ q4 ~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 13:42 , Processed in 0.039818 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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