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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
) g. Z3 B$ R" G核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# {9 k6 P/ ]% ~) F这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 c8 ~! \) i% a  \, A% E* [/ I) u; \. Z$ A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# v6 m/ O' b7 K, i+ B

+ W) S- j! {! X2 B* D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
& k% _# a# K/ ]; m: j3 m3 m# m/*8 y8 v# ^) c- a" K' w* B
* Check memory range for valid RAM. A simple memory test determines( D# N0 R. p( Z8 B2 T; `! N1 w
* the actually available RAM size between addresses `base' and
7 t! t  `* C4 x* `base + maxsize'.: I7 K$ y: r; n: l. G: @) u
*/
1 }. _. ~/ p! w% clong get_ram_size(long *base, long maxsize)
- x& I" O, J$ C. i) T( Y{" ?. C' h! o$ Y- f- I% ^) W
        volatile long *addr;
# t+ i0 s' g) r. i        long           save[32];" p! B: L( @; p- [
        long           cnt;% X; x9 Q: A  M0 X8 s: B
        long           val;- Z5 O4 L7 A/ L; w# b
        long           size;
* x# G% ]) u6 h( m        int            i = 0;8 y" k( T" V' }8 @  q. ~' u* t% n/ R

9 j% q8 G& [5 t  Q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
: _7 K! O7 ]& Q8 I) o                addr = base + cnt;        /* pointer arith! */$ E! m) _1 k# w! c! ~
                sync ();
2 f. F' y) z, s3 ~! e. J$ W                save[i++] = *addr;2 f. {0 }8 H( `# n3 n9 E, I
                sync ();4 r- W4 P& {4 l8 k# w
                *addr = ~cnt;% y; k" q! F' {6 ?
        }  Y8 C, w2 A6 \4 G9 a( Z/ K
( I7 a' a( h7 V' E4 T0 b7 _& T
        addr = base;: N1 e+ V! i+ R& ^% t
        sync ();
% Z/ ?; N8 `+ E& Y7 g/ d1 W' t        save = *addr;- i# D/ D- y# {3 o
        sync ();$ S) R! ~7 A5 ]
        *addr = 0;) u: ?! n0 _7 r0 L: s

" t9 ?$ D& l/ d        sync ();
  Y+ n! d8 h3 y+ [        if ((val = *addr) != 0) {, v$ o5 ^" w+ j4 w; p8 f
                /* Restore the original data before leaving the function.( q) ^$ U& j; S" {2 z
                 */
1 q3 a& ^0 d) e. K4 x* c$ M                sync ();+ v' G" f1 l3 |+ h
                *addr = save;
- ^! F  q3 ~  Q# ?/ q3 \                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 \/ ?0 S! [, |6 ^; F# |# ?; G+ D
                        addr  = base + cnt;7 U3 H* p9 o" {& ^
                        sync ();
. i! M4 ]: R& g+ ]+ C                        *addr = save[--i];
7 e- z6 m  T  }$ T, P& k, M% F                }$ n: Y* {$ V: r" z- G/ K* u
                return (0);
; z  O2 l& k# t$ i3 ~' a& P3 C        }
) V# k! v! @' |5 `: K3 u6 s. V* g' n# C- N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" k9 j  Q. O8 _! w                addr = base + cnt;        /* pointer arith! */3 g! T" t  B, d- T9 R0 j" ?
                val = *addr;
! ?2 ~& U  _" R( I' u# \! e                *addr = save[--i];
  x+ y, A7 u# }; s% c8 r7 ]' {5 w                if (val != ~cnt) {' L: z. _* z' k+ t3 |
                        size = cnt * sizeof (long);
- c5 c) ^! a) r; }4 ~: E7 B  Y! G1 ?6 t                        /* Restore the original data before leaving the function.+ i; N/ @2 m3 V0 \  a
                         */
) H8 k4 r' m7 O! T/ A4 L: M8 d- I                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' Z! K5 |* L8 f' I. F/ t
                                addr  = base + cnt;
" b- u/ {" w( R# Z8 ]& t/ R                                *addr = save[--i];4 Y! _0 g7 Q& S  M" b
                        }
7 R0 b0 D' e6 L0 J                        return (size);
" F0 u: \, M9 C0 h! b; z                }5 b. ?( u0 z$ j, j
        }
5 S: K4 M/ C# s5 [; m1 c: N! r: q9 B/ ^
        return (maxsize);) a9 q9 L% Y+ H$ T
}& o% \6 [& K% Z  b* O8 k1 t
int dram_init(void)- w. g3 J( @4 }" Q
{
' J; A% x& N- O: _: d. @        /* dram_init must store complete ramsize in gd->ram_size */
" a$ ~! k7 g' M! t7 x, y- t        gd->ram_size = get_ram_size(9 i. ]+ [, \2 I; T$ w
                        (void *)CONFIG_SYS_SDRAM_BASE,
- `$ |$ a& I8 s  n: o" v9 n                        CONFIG_MAX_RAM_BANK_SIZE);
! o" z0 X: v' r% D' N0 _        return 0;
: @: z  F- R8 \8 h}
  E, M/ B% B6 i' y9 s# |: s  B0 e8 Q" `5 E, z8 l! d

  P) s$ ?2 L3 j) J" n% Y3 o
0 y7 a% k) U& }) N+ y. ?0 u8 q% k4 Z4 J6 G' @) N: s& f' z" x( V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- X6 P. X5 O+ Z/ A" T6 j1 L/ |  [4 b$ v) q( g+ ?5 b& d

& A% @7 [  b' T" o
1 q, X6 x* E% c1 y" x9 m# s
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-2 15:13 , Processed in 0.039846 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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