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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. a  p* X1 N3 ^% o- M% B5 B+ N核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, n, |; c5 ]' R6 a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 L  ]4 A0 t6 l; f) a# ~% f# h. T
+ n! V, ?3 I( h, r1 c
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; N: \7 J( @- h. k/ ^$ l

1 q) y+ U" k9 m  t% ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) V: G& H2 g4 V5 |* n
/*; F8 G% r6 s" b9 O
* Check memory range for valid RAM. A simple memory test determines4 B( @. }5 m& {, b1 T
* the actually available RAM size between addresses `base' and
9 I% @# T# \% O4 w/ {8 f4 s( c* `base + maxsize'.
4 _; B& s  O6 `0 j1 {*/7 r, Y4 @( _  G3 m
long get_ram_size(long *base, long maxsize)$ d0 ^0 C" H$ Y4 m( c  E; z% E; q
{* U" k  Z- `# _1 f0 t
        volatile long *addr;' c* Y) W! V$ e4 d4 B5 |, a
        long           save[32];
1 `6 F2 R% N# W, d; d( `2 u) I( [1 C: X        long           cnt;
% m! S7 |6 f" D! T) k2 q1 C( y        long           val;6 p& i+ @( y% [% n5 j0 m, b+ N
        long           size;
8 y) B4 G1 k5 y& e' [0 a2 t        int            i = 0;
" Q9 k0 f- b* `$ E  y6 {0 e
* J1 b$ N7 z, R5 ~8 C+ F8 T        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' l; W. u) X; E+ }
                addr = base + cnt;        /* pointer arith! */( M3 S. {. V/ \3 n" q; E
                sync ();2 J, m+ P2 u9 e4 `9 \$ Q& g* x
                save[i++] = *addr;: J4 P& |0 E' R$ p- s# o! }
                sync ();9 T. B) a# @0 k% H" ?; a
                *addr = ~cnt;- q) o1 j( z5 q
        }% s9 e! V4 |  V3 Z

* E# }( B8 V3 w- `        addr = base;* W5 m4 f  U+ R
        sync ();
: Z! B3 `( M  }3 b" z: P1 v6 V        save = *addr;- O% D! q5 m  b' s  B
        sync ();) ?' `! ?$ ^# J
        *addr = 0;
$ U3 p7 }/ B$ T  j; x; e; t# O8 l. R4 G* O
        sync ();
2 H! h0 Q" |$ M        if ((val = *addr) != 0) {1 r# [# ~- q; k4 g/ v
                /* Restore the original data before leaving the function.* Q7 z# ]; h- j' v
                 */- P4 e. G! d$ P$ E0 p( @. y6 y
                sync ();
+ I' v( R+ ~& s( b' R, Q                *addr = save;
6 d$ B4 D+ T7 q- d- `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% ~/ _: j: _& p                        addr  = base + cnt;* F0 U5 o6 s: Z
                        sync ();
# v4 y& g1 b0 T& l& T2 r                        *addr = save[--i];
5 Z( N7 S- l9 p7 Z9 }. u: Y; s                }
& v2 k9 j3 G1 h0 P8 _8 p" h                return (0);
6 ^% I$ P, \  c6 ?2 k; ]& R        }
# ]* Q. V" g- U8 V4 F" c2 \) p6 d: T( c% t8 |) w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 ^$ ?3 z! ?0 q# c2 o$ i3 T. b                addr = base + cnt;        /* pointer arith! */7 }5 P9 W2 g4 m! v
                val = *addr;
- e8 A6 J* d' {6 p                *addr = save[--i];" m. q5 j2 g, t8 s: O* O9 ^
                if (val != ~cnt) {
% T8 |: p2 w2 z( g& p& V; F                        size = cnt * sizeof (long);) r4 L& s, O1 K/ R4 x* J
                        /* Restore the original data before leaving the function.7 D3 Z0 P' m# f" X1 b
                         */) y! U4 s. x) x: ~/ D
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {2 k* i- B6 `- Y' j" Q0 G( H
                                addr  = base + cnt;: u4 }5 ]7 Z1 k/ y# k
                                *addr = save[--i];. G1 `  G8 k9 N+ O
                        }
1 n- D# s3 ~" C5 Y- K: Z- S                        return (size);2 d% ~: Y' T  x; ~% Y0 R
                }; y0 `& ~- u$ D% b" c+ X
        }& E* Q4 N, w" H  E

4 R9 K3 s4 I9 S- S& R( E6 C, |; l        return (maxsize);3 }4 ?8 h% ^( [0 J; Q2 Y& L
}* \/ w/ F# h' F# l" q: n
int dram_init(void)
) t( k7 r: e3 ?  q! t3 m4 `2 R3 D{
7 w+ y+ v/ l6 f# ~, s        /* dram_init must store complete ramsize in gd->ram_size */
, B& F2 s) A1 \5 ~        gd->ram_size = get_ram_size(
, c' a' e. r* f6 }; J; ~+ l+ m                        (void *)CONFIG_SYS_SDRAM_BASE,2 x! t1 K7 e; j* S7 h
                        CONFIG_MAX_RAM_BANK_SIZE);, Y: }  f* b2 x* ~& G
        return 0;
' n3 x/ W& O* Y" g}+ ?2 r' \7 T& z' s  K$ \" f5 [) @3 S

& u1 y# O- [. |+ y9 T) m( l/ x* d" j
9 `* @- F, G, x! z& p' Z7 d
) D" o% F% r9 b3 s" v1 w+ \# \5 _- c  H( k8 O  F- e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" p1 b  Y6 Z/ v! M- ?$ m) D! L" X

  F' A$ R, K) t. i8 m" z) O, o5 q$ y7 ]3 Y8 o
4 D& o6 T$ ?6 x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-20 17:50 , Processed in 0.040628 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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