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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 R2 h! b) j$ R  J0 `: b6 N* |2 ^- A6 z核心板2:DDR2 256M Byte   NAND FLASH 8G bit" Y  @( x" q" r, w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* e9 V& h4 I5 Z$ q; Y0 n2 m0 y. a2 x4 Q8 ~! h6 b
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* W  T7 n% E% z2 i6 l

, s$ h3 G0 S/ V. _$ ^' _$ D% b9 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:  Z6 r% W( W4 _: Q: b
/*8 Z: r! ^% h1 b8 [8 c2 T4 [5 O
* Check memory range for valid RAM. A simple memory test determines, H! x' u5 x- v- M
* the actually available RAM size between addresses `base' and9 @" f& }1 Y7 `% X, v
* `base + maxsize'.
+ G2 E7 v6 J" c% U*/* e% C, x+ Y: f) U- j
long get_ram_size(long *base, long maxsize)
/ Q  A" @* e5 n# }8 f# V' ^{
5 v) S5 \  V/ N+ d& t        volatile long *addr;
$ L( \! k# K  l        long           save[32];3 G, k* y' J2 d/ h
        long           cnt;
) {' Y0 q5 h, X! q/ N( W( {+ G9 N' g        long           val;
# M. {9 d) b* P        long           size;
0 L' M4 R5 i2 A; V1 a' d        int            i = 0;
% O% z2 s$ S! }
4 U8 v6 {' N& E6 z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ F& G$ y$ u& u$ e
                addr = base + cnt;        /* pointer arith! */  x7 p9 R! \" C/ Y7 i
                sync ();
6 D- h) v9 r8 Y1 E& v                save[i++] = *addr;( X$ `- b; Z( V$ r8 A+ q" ?
                sync ();
, U' D" V$ |  j                *addr = ~cnt;
; v+ a7 U2 e- R6 D7 L9 R2 a        }2 I+ c0 b9 D2 }: @4 U5 x* ^% O
, E6 U& o. O, {* H
        addr = base;
& {# `; G+ i7 Q/ [6 f- B! }% B        sync ();
/ }. m9 o) I& L        save = *addr;
' z) G. c+ F$ l' C0 M7 n/ |0 r        sync ();
+ v2 ?. ?" ^! p        *addr = 0;
2 L! {3 ~& M4 j# F* u
9 p- b, M1 o5 g6 G- j7 U        sync ();
3 c3 \- ]8 t' M2 E        if ((val = *addr) != 0) {: ?. b9 T7 U1 H0 i8 e) X
                /* Restore the original data before leaving the function.! S. ^3 r% X. ^9 w* x1 Z
                 */
7 R* A2 b& h7 G( }: w                sync ();- Q, a- x& Z! {( q
                *addr = save;7 Z* U2 l3 E3 N) C& W+ H- K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ M( ?7 b; D4 u2 w+ j$ v: M6 U                        addr  = base + cnt;8 a, t. I% O0 j6 O, o& o' O
                        sync ();
2 u1 g0 ~$ g& W( ?4 O# A                        *addr = save[--i];: d% D( D3 C: y% q4 i
                }+ t7 K0 G1 f& z' _3 Z6 _
                return (0);% w7 _& O% H5 ?: S. ~9 q" k
        }/ v, S& n7 x% K

( I' u1 d. Z, C* o. Q+ f. |& U* n        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ B/ r1 j$ G" t6 A/ T                addr = base + cnt;        /* pointer arith! */
0 Y( U0 l- U8 v2 e( _                val = *addr;/ A: y. o& K  |$ S) a
                *addr = save[--i];
' ~7 e( O6 a1 C1 ~2 F                if (val != ~cnt) {9 K, |8 H" {8 \9 u0 J$ h8 E5 h
                        size = cnt * sizeof (long);
( x( [/ q' u* q/ b4 r                        /* Restore the original data before leaving the function.
& I7 A- r, c& r0 \+ N9 B                         */$ K) B- S+ m& k3 w- Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, @! M$ G$ m9 O+ p                                addr  = base + cnt;
" Z5 f& R& o; w) a4 o4 {$ e                                *addr = save[--i];
9 b# T( I# u  N8 \' i2 Z                        }
: ?  E7 T# O4 V  x                        return (size);
& z) {" F# O& n: b                }4 @3 E) k7 G6 P6 {
        }
  @0 L( F6 d9 P" z" V6 {# \' x
  o2 j' _3 C' a8 i: r! }+ M# t, d  p        return (maxsize);9 v1 k1 G' k4 m
}
% u- d' m/ ]2 u$ ]+ rint dram_init(void)
- T% T0 A2 Q0 |9 B{
5 K7 h8 z% L0 {- r' x        /* dram_init must store complete ramsize in gd->ram_size */
, @% b: t3 J+ E. X        gd->ram_size = get_ram_size(
9 T7 G3 V( n4 |. e. h                        (void *)CONFIG_SYS_SDRAM_BASE,
* ]5 v- a; j1 I                        CONFIG_MAX_RAM_BANK_SIZE);% ~( k2 F; L5 c+ d0 R
        return 0;
; i' K4 ~" t% K}
0 O0 Q- N4 A1 a) R! l8 }, r9 j$ o4 @
0 [* x  t  `5 y

% ^% F, p9 F- _: ?. m8 j* w6 X% `1 K0 ]: P" _8 F4 m! {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  e# y2 Z9 _; G7 B" N2 s

- e9 O3 x8 f; _* s0 Q/ W: k! U$ A
# \- L1 e6 ?( a9 X! \
0 l$ O( G% i" ~& H* \
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 16:58 , Processed in 0.036723 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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