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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit2 }( O: _2 V" n& H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit" [0 S! b3 L$ x3 C  c3 U5 a' T% ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
+ Q, u- y6 H0 K
8 S+ E$ a+ C. D; q. [是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; }* p( ?* i  c2 N
* A" h1 C, U$ x, Z/ E5 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 J) R7 D& i# e3 M( i/ g
/*+ Q; X2 Z  t; d! ^' u0 c
* Check memory range for valid RAM. A simple memory test determines3 k. a# w0 G; P
* the actually available RAM size between addresses `base' and: d; y4 s& {1 ~4 y+ j; E
* `base + maxsize'.
& H, f9 }6 A; W2 j4 X; B*/
" J9 Z$ B; x5 m' }3 C3 b# N+ hlong get_ram_size(long *base, long maxsize)* m, i/ w; Y  F1 F
{4 b) q& s0 [! \
        volatile long *addr;
8 }! G  r7 _% U* E* H% [, r, P        long           save[32];% j6 i9 T/ Y" Y% z/ v- g  ~/ ?0 `
        long           cnt;/ Q0 Q- ]! z0 ^4 j
        long           val;
5 C- c# V1 d! }6 d7 I        long           size;
' w0 k0 J  l% Q3 H        int            i = 0;
4 S$ g  N3 z8 p( v- @! C
2 w' h9 U4 P/ H& Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- D. r% H6 D1 P6 g/ I1 b% \
                addr = base + cnt;        /* pointer arith! */. a0 R( M" O" k, U) K( i
                sync ();7 G# e  e$ x3 m' S3 y/ |
                save[i++] = *addr;: o. m- m% L# v% N$ a. ?
                sync ();
' i2 m% }7 |% c$ A                *addr = ~cnt;5 M9 U! s2 ?8 w+ i% `
        }
- L! F. y- }" u, S4 ~! U) X/ r
  k. M1 z! R4 _3 y7 L        addr = base;
9 {" ]: w$ o- W        sync ();& f. g+ Z# K) Q& q
        save = *addr;' @! V0 M) h5 @" _6 x; Y: `1 i
        sync ();
4 ~5 x& R1 L# L5 Q. S2 W        *addr = 0;
$ u3 e, z  P& Z, n6 D2 I/ t0 k4 i6 j" v) U1 i, H; V
        sync ();
" C* G) l0 y: f. ~! }8 N        if ((val = *addr) != 0) {
% a: A& i- R: n                /* Restore the original data before leaving the function.- ]4 y5 q: V, [( U
                 */
" W) \) d) O: S7 b) ]8 P                sync ();
3 A* J% A3 P- f' H# G                *addr = save;
4 `7 q" L6 Z- G- I. K0 X  Y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 e; p/ T9 |) S" w, f/ `                        addr  = base + cnt;
- O6 W, S6 W$ V- P) D                        sync ();
+ g" ]. t) S5 T                        *addr = save[--i];
6 a3 ^0 l, ~# C- u* d                }
( x% q' D% l0 F9 ]4 `/ Z                return (0);
$ P( ^/ B$ V# c7 C        }
1 }" u4 H7 }( S3 j$ k9 C
& i/ G7 ~3 }% N4 [; S. J' b- A        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) R7 i! U% d/ w: ]3 R3 V                addr = base + cnt;        /* pointer arith! */% `3 m8 P* n- l: ?; V( h- \
                val = *addr;7 A. D9 H* J3 b" k0 M/ k% e* w" G
                *addr = save[--i];$ U2 b* ]1 w) Y
                if (val != ~cnt) {' l. n. \6 ?( k6 Q# j. Q- A( y0 q
                        size = cnt * sizeof (long);+ ?; N) m. S/ [4 B3 Q, D% ~1 T
                        /* Restore the original data before leaving the function.  S! O$ ~  U2 H, j1 J' f! r  c' `
                         */) x3 M  b- i. _4 Q9 O* \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: `: W! W1 I0 _5 Q5 u1 X4 J! P
                                addr  = base + cnt;2 r  S) J; J+ b: d
                                *addr = save[--i];
* H0 O5 U) L  {1 \  m% ]                        }( J1 e  z( \; N
                        return (size);
. z8 B6 X+ ~- A5 G& r                }& C" f$ P7 \2 S$ m+ V3 Z* e7 r
        }
" s1 D2 b% b- R2 }8 O! c, F3 i4 m) _, ~( h2 H0 n0 A: _, U
        return (maxsize);
. A5 I$ ?& ?! Y! P9 ^3 b: d1 A}
2 x. O. _( p/ S5 G2 T+ c6 `int dram_init(void)! T7 ^% ^$ P$ W  C3 p
{' p9 @/ \; S0 y1 O/ J: Q2 F1 V
        /* dram_init must store complete ramsize in gd->ram_size */
5 _) m5 |! R8 {0 |        gd->ram_size = get_ram_size(
+ p; O6 e  N+ F( a6 S! \* m                        (void *)CONFIG_SYS_SDRAM_BASE,
0 V" y. c9 D/ D! O- m' h                        CONFIG_MAX_RAM_BANK_SIZE);. L7 d0 c1 [9 e$ p8 V2 O1 e" G
        return 0;1 q$ i1 ~' b. }* g
}5 K2 q0 L' M* U2 r/ r

) b/ b. B* \, q' D
0 @' N1 R- v1 t7 u& w; S
; e$ s8 |4 B# K4 b  N
* K2 T0 S" G. ?8 ?) U* ^* i& iFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 O" ~! Y: q; Z+ v
' U% q4 c5 `2 _/ ]/ y* F/ a0 \& ?' M" n1 ?% e1 o6 Y
% P5 f; H# ]3 ]4 Q0 u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 21:54 , Processed in 0.038930 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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