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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 |3 h- V# k$ q7 z, ?核心板2:DDR2 256M Byte   NAND FLASH 8G bit# ^( B0 e5 s& I3 T2 P: q6 Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( _! \# w: C& w' ^: U8 S" C

- B4 k) H% v% _" ]3 c6 d是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: q- K9 y3 s$ N" a, Q: P( G* p1 F5 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) }5 e  X, z+ q2 |! J3 {9 d
/*6 X) S' S9 Q+ N* R$ ~
* Check memory range for valid RAM. A simple memory test determines
% B0 @, R: C0 Q$ R$ G/ E* the actually available RAM size between addresses `base' and
0 H# m6 ^3 A4 u! ~/ G* `base + maxsize'.
8 Q. V9 {" }3 \0 v6 r*/4 o5 j- C8 l/ m4 l2 R
long get_ram_size(long *base, long maxsize)
$ n& Y. j, n& r: c{0 i( }/ V% P' i+ r6 z
        volatile long *addr;4 K* V4 V5 _# d/ B2 u9 T0 v! D
        long           save[32];
) o8 d3 c) I) J# W/ w2 C        long           cnt;8 W4 n& }8 n. ^! \
        long           val;& z- |2 W# k4 X2 h, N, {8 m
        long           size;
* x9 X8 r. G5 r1 g# u) R. S4 l( j        int            i = 0;
' Y# u  q$ k/ A1 E
9 i( t" q9 m2 l. D5 g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ L2 \7 X' G. R( O
                addr = base + cnt;        /* pointer arith! */% {% v, E4 D1 ^) {8 M# V
                sync ();) T6 E9 q6 h- t- \: [: U; h$ Q3 F
                save[i++] = *addr;
) G3 O! N: {9 a: Y                sync ();$ }9 [% E, r) g9 J1 L
                *addr = ~cnt;  H& w! g" \3 r$ y$ @7 C
        }
' }4 x8 z* @1 M9 v& }' F
, d$ y- j5 y- C. K5 h- E, v4 h; x        addr = base;
3 o- r" w; M7 C3 _5 F0 N+ |        sync ();
. ^+ e" j6 K. z2 c        save = *addr;
( W* h/ N. x5 d: V7 |$ A  A        sync ();  h7 ]0 s( y1 b' ~, d
        *addr = 0;
! x- a, b7 }5 L  Y# T  Q, V/ O1 _8 {; n
        sync ();
; ]1 k* b" R' E: O        if ((val = *addr) != 0) {, K5 H* X( \% n
                /* Restore the original data before leaving the function.
. l: y/ h9 r! r$ i( r                 */0 d' T7 K! C+ A9 U- u; s
                sync ();/ U7 }. d3 b5 e+ ^7 K
                *addr = save;/ d# @; d/ P# D: L4 X/ A& w
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 R( M1 v/ D, R) Q' s8 r7 V5 l                        addr  = base + cnt;
9 z9 l$ a+ I0 N' e( q                        sync ();
4 s: T# N8 W0 a! ~! ]                        *addr = save[--i];1 r( k, ~9 [4 O0 O4 z9 z
                }% t% X5 }; A/ ^7 s$ C
                return (0);' I' `0 e; @3 w: W: o) s
        }, I2 j+ m' `, C  i
* C* d4 F" j9 A9 s. X) S* S! B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ B3 T# o! S; A. B. v
                addr = base + cnt;        /* pointer arith! */
" w( \/ S% \8 j- S: M0 u1 e+ u                val = *addr;
8 S3 [# X. {' N, E- U: m; R6 C* G0 G                *addr = save[--i];) x8 u6 {. |/ i; |
                if (val != ~cnt) {
6 n$ z6 r/ x" B; X, X5 q( T5 W                        size = cnt * sizeof (long);" b& B" f! \' O4 F. c
                        /* Restore the original data before leaving the function.) l* U2 S- ]) L! |
                         */3 ]3 z* J$ k, g
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! g* b1 T6 o& n                                addr  = base + cnt;, @/ X2 i* y- W
                                *addr = save[--i];
$ _6 ^: i6 v! Y* y                        }$ A; F- k3 j% u& i* X. d& A7 B
                        return (size);
+ K2 X( Z4 Q/ j* ~: E/ {1 u8 w4 M                }
" ]  r4 U4 p: e* S1 D, b        }
3 R' s1 H$ t4 p# [3 M: a7 U- J0 Q; s3 f3 U
        return (maxsize);
: X. W: |+ J% e) [% H}9 w: ~. Q) L" Z+ d2 s* }% u$ H
int dram_init(void)
6 X, t4 p: a  Q2 I9 u, J{
. A3 W- J+ n8 h) B5 [        /* dram_init must store complete ramsize in gd->ram_size */+ f8 [% @$ {! j! H. y* F5 y/ i
        gd->ram_size = get_ram_size(7 K/ x5 W% W6 n! x
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ B2 Z" G+ [$ j% o; p                        CONFIG_MAX_RAM_BANK_SIZE);$ L- x) [6 M# v% {, t; u% H8 q
        return 0;, ^; o8 y" B" P/ e4 s5 ]8 W
}
; b& B, u/ o8 d* M0 X# ^- Y
* e3 j) T8 |% D) `( X
/ ~7 K% y# {4 D, J+ V2 Y& `0 ~! Z% `. p8 P+ k

6 {' E6 C) y+ }, PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ ?* U$ Q7 N; c. j8 u. s4 x
% I7 V9 K0 }$ i, ~
# H4 ^2 p- \1 Q% x8 G! R

0 g3 y% D# ~6 i& l% J5 U
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 06:12 , Processed in 0.035926 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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